当方法是Http.request
时,GET
似乎忽略了GET
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
}
)
发送的请求没有主体(当使用浏览器开发工具检查时)。
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请求}非常有用。
发布于 2022-11-25 11:54:16
Elm实际上将主体添加到请求中,但浏览器没有发送它。
要查看这一点,请编译这个Elm程序:
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
文件的优化标志。这个文件的一部分是:
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。
发布于 2022-11-23 09:43:11
根据HTTP规范,GET
不应该有一个主体。例如,请参见MDN的描述,它说:
备注:在
GET
请求中发送主体/有效负载可能会导致一些现有实现拒绝请求--虽然规范没有禁止,但是语义没有定义。最好避免在GET
请求中发送有效负载。
https://stackoverflow.com/questions/74550938
复制