如何使用 wreq 发送 PUT 请求?



以下是我希望能够发送带有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包中的限制/有意设计决策。当函数urlEncodedBody用于将表单数据打包到正文中时,它具有将请求方法更改为POST的副作用。

相关内容

  • 没有找到相关文章

最新更新