![](/img/trans.png)
[英]Trying to reach API using Content-Type application/x-www-form-urlencoded
[英]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"));
这里有一些链接帮助我MSDN , ASCII 编码参考
我最近在使用 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.