Я изучаю веб-API, ну пытаюсь - я наткнулся на загвоздку. Я могу опубликовать его и получить ответ, если в методе на api нет параметров, например, это работает ...
клиент
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + T.Access_Token);
var req = new HttpRequestMessage(HttpMethod.Post, "https://baseurl/api/controller/sites");
var response = await client.SendAsync(req);
if (response.IsSuccessStatusCode)
{
string result = await response.Content.ReadAsStringAsync();
List<Site_2016> sites = Library.Data.Json.FromJson<List<Site_2016>>(result);
return sites;
}
else return new List<Site_2016>();
}
API
[HttpPost]
[Route("sites")]
public async Task<IHttpActionResult> GetSites()
{
//Do stuff
return Ok(Sites);
}
Но я не могу, хоть убей, заставить его работать, когда я прохожу через некоторые параметры вот так ...
клиент
using (var client = new HttpClient())
{
Dictionary<String, String> dict = new Dictionary<string, string>();
dict.Add("identifier", instance);
dict.Add("endOfDay", IsEndOfDayOnly.ToString());
var content = new FormUrlEncodedContent(dict);
client.BaseAddress = new Uri("https://baseurl/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + T.Access_Token);
var response = await client.PostAsync("api/controller/lastsaledate", content);
if (response.IsSuccessStatusCode)
{
string result = await response.Content.ReadAsStringAsync();
KeyValuePair<String, DateTime> LastPush = Library.Data.Json.FromJson<KeyValuePair<String, DateTime>>(result);
return LastPush;
}
else
{
return new KeyValuePair<string, DateTime>();
}
}
API
[HttpPost]
[Route("lastsaledate")]
public async Task<IHttpActionResult> GetLastSalesUpdate(string identifier, bool endOfDay)
{
//do stuff
return Ok(Result);
}
Ответ возвращает 404, я бродил, возможно, это проблема маршрутизации? Токен на предъявителя действителен для обоих сообщений, если я отключу авторизацию, то получу тот же результат. URL-адрес api / controller / action определенно правильный.
Возможный дубликат Angular2 HTTP Post ASP.NET MVC Web API
См. Предлагаемый дубликат. Хотя вопрос заключается в том, как опубликовать несколько параметров, основная проблема такая же, с веб-API вы можете опубликовать 1 объект, поэтому вам нужно объединить свои параметры в один настраиваемый тип и опубликовать его.
Кстати: эту проблему можно обойти, передав параметры строки запроса и пометив параметры атрибутом FromUrl.





Да, именно в этом случае вы можете попробовать это
var response = await client.PostAsync(string.format("api/controller/lastsaledate?identifier = {0}&endOfDay{1}",instance,IsEndOfDayOnly), content);
И удалите диктовать
Или вы можете попробовать это
[HttpPost]
[Route("lastsaledate")]
public async Task<IHttpActionResult> GetLastSalesUpdate([FromBody]string identifier, [FromBody]bool endOfDay)
{
//do stuff
return Ok(Result);
}
Или вы можете попробовать это
[HttpPost]
[Route("lastsaledate")]
public async Task<IHttpActionResult> GetLastSalesUpdate(testClass myParam)
{
//do stuff
return Ok(Result);
}
public class testClass
{
public string identifier;
public bool endOfDay;
}
[FromBody] можно использовать только один раз. Ссылка Привязка параметров в веб-API ASP.NET. Еще раз проверьте свой ответ, и вы почти готовы к правильному решению.
В App_Start / RouteConfig.cs убедитесь, что у вас есть строка routes.MapMvcAttributeRoutes (); Кроме того, в вашем вызове "lastsaledate", каково значение вашей переменной "content".