Передача целочисленного параметра в PostAsync - PullRequest
0 голосов
/ 24 октября 2018

Есть метод Get, который я пытаюсь изменить на Post

   [HttpGet]
   public IHttpActionResult Expiry(int id)
   {
     return Ok(_socialChorusService.Expiry(id));
   }

Метод Get изменен на Post

   [HttpPost]
   public IHttpActionResult Expiry([FromBody]int id)
   {
     return Ok(_socialChorusService.Expiry(id));
   }

При создании запроса, как я могу передать целое число

Я могу сделать что-то вроде строки из строки

var queryString = new FormUrlEncodedContent(  new List<KeyValuePair<string, string>>{new KeyValuePair<string, string>("id", id.toString())});
                    apiResponse = apiClient.PostAsync(requestUri, queryString).Result;

Но я хочу передать целое число.Возможно ли, или в теле могут быть переданы только строки?

Будем благодарны за любые предложения,

Заранее спасибо

1 Ответ

0 голосов
/ 24 октября 2018

Давайте рассмотрим следующий 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;
}
...