Как отправить запрос PUT с помощью wreq?

Вот как я ожидал бы отправить запрос PUT с wreq:

{-# LANGUAGE OverloadedStrings #-}
import Network.Wreq
main = put "http://httpbin.org/put" ["foo":=(1::Int)]

Однако это дает следующую ошибку:

HttpExceptionRequest Request {
  host                 = "httpbin.org"
  port                 = 80
  secure               = False
  requestHeaders       = [("Content-Type","application/x-www-form-urlencoded"),("User-Agent","haskell wreq-0.5.3.2")]
  path                 = "/put"
  queryString          = ""
  method               = "POST"
  proxy                = Nothing
  rawBody              = False
  redirectCount        = 10
  responseTimeout      = ResponseTimeoutDefault
  requestVersion       = HTTP/1.1
}
 (StatusCodeException (Response {responseStatus = Status {statusCode = 405, statusMessage = "METHOD NOT ALLOWED"}, responseVersion = HTTP/1.1, responseHeaders = [("Date","Fri, 07 Feb 2020 19:26:28 GMT"),("Content-Type","text/html"),("Content-Length","178"),("Connection","keep-alive"),("Server","gunicorn/19.9.0"),("Allow","PUT, OPTIONS"),("Access-Control-Allow-Origin","*"),("Access-Control-Allow-Credentials","true")], responseBody = (), responseCookieJar = CJ {expose = []}, responseClose' = ResponseClose}) "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<title>405 Method Not Allowed</title>\n<h1>Method Not Allowed</h1>\n<p>The method is not allowed for the requested URL.</p>\n")

Как видно из сообщения об ошибке, wreq вместо этого отправляет запрос POST, несмотря на то, что я использовал метод put.

Как я могу заставить wreq фактически отправить запрос PUT?


person tckmn    schedule 07.02.2020    source источник


Ответы (1)


Я считаю, что проблема в том, что если вы попытаетесь put использовать [FormParam], метод будет переопределен и изменен на POST. Если вы put используете другую полезную нагрузку:

main = put "http://httpbin.org/put" ("xyz" :: ByteString)

тогда он работает нормально:

Response {responseStatus = Status {statusCode = 200, statusMessage = "OK"}, ...

Я считаю, что это ограничение/преднамеренное дизайнерское решение в базовом пакете http-client, который использует wreq. Когда функция urlEncodedBody используется для упаковки данных формы в тело, побочным эффектом является изменение метода запроса на POST.

person K. A. Buhr    schedule 07.02.2020