4

ApacheHttpClientを使用してRESTfulJSONPOSTリクエストを送信しています(サードパーティのAPIに)

  • JSON本文をURLエンコードする必要がありますか?

  • また、コンテンツ内の何かがすでにURLエンコードされている場合(たとえば、URLエンコードされた文字とのリンクを含むHTMLを送信する場合、たとえば@ 22)、デコードせずに反対側のコンテンツをそのまま取得することを期待する必要がありますか?

たとえば、私がこのようなことをしている場合

String html = "<a href='http://example.com?charOfTheDay=%22'>click me</a>";
// Build the JSON object 

JSONObject jsonObj = new JSONObject();
jsonObj.put("html", html);
jsonObj.put("otherKey",otherValue);
//...

// Create the POST object and add the parameters
HttpPost httpPost = new HttpPost(url);
StringEntity entity = new StringEntity(jsonObj.toString(), HTTP.UTF_8);
entity.setContentType("application/json");
httpPost.setEntity(entity);
HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(httpPost);

「html」キーの値を取得した後、受信側で同じ値を取得することを期待する必要がありますか?

例:受信側

//after parsing the request string to a JSON object
String html = inputJsonObject.get("html") 
// should return "<a href='http://example.com?charOfTheDay=%22'>click me</a>"

送信するものが「現状のまま」受信されるものであることを確認するために必要な他の手順はありますか?

4

2 に答える 2

3

ここで心配しなければならない2つのコンテキストがあります。

  1. JSON
    生成するJSONが有効なJSONであることを確認する必要があります(duh)。これは、すべての{ }構文[ ]が正しい場所にあることを確認し、JSONオブジェクトに挿入しているフィールド値が安全にエスケープされていることを確認することを意味します(質問でそのHTMLスニペットをエスケープするなど-引用文字の一部はエスケープされます)。 ただし、標準のJSON Javaライブラリを使用しているため、これについて心配する必要はありません...これですべてが処理されます。

  2. HTTP
    次に、JSON文字列をHTTPリクエストの本文に挿入する必要があります。ここでエスケープを行う必要はありません。生のJSON文字列を挿入するだけです。HTTPは、プロトコルとして、生のバイナリデータを含む要求/応答本文内のすべてを受け入れます。

とにかく長かったですが、お役に立てば幸いです。

于 2012-06-01T18:16:46.520 に答える
1

httpヘッダーのContent-Typeはapplication/jsonである必要があるため、httpリクエストの本文をURLエンコードしないでください。

URLエンコードは、ユーザーがURLを表すのに特別な文字(「/」など)を使用できないようにすることを目的としています。

アプリケーション/x-www-form-urlencodedなど、サーバーが本文をデコードする必要があることを示唆するContent-Typeをhttpヘッダーで使用しない限り、デコードされるコンテンツ内のリンクについても心配する必要はありません。

于 2012-06-01T17:03:54.220 に答える