Усовершенствования браузера¶
«Есть два не вызывающих споров варианта использования перегруженного POST. Первое - это имитация унифицированного интерфейса HTTP для клиентов, таких как веб-браузеры, которые не поддерживают PUT или DELETE».
‒ :doc:`RESTful Web Services <https://www.amazon.com/RESTful-Web-Services-Leonard-Richardson/dp/0596529260>`** , Леонард Ричардсон и Сэм Руби.
Для того чтобы API с возможностью просмотра функционировал, есть несколько усовершенствований для браузеров, которые должны быть предоставлены REST-фреймворком.
Начиная с версии 3.3.0 и далее они включаются с помощью javascript, используя библиотеку ajax-form.
PUT, DELETE и т.д. на основе браузера.¶
AJAX form library поддерживает браузерные PUT
, DELETE
и другие методы на HTML формах.
После включения библиотеки используйте атрибут data-method
на форме, как показано ниже:
<form action="/" data-method="PUT">
<input name='foo'/>
...
</form>
Обратите внимание, что до версии 3.3.0 эта поддержка осуществлялась на стороне сервера, а не на основе javascript. Стиль перегрузки методов (используемый в :doc:`Ruby on Rails <https://guides.rubyonrails.org/form_helpers.html#how-do-forms-with-put-or-delete-methods-work>`** ) больше не поддерживается из-за тонких проблем, возникающих при разборе запроса.
Представление неформенного контента с помощью браузера¶
Отправка типов содержимого, таких как JSON, через браузер поддерживается AJAX form library <https://github.com/tomchristie/ajax-form>`** , используя поля формы с атрибутами ``data-override=“content-type“` и data-override='content'
.
Например:
<form action="/">
<input data-override='content-type' value='application/json' type='hidden'/>
<textarea data-override='content'>{}</textarea>
<input type="submit"/>
</form>
Обратите внимание, что до версии 3.3.0 эта поддержка осуществлялась на стороне сервера, а не на основе javascript.
Суффиксы формата на основе URL¶
Структура REST может принимать параметры URL в стиле ?format=json
, что может быть полезным сокращением для определения того, какой тип содержимого должен быть возвращен из представления.
Это поведение контролируется с помощью параметра URL_FORMAT_OVERRIDE
.
Переопределение метода на основе заголовка HTTP¶
До версии 3.3.0 поддерживался заголовок расширения semi X-HTTP-Method-Override
для переопределения метода запроса. Это поведение больше не используется в ядре, но может быть добавлено при необходимости с помощью промежуточного ПО.
Например:
METHOD_OVERRIDE_HEADER = 'HTTP_X_HTTP_METHOD_OVERRIDE'
class MethodOverrideMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if request.method == 'POST' and METHOD_OVERRIDE_HEADER in request.META:
request.method = request.META[METHOD_OVERRIDE_HEADER]
return self.get_response(request)
Заголовки приема на основе URL¶
До версии 3.3.0 фреймворк REST включал встроенную поддержку параметров URL в стиле ?accept=application/json
, что позволяло переопределить заголовок Accept
.
После внедрения API согласования контента это поведение больше не включено в ядро, но может быть добавлено с помощью пользовательского класса согласования контента, если это необходимо.
Например:
class AcceptQueryParamOverride()
def get_accept_list(self, request):
header = request.META.get('HTTP_ACCEPT', '*/*')
header = request.query_params.get('_accept', header)
return [token.strip() for token in header.split(',')]
Разве HTML5 не поддерживает формы PUT и DELETE?¶
Нет. Одно время предполагалось, что он будет поддерживать PUT
и DELETE
формы, но позже dropped from the spec. Осталось ongoing discussion добавить поддержку PUT
и DELETE
, а также как поддерживать типы содержимого, отличные от кодированных форм.