Усовершенствования браузера

«Есть два не вызывающих споров варианта использования перегруженного 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 , а также как поддерживать типы содержимого, отличные от кодированных форм.

Вернуться на верх