【问题标题】:Quote in POST content causing bad requests在 POST 内容中引用导致错误请求
【发布时间】:2021-10-04 14:02:15
【问题描述】:

我正在通过用 C# 编写的 Windows 服务向 API 发出 POST 请求,并且内容各不相同。有时,用户会使用 " 来表示英寸。这些数据必须传递给 API,但是当它自动完成时,按照我设置的方式,这会导致它在 POST 内容中结束描述字符串过早地,导致错误的请求。

例如,我可能有一个如下所示的“描述”字段:

“更换 4” 管道”

有没有办法在不退出字符串的情况下在字符串中间传递“?它可能类似于以下内容,还是我应该将“”字符替换为“英寸”这个词?我更愿意发送实际的双引号,因为我不确定他们会 always 表示它的意思是英寸。 即他们可能实际上是在引用某人的话。

        if (description.Contains("\""))
        {
            description.Replace("\"", "inch");
        }

【问题讨论】:

  • 发送POST请求时可以用反斜杠(\)转义引号
  • 你的帖子做得怎么样?大多数 API 都会为您担心这一点,但 听起来 就像您错过了编码步骤,其中 " 变为 %22,假设这是原始的 application/x-www-form-urlencoded 数据?但是:我们能否看到您实际上是如何将description 发布到服务器(以及其他任何字段)? (许多其他字符都受此影响;请不要将" 替换为%22
  • 加上如果是json或者xml body,你应该使用适当的序列化器来序列化内容并转义非法字符。
  • 这是一个 HttpRequestMessage 顺便说一句。
  • @jpb103 不要那样做。连接字符串不遵守 JSON 的正确转义规则。使用JObject 来构造主体,这将在对象被序列化时尊重字符转义。

标签: c# json string api windows-services


【解决方案1】:

答案来自@TomW...

"@jpb103 不要那样做。连接字符串不遵守 JSON 的正确转义规则。改用 JObject 构造主体,这将在对象序列化时遵守字符转义"

                JObject json = new JObject
            {
                { "account", account },
                { "description", description },
                { "abbreviation", abbreviation }
            };

帐户、描述和缩写都是动态填充的。此方法正确遵守 JSON 的字符转义规则并防止我看到的 POST 错误。谢谢汤姆!

【讨论】:

  • 请使用您问题上的编辑链接添加其他信息。 Post Answer 按钮应仅用于问题的完整答案。 - From Review
  • @Filburt:这似乎是一个提议的答案——尽管还没有一个尚未验证的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多