Является ли postWith переключение Content-Type моего запроса? - PullRequest
1 голос
/ 30 марта 2020

Независимо от того, какое значение я ввожу в качестве «Content-Type» моего запроса, исходящий запрос, который я отправляю, кажется, заменяет его на «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"} с этой конечной точки, и я уверен, что это потому, что отправляемый мной запрос, кажется, переопределяет «Content-Type» в моем заголовке. Я пытался использовать «application / json» и «text / plain», но ответ, который я получаю, всегда указывает мне, что все отправленные мной заголовки выглядят, как и ожидалось, за исключением Content-Type, который неизменно становится «application / x». - www-form-urlencoded ".

Как я могу убедиться, что wreq хранит 'Content-Type: application / json' в заголовке моих запросов?

EDIT: я определяю, какие заголовки были в мой первоначальный запрос, который мне сообщает сервер API в своем ответе.

1 Ответ

3 голосов
/ 30 марта 2020

Тип последнего аргумента для postWith в вашем фрагменте - [FormParam], и именно этот тип заставляет Content-Type быть urlencoded.

Чтобы отправить 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 )
  ...

Тип содержимого задается полезной нагрузкой, которую вы передаете postWith через экземпляр Postable. Если вы хотите использовать еще один заголовок Content-Type, определите свой собственный тип с экземпляром Postable, в котором вы установите соответствующий Content-Type. Вы также можете не устанавливать тип содержимого в экземпляре Postable, поэтому вы можете установить его с помощью параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...