我需要使用 POST 请求向服务器发送一些 JSON 值;在没有任何转义的情况下发送它们可以正常工作,但这不是一个正确的解决方案,因为这些值可能包含特殊符号,例如?和 &。
我已经尝试了其他问题的答案(Uri.EscapeDataString、Uri.EscapeUriString、System.Net.WebUtility.UrlEncode、System.Web.HttpUtility.UrlEncode),但它们都使服务器返回“错误请求”错误。
如何正确转义 POST 值?
经过我们在评论中的小聊之后,我想我对您要提出的问题有足够的了解,以便整理出答案。所以就到这里了。
我看到有人问了三个略微不同的问题。
POST
请求的正文?我将引用我对此的评论,因为它非常完整。
HTTP 请求正文(POST 或其他)只是字节,其长度由 Content-Length 标头(或类似的东西,如果正在使用分块编码)确定。你不必担心任何被转义的事情,转义只会在下一个级别发挥作用,内容类型。
本质上,对于普通 POST 进行的任何类型的转义都没有本机要求。
application/json
和application/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)
如您所见,该值变得非常混乱。但你明白了。
所以,是的,您可以相当合理地将一个嵌套在另一个中,但是没有多少用例是有意义的。
如果您正在使用库,那么该库应该(如果它值得的话)为您执行此操作。例如,JSON.net 会。我相信您唯一需要担心转义的是 JSON 中的双引号,但我不是专家,知道存在边缘情况也不会让我感到惊讶。
我将再次引用我的评论,因为它似乎对您有所帮助。
在大多数现代 API 中(“大多数”和“现代”在那里有待解释),JSON 是一个非常合理的期望,是的。那么我们回到我的第一条评论,并说您真的只需要担心在 JSON 元素本身中进行转义,如果您使用的是库,则应该为您处理。出于显而易见的原因,您绝对不想进行双重编码。
当然,测试整个设置的快速方法只是尝试提交常规数据(控件)并确保其有效,然后提交一些带有双引号的内容,如果需要,还可以添加问号。
如果您运行该测试并且第二次失败,则很有可能某些内容没有被属性转义。这可能是使用调试工具,甚至只是像 Fiddler 这样的应用程序来检查请求负载是否有任何不合理之处的好时机,例如,如果您的 JSON 看起来像{ "name":"val"ue" }
归档时间: |
|
查看次数: |
8103 次 |
最近记录: |