远程请求数据Get 和post区别
- 该话题包含 3个回复,1 人参与,最后由Frank Chen 更新于 2年前 。
- 作者帖子
- Up::3
1、GET在浏览器回退时是无害的,而POST会再次提交请求。
2、GET产生的URL地址可以被Bookmark,而POST不可以。
3、GET请求会被浏览器主动cache,而POST不会,除非手动设置。
4、GET请求只能进行url编码,而POST支持多种编码方式。
5、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
6、GET请求在URL中传送的参数是有长度限制的,而POST没有。
7、对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
8、GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
9、GET参数通过URL传递,POST放在Request body中。
10、GET产生一个TCP数据包,POST产生两个TCP数据包 - Up::0
一份完整的php curl请求代码示例 function curlRequest($url, array $params, $method = 'POST', array $headers = array()) { // 1.初始化一个curl会话资源 $ch = curl_init(); // 2.设置curl会话的选项 curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); // 强制使用 HTTP/1.0 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); // 发起连接前等待超时的时间,如果设置为0,则无限等待 curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 设置curl允许执行的最长秒数 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 是否将curl_exec()获取的信息返回,而不是直接输出 curl_setopt($ch, CURLOPT_ENCODING, 'gzip'); // 设置HTTP请求头中"Accept-Encoding: "的值 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 启用时会将服务器返回的"Location: "放在header中递归的返回给服务器 curl_setopt($ch, CURLOPT_MAXREDIRS, 5); // 设置HTTP重定向的最大数量,这个选项是和CURLOPT_FOLLOWLOCATION一起使用的 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 是否需要进行服务端的SSL证书验证 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 是否验证服务器SSL证书中的公用名 curl_setopt($ch, CURLOPT_HEADER, false); // 是否抓取头文件的信息 //curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 设置HTTP请求头 curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); //头部要送出'Expect: ' curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 ); //强制使用IPV4协议解析域名 curl_setopt($ch, CURLINFO_HEADER_OUT, true); switch (strtoupper($method)) { case 'POST': curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); break; case 'GET': $url = "{$url}?" . http_build_query($params); break; case 'DELETE': curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); $url = "{$url}?" . http_build_query($params); break; default: return 'invalid request method'; } curl_setopt($ch, CURLOPT_URL, $url); // 设置需要请求的URL地址,也可以在 curl_init()函数中设置 // 3.执行curl会话 $response = curl_exec($ch); // 4.关闭curl会话,释放资源 curl_close($ch); return $response; }
- Up::0
cURL 的 ipv6、ipv4 选择策略
1> cURL 对ipv4、ipv6是这样一个处理过程:
解析被请求的域名,通常会获得一个ip地址列表,同时包含了ipv4和ipv6地址;
cURL会首先发起连接ipv6地址,如果200ms内连接成功,则直接使用此地址;
如果200ms未连接成功ipv6地址,cURL会对列表中地址并发发起连接;
最后等待第一个成功建立的连接,将作为后续cURL传输地址。从上面流程可以看出几点:ipv6优先机制、快乐眼球(Happy Eyeballs)机制(也叫快速回退Fast Fallback机制)、轮询调度机制(Round-robin DNS)。
2> Happy Eyeballs 是什么?
“快乐眼球”是客户端的一个算法,它叫这么个名字,是想表达这个算法是用在互联网中的用户端(客户端)而不是服务器端。这里有一个比较好的文章。cURL的实现不是简单的执行:getaddrinfo() -> 遍历每个ip地址然后并发发起 connect()。它的做法将全部地址分开到一个ipv4专用和一个ipv6专用的两个线程队列,然后再并发发起连接,最先收到回复的连接作为最终使用的连接。
这个算法的提出是在2011年 World IPv6 Day,为了避免 ipv6 起步阶段网络环境不理想。
除了cURL,目前支持 Happy Eyeballs 其它软件包括 Chrome 浏览器, Opera 浏览器, Firefox 13+, 苹果操作系统 OS X 等。
3>为 cURL 指定 ipv4,ipv6
通过命令行参数 –ipv4 或 -4 强制使用 ipv4 协议:% time curl –ipv4 https://example.org/
可以显示ipv4连接过程和连接的时间
% curl –ipv4 https://example.org/
复制代码
通过命令行参数 –ipv6 或 -6 强制使用 ipv6 协议:% curl –ipv6 https://example.org/
复制代码
加上参数 -v 可以看到连接的过程:% curl -v http://example.org/ ~ * Trying 192.168.199.217... * TCP_NODELAY set * Connection failed * connect to 192.168.199.217 port 80 failed: Connection refused * Trying 2001::1... * TCP_NODELAY set * Connected to example.org (2001::1) port 80 (#0) > GET / HTTP/1.1 > Host: example.org > User-Agent: curl/7.64.1 > Accept: */* >
4>nslookup 做 DNS 解析
# type 和 query、querytype 三个相同作用的参数,用于设置查询类型,默认值为 A% nslookup -type=A example.test Server: 192.168.199.1 Address: 192.168.199.1#53 Name: example.test Address: 192.168.199.169 % nslookup -type=AAAA example.test Server: 192.168.199.1 Address: 192.168.199.1#53 example.test has AAAA address 2001::2
5>dig 解析 DNS
# 同时解析 ipv4 和 ipv6
% dig example.test AAAA example.test A +short2001::2
192.168.199.169# @域名服务器在前面表示全球服务器
% dig @8.8.8.8 tv.ipv6.edu.cn AAAA; <<>> DiG 9.10.6 <<>> @8.8.8.8 tv.ipv6.edu.cn AAAA ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 84 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;tv.ipv6.edu.cn. IN AAAA ;; ANSWER SECTION: tv.ipv6.edu.cn. 3600 IN AAAA 2001:da8:217:1::234 ;; Query time: 158 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Mon Sep 28 09:11:02 CST 2020 ;; MSG SIZE rcvd: 60
# @域名服务器在后面表示本地服务器
% dig wikimedia.org MX @ns0.wikimedia.org; <<>> DiG 9.6.1 <<>> wikimedia.org MX @ns0.wikimedia.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61144 ;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;wikimedia.org. IN MX ;; ANSWER SECTION: wikimedia.org. 3600 IN MX 10 mchenry.wikimedia.org. wikimedia.org. 3600 IN MX 50 lists.wikimedia.org. ;; ADDITIONAL SECTION: mchenry.wikimedia.org. 3600 IN A 208.80.152.186 lists.wikimedia.org. 3600 IN A 91.198.174.5 ;; Query time: 73 msec ;; SERVER: 208.80.152.130#53(208.80.152.130) ;; WHEN: Wed Aug 12 11:51:03 2009 ;; MSG SIZE rcvd: 109
- Up::0
curl 常见使用命令
# 显示响应首部信息 curl -I www.baidu.com # 模拟浏览器 curl -A "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25" www.baidu.com # 静默模式,不显示curl进度 curl -s www.baidu.com # 显示一次通信详情信息 curl -v www.baidu.com # 显示详情并时间戳跟踪 curl -v --trace-time www.baicu.com # 指定 GET 请求访问百度, curl -X GET www.baidu.com 同 curl -G www.baidu.com # 向 httpbin.org 发送 POST 请求 curl -s -X POST "http://www.httpbin.org/post" -H "accept: application/json" # 自定义Header至百度 curl -H "name:zzw" www.baidu.com # 完成请求且成功的操作后输出指定格式的内容到标准输出 curl -s "http://www.baidu.com" -H "Content-Type: text/html;charset=utf-8" -w '\n%{time_total}\n' -d 'wd=json'
- 作者帖子
- 哎呀,回复话题必需登录。