关于HTTP请求返回417 “Expectation Failed”
2024-10-19 01:30:58
在使用HttpClient默认情况下做POST的时候, HttpClient并不会直接就发起POST请求, 而是会分为俩步,
1.发送一个请求, 包含一个Expect:100-continue, 询问Server使用愿意接受数据,
2.接收到Server返回的100-continue应答以后, 才把数据POST给Server
于是,这样就有了一个问题, 并不是所有的Server都会正确应答100-continue, 比如lighttpd, 就会返回417 “Expectation Failed”, 则会造成逻辑出错
Expect:100-Continue握手的目的,是为了允许客户端在发送请求内容之前,判断源服务器是否愿意接受
请求(基于请求头部)。
Expect:100-Continue握手需谨慎使用,因为遇到不支持HTTP/1.1协议的服务器或者代理时会引起问题。
而HttpClient 4.0中,是否激活Expect:100-Continue,是由HTTP请求执行参数http.protocol.expect-continue来控制的,通过设置参数值为true或者false,可以相应的激活或者关闭Expect:100-Continue握手。注意,在HttpClient中,默认是激活的。
我们来看看Http1.1协议中关于这个的说明吧。
(100状态码(见10..1节)的目的在于允许客户端判定服务器是否愿意接受客户端发来的消息主体(基于请求头域)在客户端发送此请求消息主体前。 在有些情况下,如果服务器拒绝查看消息主体,这时客户端发送消息主体是不合适的或会降低效率。)
其实关键就在的Http1.1限制了要先握手,我们这样想一下,如果我们选择不握手是不是就行了,当然是可以的。处理方法如下
可以直接在Http请求之前加上这么一句
System.Net.ServicePointManager.Expect100Continue = false //不握手直接请求
最新文章
- Javascript设计模式(摘译)
- 就是这么简单!使用Rest-assured 测试Restful Web Services
- python tools: iPython Notebook
- LTIB常用命令1
- angular 零碎知识
- Codeforces Round #303 (Div. 2) B 水 贪心
- Realtek 8168 安装 VMware ESXi 提示没有驱动
- Java虚拟机的内存组成以及堆内存介绍
- jQuery简单前端表单验证
- Ubuntu下搭建FTP服务器
- List集合数据太多进行分批,List的subList方法应用
- .NET Excel导出方法及其常见问题详解
- ALSA和Pulseaudio
- 类别不平衡问题和Softmax回归
- 如何用jQuery获得select的值
- python tkinter-布局
- C#枚举中使用Flags特性
- Oracle RAC 环境下的连接管理(转) --- 防止原文连接失效
- import和require的区别
- Python Numpy模块函数np.c_和np.r_
热门文章
- BZOJ.1070.[SCOI2007]修车(费用流SPFA)
- [HDU4906]Our happy ending
- java计算某个坐标是否在范围内
- 解决IE9下交通银行网上银行无法输入密码的问题
- selenium+python自动化80-文件下载(不弹询问框)
- 你真的会用Gson吗?Gson使用指南(3)
- C++中extern “C”含义及extern、static关键字浅析
- jquery异步ajax与服务器通信过程中如何通过then方法链式传递多层数据
- react 生命周期函数
- fiddler抓包参数乱码的解决方法