问题描述:
.net 发送http 请求 采用两种方式(httpclient/ HttpWebRequest),
对方接口 是采用java 搭建的服务器,
但在访问接口 时 ,总是得不到 响应。 但是采用postman 的 话 又可以得到响应结果。
于是采用fiddler 进行 http 请求抓包。 对比 两个 请求的 请求头信息。
发现 postman 中没有 Expect:100-continue 这个请求头 ,但是 自己的 发起的请求中带有这个。
于是 关闭掉 这个请求头
(httpwebrequest: myRequest.ServicePoint.Expect100Continue = false;)
(httpclient: httpClient.DefaultRequestHeaders.ExpectContinue = false;)
然后重新 发起请求,然后 就获得到了 响应
(说明:请求数据只有207 字节,采用post方式)
于是在网上查找 Expect:100-continue 作用是什么:
它可以让客户端在发送请求数据之前去判断服务器是否愿意接收该数据,如果服务器愿意接收,客户端才会真正发送数据,这么做的原因是如果客户端直接发送请求数据,但是服务器又将该请求拒绝的话,这种行为将带来很大的资源开销。所以为了避免这种情况,libcurl在发送大于1024字节的POST请求时采用了这种方法,但是相对的,它会引起请求延迟的加大,另外并不是所有的server都会正确处理并且应答”100-continue“,比如lighttpd,就会返回417”Expectation Failed“,造成请求逻辑出错。
如果确定服务器不会拒绝1024个字节以上的POST请求,就可以不使用该方法而且也可以避免以上提到的两个副作用。
特此 记录该问题。
网友评论