在Java中,在发送JSON POST时使用HttpPost(ApacheCommonsHttpClient)——我应该对主体进行URL编码吗?

在Java中,在发送JSON POST时使用HttpPost(ApacheCommonsHttpClient)——我应该对主体进行URL编码吗?,java,json,rest,url-encoding,apache-httpclient-4.x,Java,Json,Rest,Url Encoding,Apache Httpclient 4.x,我正在使用(向第三方API)发送RESTful JSON POST请求 我应该对JSON主体进行URL编码吗 如果内容中的某些内容已经是URL编码的(例如,我发送的HTML中有一些带有URL编码字符的链接,例如@22),我是否应该在不解码的情况下获得另一侧的内容 如果我在做这样的事情 String html = "<a href='http://example.com?charOfTheDay=%22'>click me</a>"; // Build the JSON

我正在使用(向第三方API)发送RESTful JSON POST请求

  • 我应该对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);
String html=”“;
//构建JSON对象
JSONObject jsonObj=新的JSONObject();
put(“html”,html);
jsonObj.put(“otherKey”,otherValue);
//...
//创建POST对象并添加参数
HttpPost HttpPost=新的HttpPost(url);
StringEntity=新的StringEntity(jsonObj.toString(),HTTP.UTF_8);
entity.setContentType(“应用程序/json”);
httpPost.setEntity(实体);
HttpClient=new DefaultHttpClient();
HttpResponse response=client.execute(httpPost);
在获得“html”键的值之后,我是否应该期望在接收端获得相同的值

e、 g.在接收端

//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>"
//将请求字符串解析为JSON对象后
字符串html=inputJsonObject.get(“html”)
//应返回“”

是否需要执行其他步骤来确保发送的内容是“按原样”接收的内容?

http头中的内容类型应为application/json,因此您不应该对http请求体进行URL编码

URL编码旨在防止用户使用表示URL的特殊字符(如“/”)


您也不必担心正在解码的内容中的链接,除非您在http头中使用的内容类型建议服务器对正文进行解码,例如application/x-www-form-urlencoded

这里有两种您必须担心的上下文:

  • JSON
    您必须确保生成的JSON是有效的JSON(duh)。这意味着要确保所有的
    {}
    []
    语法都在正确的位置,并确保插入到JSON对象中的字段值都被安全转义(就像转义问题中的HTML片段一样——一些引号字符需要转义)但是因为您使用的是标准JSON Java库,所以您不必担心这一点……它会为您解决所有这些问题

  • HTTP
    然后必须将JSON字符串插入HTTP请求体。这里不需要进行转义——只需插入原始JSON字符串。HTTP作为一种协议,将接受请求/响应体内的任何内容,包括原始二进制数据


  • 不管怎么说,这有点长,但我希望能有所帮助。

    摆脱新行字符的良好做法: