it-swarm.com.ru

Несколько необязательных параметров строки запроса REST API GET

Я использую веб-API 2 для реализации отдыха службы. После некоторого изучения лучших практик каждый, похоже, имеет разные мнения о том, как сделать следующее. У меня есть ПОЛУЧИТЬ 

public HttpResponseMessage Get(string crewId, string shiftDate, int offset = 1, int limit = 10)

Этот метод GET возвращает список. Есть несколько способов получения данных с помощью этого метода. 

  • Получить только crewId
  • Получить только по shiftDate
  • или же
  • Получить по crewId и shiftDate
  • Помечаете ли вы (1) идентификатор crewId и shiftDate как дополнительные? 

    public HttpResponseMessage Get(string crewId = null, string shiftDate = null, int offset = 1, int limit = 10)
    

    а затем иметь кучу операторов if, чтобы проверить, что заполнено, а что нет, чтобы иметь возможность выполнять действия

    if(crewId != null && shiftDate == null){
      // Get by crewId
    }else if(crewId == null && shiftDate != null){
      // Get By shiftDate
    }else if(crewId != null && shiftDate != null){
      // Get By crewId and shiftDate
    }
    

    Для меня это выглядит сумасшедшим, особенно если у вас много параметров, в вашем коде слишком много операторов if.

    Есть ли у вас (2) другой набор получает?

    public HttpResponseMessage GetByCrewId(string crewId, int offset = 1, int limit = 10)
    public HttpResponseMessage GetByShiftDate(string shiftDate, int offset = 1, int limit = 10)
    public HttpResponseMessage GetByCrewIdShiftDate(string crewId, string shiftDate, int offset = 1, int limit = 10)
    

    и тогда вы будете иметь свою карту URI Route к методу 

  • .../апи/GetByCrewId? CrewId = 1234
  • .../апи/GetByShiftDate? ShiftDate = 1111-11-11
  • .../апи/GetByCrewIdShiftDate? CrewId = 1234 & shiftDate = 1111-11-11
  • вариант 2 спокойный?

    Или есть варианты получше (3).

    Оба вышеупомянутых варианта будут работать, просто убедившись, что я использую лучшие практики и следую REST стандартам. Просто кажется, что я что-то упустил, и, надеюсь, вы можете направить меня в правильном направлении.

    7
    Nick Manojlovic

    Вы не хотите, чтобы опция (2) - RESTful, вы хотите, чтобы существительные в вашем URL.

    Итак, вы хотите, чтобы ваши URL выглядели так:

    /api/items/?crewId=1234&shiftDate=1111-11-11
    

    (Я не могу понять, какие у вас Предметы, основываясь на именах параметров 'Crew' и 'Shift'. Что имеет команду и дату смены? Поездки на рыбалку? Если да, то URL будет лучше как/api/рыболовные туры /? crewId = .... & shiftDate = ...

    Что касается контроллера, я бы пошел на что-то вроде:

    public HttpResponseMessage Get(string crewId = null, string shiftDate = null, int offset = 1, int limit = 10) {
    
        return dataSource.Where(x=> (x.CrewId == crewId || crewId == null)
                && (x.ShiftDate == shiftDate || shiftDate == null));
    }
    
    5
    Anthony

    Обзор Best Practices: Понимание заголовков и параметров REST в нем говорится, что использование параметра запроса будет указывать, что он является необязательным. Если вы можете сделать одно значение обязательным, а другое необязательным, это может помочь уточнить URI.

    /api/fishing-trips/crew/{crewid}?shiftdate=1111-11-11
    

    В конце концов, если ваши предметы не являются обязательными, используйте «?» это, наверное, лучший маршрут. Дополнительная информация о типах параметров доступна в RFC 6570

    Обратите внимание, что ваш выбор может повлиять на любую очередь, которую вы решите использовать, и расширение параметра path-style может иметь больше смысла. Дополнительная информация также на Понимание REST параметров .

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

    Например,

    /api/fishing-trips/search?crew=1234
    /api/fishing-trips/search?shiftDate=1111-11-11
    /api/fishing-trips/search?crew=1234&shiftDate=1111-11-11
    

    Вы также можете предоставить упрощение наряду с дополнительными параметрами, например,

    /api/fishing-trips/today
    /api/fishing-trips/today?crew=1234
    /api/fishing-trips/crew/1234/today
    

    Эти последние примеры являются субъективными из моего исследования, но дополнительную информацию можно найти в Best Practices для API Pragmatic Rest и Дизайн RESTful URL для поиска .

    2
    McArthey

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

    public HttpResponseMessage Get(string crewId = null, string shiftDate = null, int offset = 1, int limit = 10)
    

    Затем создайте свой запрос. Например, что-то вроде этого:

    var query = "";
    if (!String.IsNullOrEmpty(crewId)) {
      query += $"crewId='{crewId}'";
    }
    if (!String.IsNullOrEmpty(shiftDate)) {
      if (query.Length > 0) query += " AND ";
      query += $"shiftDate='{shiftDate}'";
    }
    if (query.Length == 0) {
      //neither crewId or shiftDate were given
      //return some kind of error
    }
    
    2
    Gabriel Luci

    Учитывая, что я собираюсь реализовать это сам, скажу, что это должно быть одно действие метода GET с несколькими необязательными параметрами. 

    Зачем? Потому что вам не стоит беспокоиться об этой логике запросов на уровне API REST. В конце концов, вы фактически создаете предложение дискриминации AND с несколькими параметрами (то есть CrewId = 1 AND ShiftDate = 2016-01-01). И если вы не предоставите параметры, верните все элементы.

    Я буду передавать все свои параметры через хранимую процедуру SQL, для которой заданы значения по умолчанию, и я буду возвращать результаты на основе переданных параметров.

    Помните, что во многих отношениях методы REST отображаются непосредственно в CRUD, поэтому относитесь к своему API так: REST API Tutorial

    1
    toadflakz