Возврат 201 (Создано) с заголовком местоположения в Vapor 3 - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь реализовать REST-ful API с использованием Vapor 3, и я предпочел бы использовать то, что кажется довольно стандартным шаблоном создания в других веб-фреймворках: я хотел бы, чтобы контроллеры создания сущностей возвращали 201 Created статус ответа, с Location заголовком ответа, который содержит полный URL вновь созданного ресурса.

Вся документация Vapor 3, которую я могу найти, показывает шаблон создания, который вместо этого возвращает 200 OK статус и включает полный ресурс в теле ответа.Но я не могу найти примеров, использующих ответ 201, хотя в моем опыте это, как правило, является более стандартным подходом к API REST.

Я обнаружил, что могу вручную создать ответ 201 в своемконтроллер, и я предполагаю, что есть способ установить произвольные заголовки в этом ответе.Если да, есть ли удобный способ получить полный URL-адрес только что созданного ресурса, чтобы я мог установить заголовок Location в ответе?

Я уверен, что есть способы, которыми я могуэто «грубая сила», чтобы получить то, что я хочу, но я надеюсь, что Vapor определит идиоматический способ сделать это, во многом как в случае с Java и Rails-структурами, которые я использовал.

1 Ответ

0 голосов
/ 31 декабря 2018

Поскольку вы вручную создаете ответ, вы правы, добавить произвольный заголовок просто.

Я предполагаю, что вы следуете стандартной структуре маршрута CRUD, поэтому, если у вас есть модель User, выесть следующие маршруты:

  • POST /users
  • GET /users/:user
  • PATCH /users/:user
  • DELETE /users/:user

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

user.save(on: req).map { user in
    let http = HTTPResponse(...)

    let location = req.http.url.path + "/" + user.id.description
    http.headers.replaceOrAdd(name: "Location", value: location)

    return Response(http: http, container: req)
}
...