3

Webサービスからデータをロードしてグラフを表示する責任があるHighChartsクライアントがあります。データを要求する関数は次のようになります。

function requestData() {
    $.ajax({
        url:  'http://myhost.com/type?x=1&y=2&z=3',
        headers: { 
          Accept : "application/json"
        },
        type: "GET",
        dataType: "json",
        success: function(data) {
          //do something
        },
        cache: true
    });
}

(将来、urlプロパティは動的に生成されます)

ターゲットWebサービスは読み取り専用であり、Flaskマイクロフレームワークを使用して実装されます。その目的は、JSONデータをHighChartsクライアントに返すことです。これは、データ要求を処理するFlaskビュー(関数)です。

@app.route('/<type>')
def get_data(type):

    x = request.args.get('x','')
    y = request.args.get('y','')
    z = request.args.get('z','')

    [...]

問題:ChromeでJavaScriptコードを実行すると、次のHTTPリクエストがWebサービスに送信されます。

GET /type?x=1&amp;y=2&amp;z=3 HTTP/1.1  // '&' have been escaped to '&amp;'
Host: myhost.com
Connection: keep-alive
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11
Accept: application/json
Referer: http://myhost.com/chart.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

...サーバーから404ステータスコード(Bad Request)を取得します。これは完全に良好であり、リクエストのクエリパラメータの1つ以上がnullまたは不正な形式である場合は常に期待されます。

HTTP/1.0 400 BAD REQUEST
Content-Type: text/html; charset=utf-8
Content-Length: 16
Server: Werkzeug/0.8.3 Python/2.7.3
Date: Wed, 14 Nov 2012 10:23:49 GMT

Flask Webサービスでデバッグした後、xクエリパラメータ(HTTPリクエストで最初に指定されたものであることに注意してください)のみが正しく解析されy、はzempy文字列であることに気付きました。これにより404が発生します。

なぜそれが起こっているのですか?&->&amp;エスケープに関する文字セットの不整合はありますか?

おかげで、どんなヒントも本当に助けになるでしょう(もっとスペックやコードが必要かどうか尋ねてください)

4

1 に答える 1

2

エラーは、エスケープされたアンパサンドを期待したとおりだと思います。

これを試して:

function requestData() {
    $.ajax({
        url:  'http://myhost.com/type',
        headers: { 
          Accept : "application/json"
        },
        data: {
            x: 1,
            y: 2,
            z: 3
        },
        type: "GET",
        dataType: "json",
        success: function(data) {
          //do something
        },
        cache: true
    });
}
于 2012-11-14T11:03:15.300 に答える