本文同时发表在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

转载于:https://www.cnblogs.com/zhangyachen/p/8035625.html

http头部 Expect相关推荐

  1. HTTP--header

    http: 超文本传输协议 HTTP采用了请求响应模型,浏览器或者其它客户端发出请求,服务器给予响应. 包括message-header,message-body俩部分.首先传递message-hea ...

  2. 鲜为人知的HTTP协议头字段详解大全

    继上篇讲了HTTP协议的基础之后,本篇重点介绍一下HTTP常用的Header. HTTP Header非常之多,很少有人能完全分清这些Header到底是干什么的.鉴于RFC文件规范艰深晦涩难懂,本文对 ...

  3. postman发送object_.NetCore HttpClient发送请求的时候为什么自动带上了一个RequestId头部...

    奇怪的问题 最近在公司有个系统需要调用第三方的一个webservice.本来调用一个下很简单的事情,使用HttpClient构造一个SOAP请求发送出去拿到XML解析就是了. 可奇怪的是我们的请求在运 ...

  4. .NetCore HttpClient发送请求的时候为什么自动带上了一个RequestId头部?

    奇怪的问题 最近在公司有个系统需要调用第三方的一个webservice.本来调用一个下很简单的事情,使用HttpClient构造一个SOAP请求发送出去拿到XML解析就是了.可奇怪的是我们的请求在运行 ...

  5. expect() php,Linux expect 的安装

    expect是建立在tcl基础上的一个工具,它还提供了一些Tcl所没有的命令,它可以用来做一些linux下无法做到交互的一些命令操作,在远程管理方面发挥很大的作用. 因为expect是基于tcl的,所 ...

  6. http-head头部信息详解

    Trailer 上面那个就是一个常见的header头部信息(分 request(请求)与resonse()响应两部分),作为一个运维人员可以通过header头部信息获取很多关于网站的信息,下面来逐个介 ...

  7. (译)开发优秀的虚拟现实体验:从开发I Expect You to Die中总结的六个要点

    这篇文章是我从网上找来的,我觉得他非常详细的解释了VR发展的需求和必要.我认为通过这篇文章可以让大家了解VR. 译者写在最前: 来到追光动画有好几个月了,抱歉这段时间也没有什么文章与大家分享,我现在在 ...

  8. HTTP状态查询,HTTP状态码含义,HTTP头部信息查询,http状态码表

    HTTP状态查询,HTTP状态码含义,HTTP头部信息查询,http状态码表 状态码表 状态码 状态码英文名称 中文描述 100 Continue 继续.客户端应继续其请求 101 Switching ...

  9. Linux expect 用法

    expect是建立在tcl基础上的一个工具,它用来让一些需要交互的任务自动化地完成. 因为expect是基于tcl的,所以需要你的系统中安装有tcl 如何检查? [root@dev ~]# where ...

  10. Expect 中文版手册

    本文由gunman翻译,只是希望能提供给大家一个更好的学习Expect的机会.第一次做翻译,其中有不少翻译的有问题的地方,还有一些语句没有翻译,直接写的英文.希望大家能够对照英文原文学习. 在这里要感 ...

最新文章

  1. Java Lambda表达式入门
  2. Simhash算法原理和网页查重应用
  3. 漫画小说听书三合一分销平台源码
  4. 栅格数据矢量化(附有完整代码)
  5. kvaser在linux中的应用
  6. 数字化生产车间可视化管理——电子看板
  7. 2017-9-13 NOIP模拟赛[xxy]
  8. android模拟器 vt,逍遥安卓模拟器VT模式如何设置?VT模式设置流程图文分享
  9. redhat下软件安装
  10. pythonnumpy矩阵详解_基于Python Numpy的数组array和矩阵matrix详解_python
  11. 如何破解已签名JAR包
  12. 大事发生,程序员一直在守护世界
  13. 超全!40000字 Matplotlib 实战
  14. QCustomplot(五)QCPAxisRect进行子绘图
  15. java string占用内存_Java中String到底占用多大的内存空间?
  16. 计算机专业jsp项目,可练手
  17. 为什么默认排除 junit-vintage-engine ?
  18. Windows下快速获取一个文件夹下所有文件的名称列表
  19. OTM区块链应用离我们的生活有多近?
  20. 高分辨率光学遥感图像水体分类综述2022.03

热门文章

  1. Elipse中发布一个Maven项目到Tomcat
  2. GCAlloc 问题一则
  3. Swift 实现图片转字符画的功能
  4. sqlite的Query方法操作和参数详解
  5. 扩展NameValueCollection
  6. BZOJ5212: [Zjoi2018]历史
  7. 403 for URL: http://www.terracotta.org/kit/reflector
  8. supervisord的安装
  9. Hibernate - Query简易
  10. 此时本机的BootLoader程序坏了,也就是说grub第一阶段坏掉了,该如何修复