HTTP - GET 通过 Body 来发送数据 - 学习/实践
1.应用场景
学习了解http的get请求方法的用法及不知道的信息. |
2.学习/操作
1.博文阅读 //先阅读完 https://yanbin.blog/why-http-get-cannot-sent-data-with-reuqest-body/#more-8193 //谁说 HTTP GET 就不能通过 Body 来发送数据呢?
下面截图:
2.实践/验证过程 环境: Windows 10 64位 PHP/Laravel 7.x
方式一: curl code:
使用git bash 进行curl 分别进进行GET/POST请求 curl -H 'Content-Type: application/json' -X GET -d '{"name":"XBox","price":3999}' http://laravel7.test/body curl -H 'Content-Type: application/json' -X POST -d '{"name":"XBox","price":3999}' http://laravel7.test/body
cmd: Note: cmd与git bash下请求, 格式要求有些区别, cmd下不能使用单引号, 以及参数要转义双引号. curl -H "Content-Type: application/json" -X GET -d {\"name\":\"XBox\",\"price\":3999} http://laravel7.test/body 或者 curl -H "Content-Type: application/json" -X GET -d "{\"name\":\"XBox\",\"price\":3999}" http://laravel7.test/body
结果如下: 由上可知: GET方法在curl实现[而非协议]上, 只是支持request body传递参数的, 而且laravel 7.x 也只支持获取GET 请求体参数的.
方式二: postman TBD
Note: 1.上面文章中有言, postman不支持, get方式携带body [当选择get方式时, body变为不可点击状态], 目前来看, 并不会变灰
该截图是使用postman 去请求kibana查询log [ElasticSearch]
2.如果使用PHP原生语言来处理, 要处理的东西稍微有点多~~, 暂时就直接使用框架来做测试验证.[如果PHP框架支持, 那么PHP原生也一定是支持的]
后续补充 ... |
3.问题/补充
1.关于get请求body传参,并不推荐通过body传参,可以参考stackoverflow关于该问题的回答 -- 1 year ago 是的,实现上并不保证能传输,接收 get body 数据
2.get请求只是帮你把body串在query string中. 虽然说HTTP 1 是一个文本协议,但 Get Request 的 body 它也不是网址的一部份。查看请求协议数据,Get 的 Body 仍然是请求头空一行后的数据。
3.很多人讨论GET和POST的时候很容易就从“协议”讨论到“实现”上去了。 -- 2 years ago 协议里说的是,GET是从服务器取回数据,POST是发送数据,HTTP请求有header,有body。 但是实现怎么样,协议就不管了。 本文章的HTTPClient,curl,postman,浏览器,这些都是实现。 所以我觉得讨论GET和POST区别的前提是,弄明白协议和实现的区别。 比如别人可以说对于Chrome,get的区别是不能带body,这就没问题了。
然而协议里确实说了哪些方法带body是没有意义并可能会产生问题,所以你硬给get加一个body也是属于不遵循规范的,尽管可能成功但是后果自担。所以说get不能带body是正确的说法.
本文并没有建议去违反语义在 GET 请求中传递 body。由于 HTTP/1.1 是基于文本的协议,所以头后空一行后的数据都是 body,所以协议本身未作限制,但是有一个语义上的建议--不应在 GET 请求中放 body 这里有个比较好的回答: https://stackoverflow.com/questions/978061/http-get-with-request-body?answertab=active#tab-top
4.在浏览器里如何让get请求携带body呢? -- 2 years ago 不行。从协议方面来说,GET 是可以带 body 的,但是不赞成这么做,所以好多工具并没有去提供支持。基本上也不要用 GET 来携带 body 数据。对啊,我发现XHR内部就把body给移除了。 TBD |
4.参考
https://yanbin.blog/why-http-get-cannot-sent-data-with-reuqest-body/#more-8193 //谁说 HTTP GET 就不能通过 Body 来发送数据呢? |
后续补充
...