我们用apache的HttpClient这个库消费云端的Restful API时,一般都需要两次HTTP调用,第一次获得某种token,比如获取防止跨域请求伪造攻击Cross-site request forgery - CSRF的token,或者比如微信API的access token,第二次再进行真正的API消费。
通常情况下,第一次请求完毕后,服务器都会给客户端返回一些cookie字段,在第二次请求时,如果使用的是postman测试工具或者apache的HttpClient这个库,cookie字段都会自动被附加在第二次请求的HTTP头部。详情可以参考我写的另一篇博客:OData service parallel performance measurement – how to deal with XSRF token in Java Program and JMeter
https://blogs.sap.com/2017/08/28/odata-service-parallele-performance-measurement-how-to-deal-with-xsrf-token-in-java-program-and-jmeter/
本文就来介绍apache的HttpClient,在发送第二个Http请求时,是如何自动插入从第一个请求获得的服务器颁发的cookie的。
首先进入HttpClient的单步调试:InternalHttpClient.doExecute方法:
第85行的origheaders,即取出程序员在代码里指定的http请求头部字段,比如basic Authentication,content-type,token等等:
这个cookie是什么时候传进来的?
看来我们必须进入httpcore-4.4.3.jar这个apache HttpClient的实现里去调试。
经过观察发现,一旦我执行完204行的conn.sendRequestHeader方法,就能观察到Cookie被自动设置了,所以奥妙就在第204行里。
自动添加Content-Length头部字段:
由此可见Content-length是通过方法entity.getContentLength()自动计算出来的,因此我们程序员不必在自己的应用代码里重复这个计算动作。
自动加入host字段:
自动加入Connection: Keep-Alive
UserAgent的自动填充:Apache-HttpClient/4.5.1, 这个也不用程序员操心。
终于到了我要找的RequestAddCookies这个HTTPRequestInterceptor了。光从这个类的字面意思就能猜到它和HTTP请求的Cookie有关。
新建一个Cookie,这个CookieOrigin构造函数里的hpst,path和secure标志位都是Chrome开发者工具的Cookie标签页里能看到。
从 Cookie Store里取出前一次请求中由服务器返回的Cookie:
这里把Cookie store里的cookie加到第二个请求的头部字段,谜底就这样解开了。
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
相关推荐
在Android开发中,由于HttpClient库的稳定性和强大的功能,即使在Android API级别33及更高版本中不再内置,许多开发者依然选择使用Apache HttpClient,包括`org.apache.http.entity.mime`包中的类,来进行网络通信和...
5. **设置请求头**: 如果服务器需要特定的头部信息,比如`Content-Type`或`Authorization`,可以使用`setHeader`方法来添加。 6. **执行请求**: 将构建好的请求通过HttpClient发送出去,调用`execute`方法。这将...
在Java中,我们可以使用多种库来执行POST请求,如Apache HttpClient、OkHttp或者Java内置的HttpURLConnection。这里我们主要以HttpClient为例进行讲解。 1. **Apache HttpClient库的使用**: Apache HttpClient是...
2. **事件驱动**:通过回调函数,HttpParser可以在解析过程中触发特定事件,如遇到请求行、头部字段或主体内容,使得处理逻辑更加清晰。 3. **低内存消耗**:由于其C语言的实现,HttpParser相比纯Java的解决方案,...
通过源码,我们可以学习如何设置和获取 HTTP 头部字段,如何处理不同类型的请求体(如表单数据、文件上传),以及如何解析响应状态码和响应体。 4. **认证和安全机制**:HttpClient 支持多种认证机制,如 Basic、...
根据提供的代码片段和描述信息,我们可以看到在使用HttpClient进行POST请求时,设置了四个重要的HTTP头部信息:`Referer`、`Content-Type`、`Accept`和`User-Agent`。下面将详细介绍这四个头部信息的作用及如何正确...
10. **实战应用**:本教程将通过一系列实例,演示如何在实际项目中使用HttpClient进行网络请求,包括简单的GET请求、复杂POST请求、处理文件上传下载、处理异常情况等。 通过阅读《HttpClient完美教程》,开发者...
**HttpClient**是Apache组织下的一款开源库,主要用于Java应用中发送HTTP请求和处理响应。它提供了一种高效、灵活的方式,来构建和执行HTTP请求,同时支持HTTPS协议。在HttpClient中,**HttpCore**扮演着核心组件的...
在实际开发中,除了`HttpURLConnection`,我们还可以使用第三方库,如Apache HttpClient或OkHttp,它们提供了更丰富的功能和更好的性能。 至于压缩包子文件的文件名称列表"com",这看起来像是一个被打包的Java项目...
**2.8 HttpClient代理配置**:介绍如何配置HttpClient使用代理服务器进行网络请求。 #### 三、状态管理 **3.1 HTTP Cookie** - **3.1.1 Cookie版本**:解释不同版本Cookie之间的差异。 - **3.2 Cookie规范**:...
在Java中,我们可以使用HttpURLConnection或Apache HttpClient库来发送这样的请求。这些库提供了发送HTTP请求和处理响应的功能。 1. **HttpURLConnection**:这是Java标准库的一部分,可以用来发送GET和POST请求。...
3. **字段处理器**:对MIME头部的各个字段进行操作,支持添加、删除和修改。 4. **内容处理器**:处理MIME内容,可以是文本、二进制数据或其他MIME消息。 5. **MIME树模型**:提供了一种结构化的方式来表示MIME消息...
下面是一个简单的Java `HttpClient`使用示例,展示如何发送GET请求和将响应写入文件: ```java import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org....
2. 转向处理:如果服务器返回301(永久重定向)或302(临时重定向),HttpClient不会自动处理,需要手动获取“Location”头部并构造新的请求。 3. 关闭连接:在完成请求后,记得关闭HttpClient的连接,释放资源。 `...
4. **发送请求**:使用Java的`HttpURLConnection`或第三方库如Apache HttpClient、OkHttp等发送带有这些安全头的HTTP请求。 在压缩包中的Java代码实现了这个过程,可以作为开发者在与CSDN博客API交互时的一个参考。...
要使用基本认证访问API,客户端需要在每个请求中添加`Authorization`头部,其值的格式为`Basic base64-encoded(username:password)`。首先,将用户名和密码连接成`username:password`字符串,然后对这个字符串进行...
这就是Apache HttpClient项目中的httpmime-4.5.jar包,它为开发者提供了一套强大的工具,用于处理HTTP请求中的多部分数据和MIME类型。 httpmime-4.5.jar是Apache HttpClient库的一部分,该库是一个Java实现的HTTP...
例如,使用Python的requests库,Java的HttpURLConnection或Apache HttpClient,JavaScript的fetch或axios库等,可以方便地创建和发送HTTP请求,获取响应,并进行解析处理。 在`http-call.docx`这个文档中,可能包含...
在Java中,我们可以使用多种库来处理HTTP请求和JSON数据,例如使用`HttpURLConnection`类来构建基础的HTTP请求,或者使用Apache HttpClient等更高级的库来简化操作。对于JSON解析,通常会用到如Jackson、Gson或org....
2. HTTP协议理解:为了正确处理HTTP请求和响应,开发者需要熟悉HTTP协议的细节,包括请求方法(GET、POST等)、状态码、头部字段等。 3. HttpURLConnection和HttpClient:Java内置了HttpURLConnection类,它是处理...