如何正确转义 POST 正文?

use*_*528 3 .net c# http

我需要使用 POST 请求向服务器发送一些 JSON 值;在没有任何转义的情况下发送它们可以正常工作,但这不是一个正确的解决方案,因为这些值可能包含特殊符号,例如?和 &。
我已经尝试了其他问题的答案(Uri.EscapeDataString、Uri.EscapeUriString、System.Net.WebUtility.UrlEncode、System.Web.HttpUtility.UrlEncode),但它们都使服务器返回“错误请求”错误。
如何正确转义 POST 值?

Mat*_*gen 5

经过我们在评论中的小聊之后,我想我对您要提出的问题有足够的了解,以便整理出答案。所以就到这里了。

我看到有人问了三个略微不同的问题。

  1. 如何转义 HTTPPOST请求的正文?

我将引用我对此的评论,因为它非常完整。

HTTP 请求正文(POST 或其他)只是字节,其长度由 Content-Length 标头(或类似的东西,如果正在使用分块编码)确定。你不必担心任何被转义的事情,转义只会在下一个级别发挥作用,内容类型。

本质上,对于普通 POST 进行的任何类型的转义都没有本机要求。

  1. 怎么application/jsonapplication/x-www-formurl-encoded一起玩?

在大多数情况下,他们只是不这样做。他们可以,我想我以前见过它做过,但我真的想不出你为什么想要。

仅作为背景,并确保我们在同一页面上,这是同一个对象,分别序列化为 JSON 和表单数据。

普通对象(用于比较):

PropertyName: The value is "1 & 2"
OtherProperty: 2
Run Code Online (Sandbox Code Playgroud)

JSON:

{
    "PropertyName" : "The value is \"1 & 2\"",
    "OtherProperty" : 2
}
Run Code Online (Sandbox Code Playgroud)

表格数据:

PropertyName=The%20value%20is%20%221%20%26%202%22&OtherProperty=2
Run Code Online (Sandbox Code Playgroud)

如您所见,该值变得非常混乱。但你明白了。

所以,是的,您可以相当合理地将一个嵌套在另一个中,但是没有多少用例是有意义的。

  1. 我如何转义 JSON?

如果您正在使用库,那么该库应该(如果它值得的话)为您执行此操作。例如,JSON.net 会。我相信您唯一需要担心转义的是 JSON 中的双引号,但我不是专家,知道存在边缘情况也不会让我感到惊讶。

我将再次引用我的评论,因为它似乎对您有所帮助。

在大多数现代 API 中(“大多数”和“现代”在那里有待解释),JSON 是一个非常合理的期望,是的。那么我们回到我的第一条评论,并说您真的只需要担心在 JSON 元素本身中进行转义,如果您使用的是库,则应该为您处理。出于显而易见的原因,您绝对不想进行双重编码。

当然,测试整个设置的快速方法只是尝试提交常规数据(控件)并确保其有效,然后提交一些带有双引号的内容,如果需要,还可以添加问号。

如果您运行该测试并且第二次失败,则很有可能某些内容没有被属性转义。这可能是使用调试工具,甚至只是像 Fiddler 这样的应用程序来检查请求负载是否有任何不合理之处的好时机,例如,如果您的 JSON 看起来像{ "name":"val"ue" }