Содержимое HTTP POST в Haskell - PullRequest
8 голосов
/ 20 июня 2010

Я пытаюсь опубликовать некоторые данные на сервере в Haskell, и серверная часть становится пустой.

Я использую библиотеку Network.HTTP для запроса.

module Main (main) where

import Network.URI (URI (..), parseURI, uriScheme, uriPath, uriQuery, uriFragment)
import Network.HTTP
import Network.TCP as TCP

main = do
         conn <- TCP.openStream "localhost" 80
         rawResponse <- sendHTTP conn updateTest
         body <- getResponseBody rawResponse
         if body == rqBody updateTest
           then print "test passed"
           else print (body ++ " != " ++ (rqBody updateTest))

updateURI = case parseURI "http://localhost/test.php" of
                  Just u -> u

updateTest = Request { rqURI = updateURI :: URI
                     , rqMethod = POST :: RequestMethod
                     , rqHeaders = [ Header HdrContentType   "text/plain; charset=utf-8"
                                   ] :: [Header]
                     , rqBody = "Test string"
                     }

Этот тест возвращает пустую строку в качестве тела ответа от сервера, когда я думаю, что он должен повторять сообщение "Тестовая строка".

В идеале я хотел бы повторить функциональность:

curl http://localhost/test.php -d 'Test string' -H 'Content-type:text/plain; charset=utf-8'

и проверяю результаты с помощью serveride test.php:

<?php
print (@file_get_contents('php://input'));

Я делаю это неправильно или я просто пробую другую библиотеку?

Ответы [ 2 ]

4 голосов
/ 20 июня 2010

Необходимо указать HTTP-заголовок Content-Length, значение которого должно быть длиной необработанных опубликованных данных:

updateTest = Request { rqURI     = updateURI
                     , rqMethod  = POST
                     , rqHeaders = [ mkHeader HdrContentType "application/x-www-form-urlencoded"
                                   , mkHeader HdrContentLength "8"
                                   ]
                     , rqBody    = "raw data"
                     }
3 голосов
/ 20 ноября 2012

И с помощью http-conduit:

{-# LANGUAGE OverloadedStrings #-}

import Network.HTTP.Conduit
import qualified Data.ByteString.Lazy as L

main = do
  initReq <- parseUrl "http://localhost/test.php"

  let req = (flip urlEncodedBody) initReq $
             [ ("", "Test string")
--             ,
             ]

  response <- withManager $ httpLbs req

  L.putStr $ responseBody response

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '} *' 'в коде' * 'в приведенном выше примере кодируется перед публикацией.

и запросить тело вручную.API такой же, как в http-enumerator, хороший пример: https://stackoverflow.com/a/5614946

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