4

我正在使用Apache HttpClient发送一个 RESTful JSON POST 请求(到第 3 方 API)

  • 我应该对 JSON 正文进行 URL 编码吗?

  • 如果内容中的某些内容已经经过 URL 编码(例如,我发送的 HTML 包含一些带有 URL 编码字符的链接,例如 @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

您必须在这里担心两种情况:

  1. JSON
    你必须确保你生成的 JSON 是有效的 JSON (duh)。这意味着确保所有{ }and[ ]语法都在正确的位置,并确保您插入 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 的特殊字符(例如“/”)。

您也不必担心内容中的链接被解码,除非您在 http 标头中使用 Content-Type 建议服务器应该解码正文,例如 application/x-www-form-urlencoded

于 2012-06-01T17:03:54.220 回答