我正在尝试从我的ASP.NET Core Web API项目发送POST请求,但请求永远不会发送。该方法执行时没有错误,但请求永远不会从异步方法发出。
我的实施:
public async void notify(String message)
{
String url = "MY_WEBSERVICE_URL";
var client = new HttpClient();
client.BaseAddress = new Uri(url);
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "relativeAddress");
request.Content = new StringContent("application/x-www-form-urlencoded;charset=UTF-8",
Encoding.UTF8, "application/json");
Byte[] byteArray = Encoding.UTF8.GetBytes("{\"text\":\"" + message + "\"}");
request.Content.Headers.ContentLength = byteArray.Length;
await client.SendAsync(request).ContinueWith(responseTask =>
{
Console.WriteLine("Response: {0}", responseTask.Result);
});
}
这是从Core Web API项目发出POST请求的正确方法吗?提前谢谢
答案 0 :(得分:1)
首先,HttpClient
类(甚至PostAsync
扩展名)中有一个专用方法PostAsJsonAsync
,您可以使用该方法发送POST请求而不创建HttpRequstMessage
手动
现在关于你的代码 - 我相信你想发布以下JSON字符串:
{"text":"someMessage"}
您应该将此字符串设置为您要发送的StringContent
内容:
var json = "{\"text\":\"" + message + "\"}";
request.Content = new StringContent(json, Encoding.UTF8, "application/json");
目前,您正尝试将mediatype字符串作为值发布到API端点。当然,它无法反序列化到您的模型中。
注1: StringContent
会自动添加具有相应值的Content-Length
标头。你不应该手动这样做。
注2:除非这是一个事件处理程序,否则不应使用async void
- 请改用async Task
。
PostAsJsonAsync
用法的相同任务如下:
public async Task Notify(string message)
{
var string url = "MY_WEBSERVICE_URL";
var client = new HttpClient();
client.BaseAddress = new Uri(url);
var notification = new Notification { Text = message }; // use some model class
var resonse = await client.PostAsJsonAsync("relativeAddress", notification);
if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();
}
}
在这种情况下,您的模型将自动序列化为JSON,将创建相应的内容并发送POST请求。