繁体   English   中英

无法使用 Headers[“Content-Type”] = “application/x-www-form-urlencoded” 在我的 WebClient UploadString 中编码我的 JSON 对象

[英]Unable to encode my JSON object inside my WebClient UploadString using Headers[“Content-Type”] = “application/x-www-form-urlencoded”

我正在开发 ASP.Net MVC 4 Web 应用程序,我需要将 JSON 对象发布到第三部分 API。 现在我需要通过将内容类型设置为application/x-www-form-urlencoded来编码我的 JSON 数据,如 API 文档中所述。 所以我通过将Content-Type指定为wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";来尝试以下wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";

var data = JsonConvert.SerializeObject(mainresourceinfo); 
using (WebClient wc = new WebClient()) 
{
    string url = currentURL + "resources?AUTHTOKEN=" + pmtoken;
    Uri uri = new Uri(url);

    //  wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
    wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";

    crudoutput = wc.UploadString(uri, "INPUT_DATA=" + data);
}

但仍然没有对数据进行编码..如果我在我的 JSON 字符串中发送一个诸如123%456的值,它将在第三部分系统中保存为123E6t 现在作为一种解决方法,我在将 JSON 对象发送到第 3 部分 API 之前使用WebUtility.UrlEncode(data)对其进行了手动编码,我可以看到123%456等值将被正确保存......但我没有想要手动编码数据,我想设置内容类型以指定编码......这可能吗?

使用

wc.Headers["Content-Type"] = "application/json"

并尝试设置字符集

wc.Encoding = Encoding.UTF8;
crudoutput = wc.UploadString(uri, "INPUT_DATA=" + Encoding.UTF8.GetString(data));

Charset指定文档的字符编码。 HTTP 1.1默认字符集是 ANSI,因为 ANSI 与ISO-8859-1相同。
默认情况下, WebClient.Encoding设置为Encoding.Default ,这意味着您获得 ANSI 代码页。 所有默认编码都会丢失数据,因此,您可以改用 UTF-8。

因此,如果设置 charset 并不意味着所有内容都必须编码为 Unicode,而是意味着这些文档只能包含由 Unicode 定义的字符。 这意味着您还需要将内容保存为 UTF-8。 在这种情况下,您可以使用Encoding.UTF8.GetString()

试试这个:

                using (var client = new WebClient())
            {
                string url = "URL";
                client.Headers[HttpRequestHeader.ContentType] = "application/json";
                client.Encoding = System.Text.Encoding.UTF8;
                string serialisedData = JsonConvert.SerializeObject(data);
                string response = client.UploadString(url, serialisedData);
            }

您可以使用WebClient.UploadValues(Uri, NameValueCollection)方法。 它会自动为你做所有的事情。 您甚至不需要指定Content-Type标头,因为它默认发送Content-Type: application/x-www-form-urlencoded

下面是一个例子:

var data = JsonConvert.SerializeObject(mainresourceinfo); 
using (WebClient wc = new WebClient()) 
{
    string url = currentURL + "resources?AUTHTOKEN=" + pmtoken;
    Uri uri = new Uri(url);

    var body = new NameValueCollection
    {
        { "INPUT_DATA", data }
    };
    crudoutput = wc.UploadValues(uri, body);
}

这就是我如何实现我的 post 方法

public static string Post(Exchange exchValues, string url)
{
  WebClient wc = new WebClient();
  wc.Encoding = Encoding.UTF8;
  wc.Headers[HttpRequestHeader.ContentType] = "application/json";
  return wc.UploadString(url, "POST", Json.Stringify(exchValues));
}

这发送了 123%456 并且数据没有转换为 123%456,我使用 ASP.net Web API,Json.Stringify 使用 .net Json 序列化

当我尝试使用 GET 方法时,我也面临同样的问题,密码参数包含 % 字符,Api 继续对其进行解码,因此 123$45 解码为 123E6,因此我只需将 % 替换为 %25 就可以了

HttpUtility.UrlDecode("123%456".Replace("%","%25")); 

这里有一些链接帮助我MSDNASCII 编码参考

我最近在使用 3rd 方 API 时遇到了同样的问题。 我花了一段时间才找到解决方案,这里已经给出的所有其他答案看起来很像我尝试过但没有用的东西。 对我有用的是 UploadDataAsync。 在我的情况下,将 json 字符串发送到 API 时,特殊字符(é、ü、ã 等)会导致错误。

using (WebClient client = new WebClient())
{
    client.Headers.Add(HttpRequestHeader.ContentType, "application/json");
    client.Headers.Add(HttpRequestHeader.Accept, "application/json");
    client.UploadDataAsync(new Uri(apiUrl), "POST", Encoding.UTF8.GetBytes(jsonString));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM