使用.NET HttpClient向WebAPI服务器发送json
本文关键字:json 服务器 WebAPI NET HttpClient 使用 | 更新日期: 2023-09-27 18:21:45
我正在尝试使用HttpClient
通过POST向我的Web服务发送json。
发送方法非常简单:
HttpClient _httpClient = new HttpClient();
public async Task<HttpStatusCode> SendAsync(Data data)
{
string jsonData = JsonConvert.SerializeObject(data);
var content = new StringContent(
jsonData,
Encoding.UTF8,
"application/json");
HttpResponseMessage response = await _httpClient.PostAsync(_url, content);
return response.StatusCode;
}
在服务器端,我有以下方法的WebAPI控制器:
[HttpPost]
[ActionName("postdata")]
public async Task<HttpResponseMessage> PostData([FromBody] string jsonParam)
{
/// here the jsonParam is null when receiving from HttpClient.
// jsonParam gets deserialized, etc
}
此方法中的jsonParam是null
。jsonData
很好,如果我将其复制并粘贴到请求发件人(我使用Postman)中,一切都会成功。
这是关于我如何构建内容和使用HttpClient
,但我不知道出了什么问题。
有人能看到这个问题吗?
由于您正在尝试POST json,因此可以添加对System.Net.Http.Formating的引用并直接发布"Data",而无需序列化它并创建StringContent。
public async Task<HttpStatusCode> SendAsync(Data data)
{
HttpResponseMessage response = await _httpClient.PostAsJsonAsync(_url, content);
return response.StatusCode;
}
在接收端,您可以直接接收"数据"类型。
[HttpPost]
[ActionName("postdata")]
public async Task<HttpResponseMessage> PostData(Data jsonParam)
{
}
关于这些HttpClientExtensions方法的更多信息可以在这里找到-http://msdn.microsoft.com/en-us/library/hh944521(v=vs.118).aspx
当发布单个简单类型时,您需要在帖子正文上使用特殊语法:
=postBodyText
您必须将Content-Type
更改为application/x-www-form-urlencoded
。
参考:http://www.asp.net/web-api/overview/advanced/sending-html-form-data,-第1部分#sending_simple_types
对于初学者来说,这应该有效:
public async Task<HttpStatusCode> SendAsync(Data data)
{
string jsonData = string.Format("={0}", JsonConvert.SerializeObject(data));
var content = new StringContent(
jsonData,
Encoding.UTF8,
"application/x-www-form-urlencoded");
HttpResponseMessage response = await _httpClient.PostAsync(_url, content);
return response.StatusCode;
}
或者,您可以在控制器中接收复杂类型而不是字符串。
[HttpPost]
[ActionName("postdata")]
public async Task<HttpResponseMessage> PostData(Data data)
{
// do stuff with data: in this case your original client code should work
}