HttpClient.PostAsync总是返回404
本文关键字:返回 PostAsync HttpClient | 更新日期: 2023-09-27 18:19:16
我有一个Xamarin。表单应用程序试图将数据发布到Web API。Web API 2 &MVC) .
我遇到的问题是,我的HttpResponse总是返回404 -即使我知道应用程序可以连接到服务器。(获取数据是好的,发布不是。)
Xamarin代码:(客户端-忽略方法的返回类型,我已经删除了很多业务逻辑!)
//Method that passes the route and param to getChartData()
private BarChartModel getChartData ()
{
string postData = JsonConvert.SerializeObject (this);
string chartData = FRAPI.GetDataWithData ("BARCHART/GETBARCHART/", postData);
return JsonConvert.DeserializeObject<BarChartModel> (chartData);
}
//method that connects to the web api.
public static string GetDataWithData (string route, string data)
{
using (var client = new HttpClient ())
{
client.BaseAddress = new Uri (APIRoot);
var content = new StringContent (data, System.Text.Encoding.UTF8, "application/json");
HttpResponseMessage response = client.PostAsync (route, content).Result;
if (response.IsSuccessStatusCode)
{
response.EnsureSuccessStatusCode ();
}
else {//blah}
}
}
API -服务器端代码:
[HttpPost]
[Route("api/BarChart/GetBarChart/{data}")]
public HttpResponseMessage GetBarChart(string data)
{
try
{
BarChart barChart = JsonConvert.DeserializeObject<BarChart>(data, GlobalSettings.JsonSettings);
return Request.CreateResponse(HttpStatusCode.OK, "true");
}
catch (Exception ex)
{
return Request.CreateResponse(HttpStatusCode.BadRequest, ex.Message);
}
}
路由配置:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
值得一提的是,我已经尝试了许多服务器端代码的变体,包括:
- 从路由中移除
{data}
部分。(下面的教程有一个类似的路线,不包括路线。) - 方法签名中包含
[FromBody]
标签
从我所看到的,我的代码实际上与本教程中的resgisterUser
代码没有什么不同(除了对象名称)。
提前感谢!
您的代码和示例之间的唯一区别是您的代码接收您试图反序列化的string
。你应该让ASP。Net为您做反序列化。换句话说,像这样修改代码:
[HttpPost]
[Route("api/BarChart/GetBarChart")]
public HttpResponseMessage GetBarChart(BarChart barChart)
{
try
{
Debug.WriteLine(barChart);
// do something useful with the barChart...
return Request.CreateResponse(HttpStatusCode.OK, "true");
}
catch (Exception ex)
{
return Request.CreateResponse(HttpStatusCode.BadRequest, ex.Message);
}
}
和ASP。Net将请求的主体反序列化为BarChart
(前提是你发送一个与BarChart
类型匹配的json)。
顺便说一下:将方法命名为GetBarChart
,而实际上是POST
-ing,这有点误导。