2012-04-24 22 views
35

私が使用しているサービスAPIには、要求の本体でデータを送信する必要のあるGETメソッドがあります。

身体に必要なデータは、ハイフンで区切られたIDのリストであり、潜在的に非常に大きい可能性があるため、本文に送信する必要があります。そうでなければ、ブラウザ/プロキシ/ウェブサーバーなどのチェーンのどこかにある可能性があります。注:私はサービスやAPIを制御できないので、それを変更するよう提案しないでください。

私は次のjQueryコードを使用していますが、フィドラーの要求/応答を観察しています。私は "processData"オプションをfalseに設定しても、常に送信しているデータをクエリ文字列に変換して追加しています。 ..私は、要求の本体に送信される「データ」の値を強制することができますどのように

$.ajax({ 
    url: "htttp://api.com/entity/list($body)", 
    type: "GET", 
    data: "id1-id2-id3", 
    contentType: "text/plain", 
    dataType: "json", 
    processData: false, // avoid the data being parsed to query string params 
    success: onSuccess, 
    error: onError 
}); 

誰もが知っていますか? ご協力いただきありがとうございます。

+1

{request: { ... query: { accessToken: abcfed } ... } }のように見えますか? POST/path HTTP/1.0 \ r \ n \ r \ n \ r \ n ') –

+3

あなたが尋ねていることに近い、 APIは一般的でHTTP仕様に準拠していますので、GETリクエストの本体で送信されたパラメータを受け入れるとは限りません。あなたはそれについて確かですか?便利なポストhttp:// stackoverflow。com/questions/978061/http-get-with-request-body – Nikhil

+0

基本的にこれは、人々がHTTP仕様の一部ではないと言っているので、これはできませんでした。最終的には、idをクエリー文字列に置き、結果をページングする必要があったため、長すぎることはありませんでした。私は与えられた答えを受け入れるでしょう、EndangerredMassaに感謝します。 –

答えて

30

一般に、これはシステムがGET要求をどのように使用するかではありません。したがって、あなたのライブラリを一緒にプレイすることは難しいでしょう。実際には、specは、「要求メソッドがGETまたはHEADの大文字と小文字を区別した一致である場合、データがnullの場合と同じように動作します。だから、使用しているブラウザが仕様のその部分を尊重していない限り、あなたは不運だと思います。

POST ajaxリクエストのために、自分のサーバーにエンドポイントをセットアップし、サーバーコード内のエンドポイントを本文付きのGETリクエストにリダイレクトすることができます。

身体がデータであるGET要求に絶対的に拘束されていない場合は、2つの方法があります。

データ付きのPOST:これはおそらくあなたが望むものです。データを渡す場合は、おそらく、モデルを変更しているか、サーバー上で何らかのアクションを実行していることを意味します。これらのタイプのアクションは、通常、POST要求で実行されます。

クエリ文字列データを使用してGET:データをクエリ文字列パラメータに変換し、それをサーバーに渡すことができます。

url: 'somesite.com/models/thing?ids=1,2,3' 
+3

あなたのご意見をお待ちしておりますが、両方の提案には私が述べたサービスの変更は不可能です。 –

+0

申し訳ありませんが、私はその部分を逃しました。いくつかの情報で更新されましたが、有望ではありません。 – EndangeredMassa

+4

POSTを本体でGETに変換するプロキシを追加することをお勧めします。私はこれを.NETで実装しようとしましたが、 "ProtocolViolationException"例外が発生しました。このボディにGETをサポートするユースケースではないことを明確に再強調しました。 –

-1

は、念のために誰かがまだこの質問に沿って来IST:

すべての要求で、本体のクエリオブジェクトがあります。あなたはそれを自分で解析する必要はありません。

など。あなたがGETでクライアントからaccessTokenを送信する場合、あなたはこのようにそれを行うことができます:

const request = require('superagent'); 
 

 
request.get(`http://localhost:3000/download?accessToken=${accessToken}`).end((err, res) => { 
 
    if (err) throw new Error(err); 
 
    console.log(res); 
 
});

サーバ要求オブジェクトは、「身体に」

+0

OPは 'request.body'ではなく、' request.body'を要求しています。あなたは 'POST'と言いますが、コードサンプルでは' request.get() 'を使っています。 – Danosaure

+0

うん、私は参照してください。しかし、クエリとボディの両方を使用して同じ結果を得ることができます。私は彼が要求として考えていることは非常に簡単だと考えました。 –

関連する問題