postWith 会切换我的请求的内容类型吗?



无论我输入什么值作为请求的"内容类型",我发送的传出请求似乎都会将其替换为"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,请发送类型为ValueEncoding的内容(来自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实例中设置任何内容类型,因此可以通过选项进行设置。

相关内容

  • 没有找到相关文章

最新更新