Полезная нагрузка в запросе на удаление Typhoeus Ruby

Я пытаюсь отправить полезную нагрузку запроса (например, в почтовом вызове) с вызовом Typhoeus Delete. Насколько мне известно, последнее обновление спецификации HTTP 1.1 (RFC 7231) явно разрешает тело объекта в запросе DELETE:

A payload within a DELETE request message has no defined semantics; sending a payload body on a DELETE request might cause some existing implementations to reject the request.

Я попробовал этот код, но тело/полезная нагрузка не могут быть извлечены

    query_body = {:bodyHash => body}

    request = Typhoeus::Request.new(
        url,
        body: JSON.dump(query_body),
        method: :delete,
        ssl_verifypeer: false,
        ssl_verifyhost: 0,
        verbose: true,
    )

    request.run
    response = request.response
    http_status = response.code
    response.total_time
    response.headers
    result = JSON.parse(response.body)

С другой стороны, он приходит в закодированном виде, и я не могу его восстановить.

Другой боковой код выглядит так:

def destroy
        respond_to do |format|
            format.json do
                body_hash = params[:bodyHash]
                #do stuff
                render json: {msg: 'User Successfully Logged out', status: 200}, status: :ok
            end
            format.all {render json: {msg: 'Only JSON types are supported', status: 406}.to_json, status: :ok}
        end
    end

person Devyani    schedule 23.10.2018    source источник
comment
Как я могу отправить тело/полезную нагрузку с запросом на удаление Typhoeus   -  person Devyani    schedule 23.10.2018


Ответы (2)


Позвольте мне привести спецификацию:

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

Я бы НЕ сказал, что это можно назвать явным разрешением на отправку полезной нагрузки с запросом DELETE. Он говорит, что вы МОЖЕТЕ отправить полезную нагрузку, но обработка такого запроса остается полностью на усмотрение сервера.

И вот что происходит:

С другой стороны, он приходит в закодированном виде, и я не могу его восстановить.

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

person Ilya Konyukhov    schedule 23.10.2018
comment
Другая конечная точка ожидает запрос DELETE. Раньше я использовал em-http-request и mechanize, и они работали безупречно, отправляя полезную нагрузку с запросом DELETE. В документации Typhoeus говорится, что тело может быть отправлено [rubydoc.info/github/typhoeus/typhoeus/ respond_to do |format| format.json do body_hash = params[:bodyHash] end end Если этого не может произойти, я бы обернул его вокруг метода post - person Devyani; 24.10.2018
comment
HTTP-запрос к веб-серверу обычно проходит через несколько шлюзов и даже на веб-сервере обрабатывается несколькими программами. Просто предположение, это может быть Apache или Nginx. Неважно, какой софт стоит на вашем веб-сервере, у него свое мнение о том, как обрабатывать входящий запрос DELETE. - person Ilya Konyukhov; 24.10.2018
comment
Я не думаю, что это так, так как сейчас я тестирую его на локальном хосте. Я обновил свой вопрос для кода другого конца. - person Devyani; 24.10.2018

Наконец я просмотрел все свои запросы, в которых я был полезной нагрузкой (POST и PUT), и заметил, что я не отправляю заголовки вместе с этим запросом DELETE.

Это выглядит примерно так:

query_body = {:bodyHash => body}

    request = Typhoeus::Request.new(
        url,
        body: JSON.dump(query_body),
        method: :delete,
        ssl_verifypeer: false,
        ssl_verifyhost: 0,
        verbose: true,
        headers: {'X-Requested-With' => 'XMLHttpRequest', 'Content-Type' => 'application/json; charset=utf-8', 'Accept' => 'application/json, text/javascript, */*', 'enctype' => 'application/json'}
    )

    request.run
    response = request.response
    http_status = response.code
    response.total_time
    response.headers
    result = JSON.parse(response.body)

Просто добавив к нему заголовки, он заработал

person Devyani    schedule 25.10.2018