2013-03-05 103 views
0

我正在玩JSONP。我理解(也許)這個概念,但在實現方面稍微落後。返回XML時的JSONP數據類型

我已經是一個Web服務器,從一個URL字符串,產生一個XML結果。正如我所研究的,JSONP應該解決跨域問題,但預期的返回數據仍然是JSON數組。因此,如果服務器正在返回XML,那麼如何讓我的ajax腳本識別並能夠解析它?

這裏是我的代碼:

var usdaurl = 'http://eligibility.sc.egov.usda.gov/eligibility/eligibilityservice?eligibilityType=Property&requestString=<?xml version="1.0"?><Eligibility xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="/var/lib/tomcat5/webapps/eligibility/Eligibilitywsdl.xsd"><PropertyRequest StreetAddress1="'+street+'" StreetAddress2="" StreetAddress3="" City="'+city+'" State="'+state+'" County="" Zip="'+zip+'" Program="RBS"></PropertyRequest></Eligibility>'; 
var clbk = function(xml){ 
      var usda = $('Property').attr('Eligibility'); 
     }; 

$.ajax({ 
    url: usdaurl, 
    dataType: 'jsonp', 
    jsonpCallback: 'clbk' 
}); 

另外,我得到的錯誤是從XML性反應的一個未識別的字符。

Uncaught SyntaxError: Unexpected token < 

回答

1

jsonp必須由您從請求服務的支持,否則SOP將完全無用。有這樣的誤解,如果你想創建一個跨域請求,你只需使用jsonp。 jsonp(也是CORS)是供應商允許用戶在沒有SOP限制的情況下獲取他們的內容的一種方法,它不是任何人只通過相同原產地策略的方式。

0

您可以設置一個代理stringize的XML/HTML/SOAP /不管在回調包裹。

下面是一個使用CGI shell腳本(我有它總是使用gzip壓縮的輸出,因爲支持JavaScript的瀏覽器的99.9%,也支持gzip)

#!/bin/sh 
CB=${QUERY_STRING%%&*} 
URL=${QUERY_STRING#*&} 
case "$CB" in 
    callback=*) 
     printf "Content-Encoding: gzip\nContent-type: application/javascript\r\n\r\n" 
     while ([ ! "$ONCE" ]) do 
      printf "${CB##*=}(\"" 
      wget --no-check-certificate -U "NetSurf/2.9 (Linux; i686)" -T 20 -O - "$URL" \ 
       | tr -c [\ -~] " " |sed 's/[\]/\\\\/g;s/["]/\\"/g' 
      printf "\")" 
      ONCE=1 
     done | gzip -9fc 
    ;; 
    *)exit;; 
esac 

下面一個例子是一個示例使用假設你的服務器是在本地主機和腳本位於/cgi-bin/xml2jsonpgz.cgi(busybox的httpd的典型位置)它使用回調中的返回字符串將整個URI嵌入到<div>標記中,但是您可以在DOM中獲取做你想做的事。

<html><head><title>test</title></head><body><div id="notaniframe"></div> 
<script> 
    function dummy(data){alert(data);document.getElementById("notaniframe").innerHTML=data} 
    Loaded=0 
    setTimeout(function(){if(!Loaded)alert("load failed")},30000); 
</script> 
<script onload='Loaded=1;alert("loaded")' src="http://localhost/cgi-bin/xml2jsonpgz.cgi?callback=dummy&http://stackoverflow.com"></script> 
</body></html> 

基本用法是:設置src = urlOfCgiScript + + + callBackName 「&」 +網址 和建立回調來處理字符串 「回調=?」。

你可以用json數據做同樣的事情,但是轉義較少。