0

で完全に機能する次のリクエストがありますが、jQuery の関数ファミリーでは機能curlしません。jQuery.ajax

curl -v -s -X GET -d 'matching[][name]=ottensen' http://localhost:3000/locations

トリックは、matching[][name]=ottensen. これは、アプリケーション サーバーによって解釈されると、次のようになります。

params: { "matching" => [{"name" => "ottensen"}] }

つまり、ハッシュの配列を渡しました。

curl構文は奇妙に見えますが、かなり広くサポートされています。

jQuery(最新)で次のことを試しました:

$.ajax({
    url: 'http://localhost:3000/locations',
    data: {
        "matching": [{
            "name": "ottensen"
        }]
    })
})   

そして、他のさまざまな複雑な組み合わせ、残念ながら jQuery.serialize はうまく機能しませんが、ドキュメントには次のように記載されています:

注: param 文字列について広く合意された仕様がないため、このような入力をサポートするすべての言語で理想的に機能する方法で、この方法を使用して複雑なデータ構造をエンコードすることはできません。その時まで、$.param メソッドは現在の形式のままです。

提案された回避策がいくつか提案さJSON.stringify(obj)れていますが、API は既存のクライアントにアクセス可能なままにしておく必要があり、JSON を受け入れるように変更することはできません。変更する必要はありません。これは多くの Rack アプリでサポートされており、一部のようです。一種の標準 (おそらく事実上の標準にすぎない) の例を次に示します (概して、期待どおりに動作するように見えますが、バックエンド サーバーを変更することはできません)。

$.ajax({
    url: 'http://localhost:3000/locations',
    data: JSON.stringify({
        "matching": [{
            "name": "ottensen"
        }]
    }),
    contentType: 'application/json',
    dataType: 'json'
})

質問:したがって、私の質問は、jQuery が実行中のサーバーに同じことを送信するにはどうすればよいcurlですか?

サイドノート (サーバー側の回避策):サーバーにはこの魔法のコード行があり、これは本当に悲しいことです: matching = params.fetch(:matching); matching = Array(matching.values) if matching.is_a?(Hash)、これは今のところ機能する回避策ですが、コード全体でそれを複製する必要はありません。

渡された jQuery スタイル オブジェクトを修正するために Rack ミドルウェアを実装することを検討したことも注目に値します。そのため、それらは Rails で期待どおりに動作します (つまり、そのように見える jQuery リクエストからパラメータを書き直して修正します)。 Rails アプリケーションは、何が起こったかを知りません)

4

0 に答える 0