0

私はJSONPで遊んでいます。私は(多分)概念を理解していますが、実装については少し遅れています。

私が持っているのは、URL文字列からXML結果を生成するWebサーバーです。私が調査したように、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 < 
4

2 に答える 2

1

jsonp要求しているサービスによってサポートされている必要があります。そうでない場合、SOPはまったく役に立ちません。クロスオリジンリクエストを作成する場合は、jsonpを使用するだけであるという誤解があります。jsonpCORSも)は、プロバイダーがユーザーがSOP制限なしでコンテンツを取得できるようにする方法であり、同一生成元ポリシーをバイパスする方法ではありません。

于 2013-03-05T16:29:45.357 に答える
0

プロキシを設定して、xml / html / soap / whateverを文字列化し、コールバックでラップすることができます。

これはcgiシェルスクリプトを使用した例です(javascriptをサポートするブラウザーの99.9%がgzipもサポートしているため、常に出力を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+ "?callback =" + callBackName + "&" + urlを設定し、文字列を処理するようにコールバックを設定します。

jsonデータでも同じことができますが、エスケープはそれほど複雑ではありません。

于 2013-03-10T03:32:54.567 に答える