Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell x-oauth-basic头文件名为';在CURL和HTTP.conductor中不一样_Haskell_Github Api_Http Conduit - Fatal编程技术网

Haskell x-oauth-basic头文件名为';在CURL和HTTP.conductor中不一样

Haskell x-oauth-basic头文件名为';在CURL和HTTP.conductor中不一样,haskell,github-api,http-conduit,Haskell,Github Api,Http Conduit,这很可能是我遗漏了一些重要的信息或其他东西,但接下来就是了 目前,我正在尝试使用库将我自己的头,即x-oauth-basic,插入到我的HTTP请求中。这有点管用,但不是我想的方式 submitPostRequest urlString githubKey body = case parseUrl urlString of Nothing -> return $ "URL Syntax Error" Just initReq -> withMa

这很可能是我遗漏了一些重要的信息或其他东西,但接下来就是了

目前,我正在尝试使用库将我自己的头,即
x-oauth-basic
,插入到我的HTTP请求中。这有点管用,但不是我想的方式

submitPostRequest urlString githubKey body =
    case parseUrl urlString of
        Nothing -> return $ "URL Syntax Error"
        Just initReq -> withManager $ \manager -> do
            let req = initReq { secure = False -- Turn on https
                           , method = "POST"
                           , requestHeaders = [("x-oauth-basic", (encodeUtf8 githubKey))]
                                              <> [("User-Agent", "HsCMS")]
                           , requestBody = RequestBodyBS (toStrict body)
                           , checkStatus = \_ _ _ -> Nothing
                           }
            res <- httpLbs req manager
            return $ responseBody res
标题没有出现,这表明天坑没有拾取x标题。curl示例也适用于我预期的端点GithubAPI,因此我知道curl方法是正确的,而我的HTTP.conductionOne则不是

所以我的问题是,我如何使我的HTTP.conductor头显示为
x头
,例如curls',而不是当前的
HTTP-x头

另外,不要担心,使用的github键不是实际的键

更新和修复 因此,正如在对Michael Snoymans回答的评论中所提到的,它通过使用不同的标题得到解决,即
(“授权”,“令牌”(encodeUtf8 githubKey))
,这显然是CURL在执行
:x-oauth-basic
时发送的内容

我试图更新标题,使其更适合,但我愿意接受建议


谢谢你的帮助

我认为问题在于您的天坑应用程序。它似乎正在打印标题的CGI版本。我不知道天坑是什么样子,所以我在Warp中实现了一个简单的天坑,并且请求头确实被正确地传递了。你可以自己试试。为了完整起见,下面是代码:

{-# LANGUAGE OverloadedStrings #-}
import           Control.Concurrent.Async (withAsync)
import           Control.Monad.IO.Class   (liftIO)
import           Data.ByteString          (ByteString)
import qualified Data.ByteString.Lazy     as L
import           Data.Monoid              (mempty, (<>))
import           Data.Text                (Text)
import           Data.Text.Encoding       (encodeUtf8)
import           Network.HTTP.Conduit     (RequestBody (RequestBodyBS),
                                           checkStatus, httpLbs, method,
                                           parseUrl, requestBody,
                                           requestHeaders, responseBody, secure,
                                           withManager)
import           Network.HTTP.Types       (status200)
import qualified Network.Wai              as Wai
import           Network.Wai.Handler.Warp (run)
import           System.Environment       (getEnv)

main :: IO ()
main = do
    port <- fmap read $ getEnv "PORT"
    withAsync (run port app) $ const $ do
        submitPostRequest
            ("http://localhost:" ++ show port)
            "dummy-key"
            "dummy body" >>= print

app :: Wai.Application
app req = do
    liftIO $ mapM_ print $ Wai.requestHeaders req
    return $ Wai.responseLBS status200 [] mempty

submitPostRequest :: String -> Text -> ByteString -> IO L.ByteString
submitPostRequest urlString githubKey body =
    case parseUrl urlString of
        Nothing -> return $ "URL Syntax Error"
        Just initReq -> withManager $ \manager -> do
            let req = initReq { secure = False -- Turn on https
                           , method = "POST"
                           , requestHeaders = [("x-oauth-basic", (encodeUtf8 githubKey))]
                                              <> [("User-Agent", "HsCMS")]
                           , requestBody = RequestBodyBS body
                           , checkStatus = \_ _ _ -> Nothing
                           }
            res <- httpLbs req manager
            return $ responseBody res

我想我的问题是:CURL发送的头和HTTP.conductor发送的头有什么区别?在接收器中,它们是不同的,我似乎无法让GitHubs API接受HTTP.conductor版本:/…我不知道头是否是专门用于CURL(我最初从中获得)或其他用途的,但我通过使用“授权”,然后预加“令牌”来实现我认为
-u
选项并不能满足您的期望。该设置不仅创建
x-oauth-basic
头,而且生成授权头。您可以在sink应用程序中试用,但我得到了:
(“授权”,“基本NZH5ODCXM2SXAJIZBMTQMTQBNV5MZY2MZY2MZYZNJY2RHC2RKZDP4LW9HDXROLWJHC2LJ”)
啊,我想我在使用CURL进行测试时假设得太多了:/。。嗯,“基本”有点道理,我在另一个图书馆里找到了“代币”的东西,并尝试了一下。
curl -u 78y8713k1j23nkjnkjnuy366366363666gdasddd:x-oauth-basic --request POST --data '{"description":"Updated via API","files":{"file1.txt":{"filename": "newsies.txt", "content":"New Demo"}}' http://www.posttestserver.com/post.php\?dir\=Testing
{-# LANGUAGE OverloadedStrings #-}
import           Control.Concurrent.Async (withAsync)
import           Control.Monad.IO.Class   (liftIO)
import           Data.ByteString          (ByteString)
import qualified Data.ByteString.Lazy     as L
import           Data.Monoid              (mempty, (<>))
import           Data.Text                (Text)
import           Data.Text.Encoding       (encodeUtf8)
import           Network.HTTP.Conduit     (RequestBody (RequestBodyBS),
                                           checkStatus, httpLbs, method,
                                           parseUrl, requestBody,
                                           requestHeaders, responseBody, secure,
                                           withManager)
import           Network.HTTP.Types       (status200)
import qualified Network.Wai              as Wai
import           Network.Wai.Handler.Warp (run)
import           System.Environment       (getEnv)

main :: IO ()
main = do
    port <- fmap read $ getEnv "PORT"
    withAsync (run port app) $ const $ do
        submitPostRequest
            ("http://localhost:" ++ show port)
            "dummy-key"
            "dummy body" >>= print

app :: Wai.Application
app req = do
    liftIO $ mapM_ print $ Wai.requestHeaders req
    return $ Wai.responseLBS status200 [] mempty

submitPostRequest :: String -> Text -> ByteString -> IO L.ByteString
submitPostRequest urlString githubKey body =
    case parseUrl urlString of
        Nothing -> return $ "URL Syntax Error"
        Just initReq -> withManager $ \manager -> do
            let req = initReq { secure = False -- Turn on https
                           , method = "POST"
                           , requestHeaders = [("x-oauth-basic", (encodeUtf8 githubKey))]
                                              <> [("User-Agent", "HsCMS")]
                           , requestBody = RequestBodyBS body
                           , checkStatus = \_ _ _ -> Nothing
                           }
            res <- httpLbs req manager
            return $ responseBody res
("Host","localhost:8004")
("Accept-Encoding","gzip")
("Content-Length","10")
("x-oauth-basic","dummy-key")
("User-Agent","HsCMS")
Empty