Получение IActionResult от WebApi - PullRequest
0 голосов
/ 02 января 2019

Я создал Web API, и моя проблема заключается в чтении результатов из него в клиент.

Метод WebApi, который создает пользователя:

[HttpPost]
public IActionResult PostNewUser([FromBody]UserDto userDto)
{
    if (userDto == null)
        return BadRequest(nameof(userDto));
    IUsersService usersService = GetService<IUsersService>();
    var id = usersService.Add(userDto);
    return Created("api/users/", id.ToString());
}

И клиент, который хочет вызвать код APIis:

public int CreateUser(UserDto dto)
{
    using (HttpClient client = new HttpClient())
    {
        string endpoint = ApiQuery.BuildAddress(Endpoints.Users);
        var json = new StringContent(JsonConvert.SerializeObject(dto), Encoding.UTF8, "application/json");
        var postReult = client.PostAsync(endpoint, json).Result;
        return 1; //?? 
    }
}

Работает, ответ дает 201 (Создано) , но я не знаю, как вернуть правильный результат, который должен быть:

/api/users/id_of_created_user

Я использую netcore2.0 в обоих проектах

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Или вы всегда можете вернуть JsonResult и вернуть объект JSON с сервера с необходимыми данными для клиента. Вот пример использования

https://www.c -sharpcorner.com / UploadFile / 2ed7ae / JsonResult типа-в-MVC /

0 голосов
/ 02 января 2019

В Web API либо создайте созданный URL-адрес местоположения вручную

[HttpPost]
public IActionResult PostNewUser([FromBody]UserDto userDto) {
    if (userDto == null)
        return BadRequest(nameof(userDto));
    IUsersService usersService = GetService<IUsersService>();
    var id = usersService.Add(userDto);
    //construct desired URL
    var url = string.Format("api/users/{0}",id.ToString());
    return Created(url, id.ToString());
}

, либо используйте одну из CreateAt* перегрузок

//return 201 created status code along with the 
//controller, action, route values and the actual object that is created
return CreatedAtAction("ActionName", "ControllerName", new { id = id }, id.ToString());

//OR 

//return 201 created status code along with the 
//route name, route value, and the actual object that is created
return CreatedAtRoute("RouteName", new { id = id }, id.ToString());

В клиенте местоположение извлекается иззаголовок ответа.

status HttpClient client = new HttpClient();

public async Task<int> CreateUser(UserDto dto) {
    string endpoint = ApiQuery.BuildAddress(Endpoints.Users);
    var json = new StringContent(JsonConvert.SerializeObject(dto), Encoding.UTF8, "application/json");

    var postResponse = await client.PostAsync(endpoint, json);

    var location = postResponse.Headers.Location;// api/users/{id here}

    var id = await postResponse.Content.ReadAsAsync<int>();

    return id;
}

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

Обратите внимание на рефакторинг HttpClientчтобы не создавать каждый раз экземпляр, который может привести к чрезмерному истощению, что может привести к ошибкам.

...