Давайте рассмотрим следующий API:
[HttpPost]
[Route("api/Test")]
public async Task<string> Test([FromUri]int value)
{
var result = "Done";
if (value > 5)
result = "Well Done";
return await Task.FromResult(result);
}
Он может быть вызван следующим образом и будет работать, как и ожидалось:
http://<ServerUrl>/api/Test?value=10
То, что вы ожидаете, это:
public async Task<string> Test([FromBody]int value)
Это не будет работать, поскольку "value":10
является недопустимым Json, а действительный Json равен {"value":10}
, что просто означает, что value
должен содержаться вкласс, который будет использоваться следующим образом
Edit 1:
Мы можем внести некоторые изменения, чтобы достичь того, чего вы ожидаете, давайте оставим api как:
public async Task<string> Test([FromBody]int value)
Почтовый вызов будет:
http://<ServerUrl>/api/Test
В теле вызова вы просто передадите 10 or 15
или любое другое значение, которое вы хотите заполнитьпараметр, так как это допустимый Json или в случае массива это будет [10,15,20]
, который может быть собран в ([FromBody]int[] value)
Единственным недостатком будет то, что вы не можете передать несколько значений в теле, так как естьнет корневого / контейнерного объекта
Редактировать 2:
Используйте следующий клиент для вызова API и получения thРезультат:
async Task Main()
{
// Input Value
int input = 100;
// Json Serialize the Input
string jsonInput = JsonConvert.SerializeObject(input);
// Execute Api call Async
var httpResponseMessage = await MakeApiCall(jsonInput,
"api/Test","http://localhost:59728/");
// Process string[] and Fetch final result
var result = await FetchJsonResult<string>(httpResponseMessage);
// Print Result
result.Dump();
}
private async Task<HttpResponseMessage> MakeApiCall(string jsonInput,
string api,
string host)
{
// Create HttpClient
var client = new HttpClient { BaseAddress = new Uri(host) };
// Assign default header (Json Serialization)
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// Add String Content
var stringContent = new StringContent(jsonInput);
// Assign Content Type Header
stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
// Make an API call and receive HttpResponseMessage
HttpResponseMessage responseMessage;
responseMessage = await client.PostAsync(api, stringContent);
return responseMessage;
}
private async Task<T> FetchJsonResult<T>(HttpResponseMessage result)
{
// Convert the HttpResponseMessage to Byte[]
var resultArray = await result.Content.ReadAsStringAsync();
// Deserialize the Json string into type using JsonConvert
var final = JsonConvert.DeserializeObject<T>(resultArray);
return final;
}