文档章节

【原创】HTTP 之 GET 在 body 中携带参数问题

摩云飞
 摩云飞
发布于 2017/05/23 15:03
字数 555
阅读 452
收藏 0

在测试 Elasticsearch 时遇到下面这种测试命令:

curl -u elastic:changeme -XGET http://localhost:9200/_search\?pretty -d '{ "from": 30, "size":10}'

可以看到这里指定的 -XGET ,但同时通过 -d 参数指定了数据内容:

man 1 curl 中可以看到

-d, --data <data>

(HTTP) Sends the specified data in a POST request to the HTTP server, in the same way that a browser does when a user has filled in an HTML form and presses the submit button. This will cause curl to pass the data to the server using the content-type application/x-www-form-urlencoded.

-d, --data is the same as --data-ascii. --data-raw is almost the same but does not have a special interpretation of the @ character. To post data purely binary, you should instead use the --data-binary option. To URL-encode the value of a form field you may use --data-urlencode. If any of these options is used more than once on the same command line, the data pieces specified will be merged together with a separating &-symbol. Thus, using '-d name=daniel -d skill=lousy' would generate a post chunk that looks like 'name=daniel&skill=lousy'.

If you start the data with the letter @, the rest should be a file name to read the data from, or - if you want curl to read the data from stdin. Multiple files can also be specified. Posting data from a file named 'foobar' would thus be done with --data @foobar. When --data is told to read from a file like that, carriage returns and newlines will be stripped out. If you don't want the @ character to have a special interpretation use --data-raw instead.

这里就引出了一个矛盾点:在 GET 请求中通过 -d 发送数据是什么鬼?!

抓包发现确实可以这么使用:

HTTP GET with data in body

一般来讲,任何语言(特别是 javascript)实现的 HTTP 库都不允许 GET 请求中携带交互数据。因此,很多用户会惊讶于 GET 请求中居然会允许这么做。

真实情况是:在规定 HTTP 语义及内容的 RFC 7231 中,并未限制 GET 请求中是否允许携带交互数据!所以,有些 HTTP 服务允许这种行为,而另外一些(特别是缓存代理)则不允许这种行为。

Elasticsearch 的作者们倾向于使用 GET 提交查询请求,因为他们觉得这个 verb 相比 POST 来说,能更好的描述这种行为。然而,因为携带交互数据的 GET 请求并不被广泛支持,所以 search API 同样支持 POST 请求,即

POST /_search
{
  "from": 30,
  "size": 10
}

© 著作权归作者所有

摩云飞
粉丝 371
博文 534
码字总数 952694
作品 0
徐汇
程序员
私信 提问
Spring框架中发送http请求--RestTemplate

环境搭建 本文环境指的 Spring Boot下1.4.2版本下 pom.xml (核心内容) <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <versi......

onedotdot
2018/10/17
0
0
c语言实现简单web服务器

1http简单介绍 http超文本传输协议:host主机地址:port端口/url host会被DNS服务器 解析成IP地址,所以有时候可以直接用域名, http默认访问80端口,https默认访问443端口 大致流程就是:浏览器输...

超级极客
2018/01/11
0
0
【专栏精选】实战:百度语音识别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhenghongzhi6/article/details/90169987 本文节选自洪流学堂公众号技术专栏《大话Unity2019》,未经允许不可...

关尔Manic
05/13
0
0
PHP的"php://input"和$HTTP_RAW_POST_DATA 和$_POST的关系

最近一直在写接口,顺便把 php 输入输出流相关知识点学习了一遍 理论知识 php://input php://input 数据输入流存放着 post 请求发送过来的原生数据,但 Content-Type:multipart/form-data(...

big_cat
2015/11/28
233
0
hessian隐式传参

背景 web应用的项目:分表现层portal端和业务服务层service端,使用dubbo框架,rpc使用hessian。dubbo里的dubbo协议因为是socket长连接可以attachment隐式带参数,hessian协议则不能attachm...

v1-alpha
2016/03/07
29
0

没有更多内容

加载失败,请刷新页面

加载更多

C 语言 二级指针的使用

#include <stdio.h>#include <stdlib.h>typedef struct node Node;struct node {int data;struct node* next;struct node* prev;};Node head;Node* insert(Node......

小张525
26分钟前
2
0
【大数据技术】——Hadoop(1)

什么是大数据 基本概念 《数据处理》 在互联网技术发展到现今阶段,大量日常、工作等事务产生的数据都已经信息化,人类产生的数据量相比以前有了爆炸式的增长,以前的传统的数据处理技术已经...

须臾之余
40分钟前
6
0
比特币从地址逆向计算私钥

区块链 区块链简介 说到比特币,就不得不提区块链。那什么是区块链呢? 区块链本质是一个数据集,只不过数据的组织采用了比较特殊的方式,就是把数据拆分为一块一块的小数据集。 为什么要进行...

trayvon
55分钟前
1
0
TypeScript……真香

写前端或者用 node 写命令行小工具一直采用的 es6 的语法,对于 TypeScript 则是秉持敬而远之的态度,毕竟团队中多推广一门语言所需要花费的精力都是让人望而却步的。所以对于 JavaScript 的...

郁也风
今天
3
0
shell基本案例

1、自定义rm linux系统的rm命令太危险,一不小心就会删除掉系统文件。 写一个shell脚本来替换系统的rm命令,要求当删除一个文件或者目录时,都要做一个备份,然后再删除。下面分两种情况,做...

寰宇01
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部