参考:https://learnku.com/articles/25881评论区
嗯.. 貌似没讲到实际应用中的重点. 100 Continue 的规范可以参照 MND https://developer.mozilla.org/zh-CN/docs/W….
浏览器有没有默认发送 Expect:100-continue 的请求头就不清楚,但是 curl 是默认会发送的。具体的解释可以看鸟哥的博客: http://www.laruence.com/2011/01/20/1840.ht…
摘抄一下重点:
在使用curl做POST的时候, 当要POST的数据大于1024字节的时候, curl并不会直接就发起POST请求, 而是会分为俩步, 1. 发送一个请求, 包含一个Expect:100-continue, 询问Server是否愿意接受数据 2. 接收到Server返回的100-continue应答以后, 才把数据POST给Server 并不是所有的Server都会正确应答100-continue, 比如lighttpd, 就会返回417 “Expectation Failed”, 则会造成逻辑出错.
因此,在使用 curl 时可以考虑增加一步处理,既在请求头中将 Expect 值置空。鸟哥给出的 demo 是这样
curl_setopt($ch, CURLOPT_HTTPHEADER, array(‘Expect:’));
guzzle 的做法是:
// If the Expect header is not present, prevent curl from adding it if (!$request->hasHeader(‘Expect’)) { $conf[CURLOPT_HTTPHEADER][] = ‘Expect:’; }
补充一下,实在是感觉这篇鬼东西都不知道在说啥。我认为 GET 跟 POST 跟区别就是前者没有 request body. 同样看一下 MDN
https://developer.mozilla.org/zh-CN/docs/W…
https://developer.mozilla.org/zh-CN/docs/W…
https://developer.mozilla.org/zh-CN/docs/W…
但实际上,GET 也是可以带 request body 的,elasticsearch 的 HTTP API 就允许使用 GET 方法提交 request body
https://www.elastic.co/guide/en/elasticsea…
Both HTTP GET and HTTP POST can be used to execute search with body. Since not all clients support GET with body, POST is allowed as well.
同时,也在 StackOverflow 搜到了关于 GET 方法关于 request body 的 RFC 定义
https://stackoverflow.com/questions/369397…
A payload within a GET request message has no defined semantics; sending a payload body on a GET request might cause some existing implementations to reject the request. Finally, note that while HTTP allows GET requests to have a body syntactically, this is done only to allow parsers to be generic; as per RFC7231, Section 4.3.1, a body on a GET has no meaning, and will be either ignored or rejected by generic HTTP software.
靠着谷歌翻译大概阅读了下,意思就是 client 在使用 GET 的时候可以加上 request body, 但要不要接受或者使用是 server 决定的。不同的 server 不同的实现.