http头部 Expect
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/90
在通过curl调用对方接口时,发现超时现象很严重,于是询问对方接口人,对方说需要加上:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
加上之后发现果然好使了,于是调研了一下该用法。
在使用curl做POST的时候, 当要POST的数据大于1024字节的时候, curl并不会直接就发起POST请求, 而是会分为2个步骤:
- 发送一个请求, 包含一个Expect:100-continue, 询问Server使用愿意接受数据
- 接收到Server返回的100-continue应答以后, 才把数据POST给Server
但是这样会有几个问题:
- 不是所有的服务器都会正确应答100-continue, 比如lighttpd, 就会返回417 Expectation Failed。
- 造成延时,客户端在发送第一次的Expect:100-continue时,需要等待服务器端进行回答之后才发送request body。
如果确定对方的服务器不会拒绝1024个字节以上的POST请求,就可以不使用该方法而且也可以避免以上提到的两个副作用,解决的办法就是文章开头提到的。
关于100 continue
收到了请求的初始部分,请客户端继续。
这样做的目的是:它可以让客户端在发送请求数据之前去判断服务器是否愿意接收该数据,如果服务器愿意接收,客户端才会真正发送数据,如果客户端直接发送请求数据,但是服务器又将该请求拒绝的话,这种行为将带来很大的资源开销。
客户端行为
发送了100 continue的客户端不应该永远等待服务器端做出回应,超时一段时间之后,客户端应该直接将实体发送出去。
服务器端行为
如果服务器端收到了100 continue的请求,它会用100 continue响应或者发送一个错误码。服务端永远不能向没有发送100 continue的客户端发送100 continue。但是有的服务器会这么做。IIS 5 incorrectly sending 100-continue response
如果服务端在还没发送100 continue响应时就收到了客户端的body,那么说明客户端决定开始发送数据了,所以此时服务器端不能再向客户端发送100 continue。
参考资料:Expect:100-continue
http权威指南3.4.1
http头部 Expect的更多相关文章
- Tomcat剖析(四):Tomcat默认连接器(2)
Tomcat剖析(四):Tomcat默认连接器(2) 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三): ...
- (译)开发优秀的虚拟现实体验:从开发I Expect You to Die中总结的六个要点
这篇文章是我从网上找来的,我觉得他非常详细的解释了VR发展的需求和必要.我认为通过这篇文章可以让大家了解VR. 译者写在最前: 来到追光动画有好几个月了,抱歉这段时间也没有什么文章与大家分享,我现在在 ...
- Expect安装方法
Expect安装方法 http://bluethink.iteye.com/blog/1079044 Tcl脚本SSHITeyeUnix Expect是基于Tcl语言的一种脚本语言,其实无论是交互还 ...
- expect交互式自动化脚本
一 什么是expect 1 Expect is a tool for automating interactive applications such as telnet, ftp, passwd, ...
- HTTP头部字段总结【转】
原作者: 留七七, 地址:http://www.jianshu.com/p/6e86903d74f7 一.常用标准请求头字段 Accept 设置接受的内容类型 Accept-Charset 设 ...
- HTTP系列1番外之头部字段大全
原文地址:https://www.jianshu.com/p/6e86903d74f7 常用标准请求头 字段 属性 举例 Accept 设置接受的内容类型 Accept: text/plain Acc ...
- .NetCore HttpClient发送请求的时候为什么自动带上了一个RequestId头部?
奇怪的问题 最近在公司有个系统需要调用第三方的一个webservice.本来调用一个下很简单的事情,使用HttpClient构造一个SOAP请求发送出去拿到XML解析就是了. 可奇怪的是我们的请求在运 ...
- shell脚本实现文件的自动上传以及下载 scp sftp lftp 还有expect命令
转至: 最近需求要求定期从一个[定期更新的文件] 中解析员工信息 ,插入到数据库中. 按理来说很简单, 无非就是io流读文件,然后crud balalalala..... 其实不是的, 我我写的这个 ...
- expect用法
1. [#!/usr/bin/expect] 这一行告诉操作系统脚本里的代码使用那一个shell来执行.这里的expect其实和linux下的bash.windows下的cmd是一类东西. 注意: ...
随机推荐
- Gotorch - 多机定时任务管理系统
* { color: #3e3e3e } body { font-family: "Helvetica Neue", Helvetica, "Hiragino Sans ...
- spring boot 错误,求大神帮解决
Exception in thread "main" java.lang.IllegalStateException: Failed to read Class-Path attr ...
- LCD显示GPS时钟[嵌入式系统]
夏任务102:做一个GPS钟 实验要求 用RPi的串口连接一个GPS模块,从GPS得到实时时间,在7段数码管或LCD上显示 实验工具: Raspberry Pi Model B主机, 8G c10 S ...
- 制作支持 BIOS+UEFI 的 U 盘 grub2+bootmgr 引导 + deepin_recovery + deepin_iso + win_pe
网盘下载:https://pan.baidu.com/s/1c2GXPo0 U盘为 FAT32,MBR分区表 1.下载:U盘grub2+bootmgr引导2017.12.6.2.7z 2.解压到 U盘 ...
- 使用python
最近看视频学习,老师布置了个作业,关于如何使用python将多个excel进行合并,老师写的代码我感觉比较复杂,下面是我自己改良之后较简单的方式. 实现这个功能主要有两种方法,一种是用xlwd,xls ...
- php intval()和floatval()
intval -- 获取变量的整数值 floatval -- 获取变量的浮点值 <?php $a = 26; $b = 4; $a/=$b; echo intval($a);//6 echo f ...
- velocity 是如何实现内省 屏蔽反射的
velocity的标签中支持$abc 这样的语法,如果abc是一个对象,则写模板时就可以利用它来进行反射,调用一些危险的方法,如 $vm.getClass().newInstance() #set ( ...
- SpringData 基于SpringBoot快速入门
SpringData 基于SpringBoot快速入门 本章通过学习SpringData 和SpringBoot 相关知识将面向服务架构(SOA)的单点登录系统(SSO)需要的代码实现.这样可以从实战 ...
- PHP之外观模式
外观(Facade)模式 当使用子系统的代码时,你也许会发现自己过于深入地调用子系统的逻辑代码.如果子系统代码总是在不断变化,而你的代码却又在许多不同地方与子系统代码交互,那么随着子系统的发展,你也许 ...
- java学习笔记之日期日历类
java学习笔记之日期日历 Date日期类概述: 表示特定的瞬间,精确到毫秒 Date类的构造方法: 1.空参数构造方法 Date date = new Date(); 获取到当前操作系统中的时间和日 ...