1.问题描述

曾经在一次对网易云相关API的学习中,记录过相应的API调用方法

在POSTMAN中,创建POST请求访问过接口,并成功得到歌曲的详细信息:

image-20211113190626557

而如今使用自己编写的网络请求工具包携带param参数创建POST请求,访问后却提示"绑定手机后,可进行下一步操作哦~"

image-20211113190306451

2.问题分析

2.1.疑惑

一开始很疑惑,因为请求头、参数、url等信息都是完全一致的,按理说在POSTMAN请求和在java后端请求是没有区别的。

2.2.原因

后面查阅资料得知,POSTMAN在发送请求后,如果响应中有Set-Cookie,那么POSTMAN会将这段Cookie保存起来。在下一次请求时,将Cookie放入请求头,此时就能得到响应结果。

而在java后端,虽然响应中有Set-Cookie,但程序并不会像浏览器或POSTMAN一样将Cookie保存起来。因此我们需要自行从响应中的Set-Cookie将其取出,并在随后的请求中将这段Cookie加入请求头。

3.解决方案

  1. 先发送一次请求,得到响应
  2. 从响应的Set-Cookie中取出Cookie,用变量暂存起来
  3. 将Cookie添加至请求头,以"Cookie=K1=1V;K2=V2"的形式

3.1.获取Set-Cookie(获取响应头)

调用CloseableHttpClient.execute()发送请求后,能够得到响应模型CloseableHttpResponse。此时再调用CloseableHttpResponse.getAllHeaders()即可获取它的所有响应头

// 1. 创建HttpClient
CloseableHttpClient httpClient = HttpClientBuilder.create().build();

// 2. 创建POST请求
HttpPost httpPost = new HttpPost("http://www.xxx.com");

// 3. 发送请求
CloseableHttpResponse response = httpClient.execute(httpPost);

// 4. 获取所有响应头
Header[] headerArray = response.getAllheaders();

// 5. 遍历以获取名为"Set-Cookie"的响应头,并赋值给变量cookie
String cookie;
for (Header header : headerArray) {
    if ("Set-Cookie".contentEquals(header.getName())) {
        cookie = header.getValue();
    }
}



## 3.2.携带Cookie发起Http请求

将Cookie放入请求的请求头中,其中Key"Cookie"Value为所有Cookie的KV对。假设在上一步中,取得响应头中"Set-Cookie"的值如下:

```java
String cookie = "NMTID=00O9JZUzMMmzHH4wkAVoxJ6fA2qz_EAAAF9CZg1fw; path=/; domain=.music.163.com; Expires=Sat, 08 Nov 2031 11:25:09 GMT;"

那么在设置请求头时,应按如下格式进行设置:

KeyValue
CookieNMTID=00O9JZUzMMmzHH4wkAVoxJ6fA2qz_EAAAF9CZg1fw; path=/; domain=.music.163.com; Expires=Sat, 08 Nov 2031 11:25:09 GMT;

据此,在发送请求时进行如下设置:

//1. 创建POST请求
HttpPost httpPost = new HttpPost("http://www.xxx.com");

//2. 设置请求头
httpPost.setHeader("Cookie", "key1=value1; key2=value2;");

3.2.具体实现

请根据自己使用的网络请求包进行适应性调整。这里借助之前我写过的网络请求包完成上述操作:

image-20211113192521150

4.特别声明

对网易云音乐API的部分研究仅做学习交流使用,请勿用作任何商业用途。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐