zoukankan      html  css  js  c++  java
  • 关于HTTP请求返回417 “Expectation Failed”

    在使用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.1节)的目的在于允许客户端判定服务器是否愿意接受客户端发来的消息主体(基于请求头域)在客户端发送此请求消息主体前。 在有些情况下,如果服务器拒绝查看消息主体,这时客户端发送消息主体是不合适的或会降低效率。)

    其实关键就在的Http1.1限制了要先握手,我们这样想一下,如果我们选择不握手是不是就行了,当然是可以的。处理方法如下

    可以直接在Http请求之前加上这么一句

    System.Net.ServicePointManager.Expect100Continue = false //不握手直接请求

     

  • 相关阅读:
    Cobar-Client 实现策略总结
    xsltproc docbook 转 html
    一个使用高并发高线程数 Server 使用异步数据库客户端造成的超时问题
    Hessian 初探
    关于 tomcat nio connector, servlet 3.0 async, spring mvc async 的关系
    Two-Phase Commit (两阶段提交)
    HashedWheelTimer 原理
    Photoshop 使用曲线
    Photoshop 使用可选颜色
    MySQL Batch 与 Transaction
  • 原文地址:https://www.cnblogs.com/testsec/p/6129004.html
Copyright © 2011-2022 走看看