如何使用 wreq 发送 PUT 请求?
How to send a PUT request with wreq?
以下是我希望能够使用 wreq
:
发送 PUT 请求的方式
{-# 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 请求?
我认为问题在于,如果您尝试使用 [FormParam]
put
,该方法将被覆盖并更改为 POST
。如果您 put
不同类型的负载:
main = put "http://httpbin.org/put" ("xyz" :: ByteString)
然后就可以正常工作了:
Response {responseStatus = Status {statusCode = 200, statusMessage = "OK"}, ...
我认为这是 wreq
使用的基础 http-client
包中的 limitation/intentional 设计决策。当函数urlEncodedBody
用于将表单数据打包到正文中时,它的副作用是将请求的方法更改为POST
。
以下是我希望能够使用 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 请求?
我认为问题在于,如果您尝试使用 [FormParam]
put
,该方法将被覆盖并更改为 POST
。如果您 put
不同类型的负载:
main = put "http://httpbin.org/put" ("xyz" :: ByteString)
然后就可以正常工作了:
Response {responseStatus = Status {statusCode = 200, statusMessage = "OK"}, ...
我认为这是 wreq
使用的基础 http-client
包中的 limitation/intentional 设计决策。当函数urlEncodedBody
用于将表单数据打包到正文中时,它的副作用是将请求的方法更改为POST
。