首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在埃尔姆,一个GET请求不能有一个身体,或者是吗?

在埃尔姆,一个GET请求不能有一个身体,或者是吗?
EN

Stack Overflow用户
提问于 2022-11-23 17:35:50
回答 2查看 39关注 0票数 2

当方法是Http.request时,GET似乎忽略了GET

代码语言:javascript
运行
复制
init : () -> ( Model, Cmd Msg )
init _ =
    ( Loading
    , Http.request
        { method = "GET"
        , headers = []
        , url = "http://127.0.0.1"
        , body = Http.stringBody "text/plain" "Hello World!"
        , expect = Http.expectWhatever Sent
        , timeout = Nothing
        , tracker = Nothing
        }
    )

发送的请求没有主体(当使用浏览器开发工具检查时)。

代码语言:javascript
运行
复制
init : () -> ( Model, Cmd Msg )
init _ =
    ( Loading
    , Http.request
        { method = "POST" {- CHANGED TO POST -}
        , headers = []
        , url = "http://127.0.0.1"
        , body = Http.stringBody "text/plain" "Hello World!"
        , expect = Http.expectWhatever Sent
        , timeout = Nothing
        , tracker = Nothing
        }
    )

但是,当方法更改为"POST"时,它就能工作了!身体包含"Hello World!"

我试图与之通信的API需要application/json请求中的GET主体。救救我!

PS:这是文件上写的:

emptyBody : Body 为您的请求创建一个空体。这对于不发送任何数据的GET请求和POST请求非常有用。

这一点还不清楚,因为可以用两种不同的方式来解释:

这对于不发送任何数据的GET请求和{ POST请求很有用。

或者:

这对于不发送任何数据的{ GET请求和POST请求}非常有用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-25 19:54:16

Elm实际上将主体添加到请求中,但浏览器没有发送它。

要查看这一点,请编译这个Elm程序:

代码语言:javascript
运行
复制
module Main exposing (main)

import Platform
import Http

main =
    Platform.worker
        { init = \() -> ((), Http.request
            { method = "GET"
            , headers = []
            , url = "https://catfact.ninja/fact"
            , body = Http.stringBody "text/plain" "hi"
            , expect = Http.expectWhatever (\_ -> ())
            , timeout = Nothing
            , tracker = Nothing
            })
        , update = \() () -> ((), Cmd.none)
        , subscriptions = \() -> Sub.none
        }

没有获得index.html文件的优化标志。这个文件的一部分是:

代码语言:javascript
运行
复制
        var xhr = new XMLHttpRequest();
        xhr.addEventListener('error', function() { done($elm$http$Http$NetworkError_); });
        xhr.addEventListener('timeout', function() { done($elm$http$Http$Timeout_); });
        xhr.addEventListener('load', function() { done(_Http_toResponse(request.expect.b, xhr)); });
        $elm$core$Maybe$isJust(request.tracker) && _Http_track(router, xhr, request.tracker.a);

        try {
            xhr.open(request.method, request.url, true);
        } catch (e) {
            return done($elm$http$Http$BadUrl_(request.url));
        }

        _Http_configureRequest(xhr, request);

        request.body.a && xhr.setRequestHeader('Content-Type', request.body.a);
        xhr.send(request.body.b);

如果您在浏览器中打开这个文件,并在调试器中逐步完成它的这一部分,您可以看到Elm实际上将给定的主体"hi“放在request.body.b值中,并传递给xhr.send

但是,如果然后查看浏览器控制台中的Network选项卡,您可以看到请求不包含一个主体。

所以这是浏览器用GET请求剥离出身体,而不是Elm。

票数 3
EN

Stack Overflow用户

发布于 2022-11-23 17:43:11

根据HTTP规范,GET不应该有一个主体。例如,请参见MDN的描述,它说:

备注:在GET请求中发送主体/有效负载可能会导致一些现有实现拒绝请求--虽然规范没有禁止,但是语义没有定义。最好避免在GET请求中发送有效负载。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74550938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档