无论我输入什么值作为请求的"内容类型",我发送的传出请求似乎都会将其替换为"application/x-www-form-urlencoded"。我尝试访问的应用程序需要"application/json"。基本上,我的代码如下。
{-# LANGUAGE OverloadedStrings #-}
import Network.Wreq
...
submissionResources = ["https://widgets.example.com/v2/widgets/request"]
sendWidgetToEndpoint submissionResources workingToken key widgetArray = do
let opts = defaults & header "Content-Type" .~ ["application/json"]
& header "apikey" .~ [key]
& header "Authorization" .~ [workingToken]
endPointURL = head submissionResources
widgetId = widgetArray !! 0
numberOfWidgets = widgetArray !! 1
widgetText = widgetArray !! 2
submissionResult <- postWith opts endPointURL [ "widgetId" := widgetId
, "numWidgets" := numberOfWidgets
, "widgetText" := widgetText
]
return submissionResult
我的问题是,我一直从这个端点返回Status {statusCode = 415, statusMessage = "Unsupported Media Type"}
,我相信这是因为我发送的请求似乎覆盖了我头中的"内容类型"。我尝试过使用"application/json"one_answers"text/plain",但我收到的回复总是告诉我,我发送的所有标头看起来都是预期的,除了内容类型,它总是变成"application/x-www-form-urlencoded"。
如何确保wreq在请求头中保留"Content-Type:application/json"?
编辑:我通过API服务器在回复我的回复中告诉我的内容来确定我原始请求中的标题
代码段中postWith
的最后一个参数的类型是[FormParam]
,而该类型就是强制对Content-type进行url编码的原因。
要发送JSON,请发送类型为Value
或Encoding
的内容(来自Data.Aeson
(。
import Data.Aeson (pairs, (.=))
...
-- also remove the "Content-Type" field from opts
submissionResult <- postWith opts endpointURL $ pairs
( "widgetId" .= widgetId <>
"numWidgets" .= numberOfWidgets <>
"widgetText" .= widgetText )
...
内容类型由您通过Postable
实例传递给postWith
的负载设置。如果要使用另一个"内容类型"标头,请使用Postable
实例定义自己的类型,在该实例中可以设置适当的"内容类型》。您也可以选择不在Postable
实例中设置任何内容类型,因此可以通过选项进行设置。