当前位置: 首页 > 面试题库 >

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

史弘博
2023-03-14
问题内容

我正在使用Apache HttpClient发送RESTful JSON POST请求(至第三方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>"

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


问题答案:

这里您需要担心两种情况:

  1. JSON
    您必须确保生成的JSON是有效的JSON(duh)。这意味着确保所有{ }and [ ]语法都位于正确的位置,并确保安全地转义插入到JSON对象中的字段值(例如,在问题中转义该HTML代码段-有些引号字符需要逃脱)。 但是,
    因为您使用的是标准JSON Java库,所以您不必为此担心……它将为您解决所有这些问题。

  2. HTTP
    然后,必须将JSON字符串插入HTTP请求正文中。此处无需转义-只需插入原始JSON字符串即可。HTTP作为协议,将接受请求/响应主体内的 任何内容
    ,包括原始二进制数据。

无论如何,这很长,但我希望它能有所帮助。



 类似资料:
  • 我想为我的网站创建一个编码的网址。例如,对于这个URL:"http://google.com/index.html" 我想通过URL编码将此URL提供给客户端。

  • 大家好! 我正试图找到一种方法,以盐和散列我的密码在Java为一个web应用程序,需要一个密码登录。 我试图使用Bouncy Castle bcrypt和scrypt类来获得salting、哈希和密码验证的方法,结果发现这两个类中都没有密码验证方法。如果我在这个评估中是不正确的,请让我知道密码验证的方法是什么或者如果我遗漏了什么。 作为另一种选择,我决定在分解并转到PDBKF2之前试用bcrypt

  • 问题内容: 默认情况下,Python 3对源代码文件使用UTF-8编码。我仍应在每个源文件的开头使用编码声明吗?喜欢 问题答案: 因为默认 值为 UTF-8,所以仅在偏离默认值时或者在依赖其他工具(例如IDE或文本编辑器)来使用该信息时,才需要使用该声明。 换句话说, 就Python而言 ,仅当您要使用不同的编码时,才需要使用该声明。 其他工具(例如您的编辑器)也可以支持类似的语法,这就是PEP

  • 问题内容: 应该使用这两种方法中的哪一种来编码URL? 问题答案: 这取决于您实际想要做什么。 encodeURI假定输入是一个完整的URI,其中可能包含一些需要编码的字符。 encodeURIComponent将对具有特殊含义的所有内容进行编码,因此可以将其用于URI的组件,例如

  • 根据RFC1738,星号(*)“可在URL内未编码使用”: 因此,只有字母数字、特殊字符“$-!*”(),”和用于保留目的的保留字符可以在URL中未编码使用。 然而,w3。org的命名和寻址材料说,星号“保留用于在特定方案中具有特殊意义”,并暗示它应该被编码。 另外,根据RFC3986,URL是URI: 术语“统一资源定位器”(URL)是指URI的子集,其除了标识资源之外,还通过描述其主要访问机制

  • 问题内容: 我已经看到许多有关使用方法的堆栈溢出问题的答案。我还看到用户在他们的评论下说“ apply很慢,应该避免”。 我已经阅读了许多有关性能的文章,这些文章解释得很慢。我还在文档中看到了关于免除apply传递UDF的便捷功能的免责声明(现在似乎找不到)。因此,普遍的共识是,应尽可能避免。但是,这引起了以下问题: 如果apply太糟糕了,那为什么在API中呢? 我应该如何以及何时使代码免费?