我尝试用一种方法调用我的API,但出现错误:{StatusCode:415,ReasonPhrase:“不支持的媒体类型”。我一直在环顾四周,发现很多人都遇到了同样的问题,但是在创建StringContent时通过添加媒体类型已解决了该问题。我已经设置了字符串内容,但仍然出现错误。
这是我尝试调用API的方法:
[HttpGet]
public async Task<ActionResult> TimeBooked(DateTime date, int startTime, int endTime, int id)
{
var bookingTable = new BookingTableEntity
{
BookingSystemId = id,
Date = date,
StartTime = startTime,
EndTime = endTime
};
await Task.Run(() => AddBooking(bookingTable));
var url = "http://localhost:60295/api/getsuggestions/";
using (var client = new HttpClient())
{
var content = new StringContent(JsonConvert.SerializeObject(bookingTable), Encoding.UTF8, "application/json");
var response = await client.GetAsync(string.Format(url, content));
string result = await response.Content.ReadAsStringAsync();
var timeBookedModel = JsonConvert.DeserializeObject<TimeBookedModel>(result);
if (response.IsSuccessStatusCode)
{
return View(timeBookedModel);
}
}
还有我的API方法:
[HttpGet]
[Route ("api/getsuggestions/")]
public async Task<IHttpActionResult> GetSuggestions(BookingTableEntity bookingTable)
{
//code
}
我一直在使用相同的代码来调用我的其他方法,除了这种情况外,它一直运行良好。我不明白他们之间的区别。
这是一个示例,其中我使用基本相同的代码,并且可以正常工作。
[HttpGet]
public async Task<ActionResult> ChoosenCity(string city)
{
try
{
if (ModelState.IsValid)
{
var url = "http://localhost:60295/api/getbookingsystemsfromcity/" + city;
using (var client = new HttpClient())
{
var content = new StringContent(JsonConvert.SerializeObject(city), Encoding.UTF8, "application/json");
var response = await client.GetAsync(string.Format(url, content));
string result = await response.Content.ReadAsStringAsync();
var bookingSystems = JsonConvert.DeserializeObject<List<BookingSystemEntity>>(result);
var sortedList = await SortListByServiceType(bookingSystems);
if (response.IsSuccessStatusCode)
{
return View(sortedList);
}
}
}
}
catch (Exception ex)
{
throw ex;
}
return RedirectToAction("AllServices");
}
和API:
[HttpGet]
[Route("api/getbookingsystemsfromcity/{city}")]
public async Task<IHttpActionResult> GetBookingSystemsFromCity(string city)
{
//code
}
答案 0 :(得分:1)
您正在将没有body参数的body发送到get请求中。您只能在url或查询字符串中传递参数。
第二个查询成功,因为您已在网址中传递了城市。
如果要在请求正文中传递复杂的对象,或者将复杂的对象分离为参数并通过url传递,则需要将第一个查询切换为发布请求。
答案 1 :(得分:1)
Web API希望客户端指定Content-Type
标头,但是在发出HttpClient
请求时不能为GET
指定此标头,因为它没有正文。即使您在application/json
中指定了StringContent
,您仍将对象错误地传递给了请求。考虑使用POST
来解决您的问题,并考虑使用POST
来转移复杂的对象。
更新api以接受POST
[HttpPost]
[Route ("api/getsuggestions/")]
public async Task<IHttpActionResult> GetSuggestions(BookingTableEntity bookingTable)
更新请求代码
var content = new StringContent(JsonConvert.SerializeObject(city), Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, content);
string result = await response.Content.ReadAsStringAsync();
注意
不要在每个请求上放置HttpClient
,而应该是reused。