Каков правильный шаблон Url REST для последующей операции

#asp.net-mvc #rest #asp.net-web-api #asp.net-web-api2

#asp.net-mvc #rest #asp.net-web-api #asp.net-web-api2

Вопрос:

У меня есть запрос POST поддержки URL rest. это выглядит как

api /country/{CountryId}/state

используется для создания ресурса состояния в стране с заданным идентификатором

но функция сопоставления этого URL-адреса

 public HttpResponseMessage Post(int countryId,StateDto state)
    {
        var country = _countryAppService.AddNewState(state, countryId);
        var message = Request.CreateResponse(HttpStatusCode.Created, country);
        return message;

    }
  

и ожидаемый образец заданных URL-адресов выглядит так
api /country /1 /state (создайте новое состояние в country с id = 1)

но здесь я не использую значение url (1) в приведенной выше функции, вместо этого здесь вызывающему абоненту необходимо передать соответствующий идентификатор страны через тело запроса, т. Е. нет никакой гарантии, что оба contryId в URL и post-запросе одинаковы. итак, я сомневаюсь в том, какой шаблон URL является правильным для сохранения состояния в конкретной стране с помощью запроса post?

Ответ №1:

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

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

 public HttpResponseMessage Post(int countryId,StateDto state)
{
    // Compose the DTO from the route parameter.
    state.CountryId = countryId;

    var country = _countryAppService.AddNewState(state);
    var message = Request.CreateResponse(HttpStatusCode.Created, country);
    return message;
}
  

Ответ №2:

Вы также можете передать statedtoобъекту в теле, он будет отображаться в теле, идентификатор может отображаться в url

 public HttpResponseMessage Post([FromUri]int countryId,[FromBody]StateDto state)
    {
        var country = _countryAppService.AddNewState(state, countryId);
        var message = Request.CreateResponse(HttpStatusCode.Created, country);
        return message;

    }
  

Только один параметр может быть получен из body, остальные должны поступать из uri, вы можете прочитать больше здесь:
http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

Передача stateDto в uri также является опцией, но тогда вам придется передавать все его элементы в querystring.