1.问题描述
曾经在一次对网易云相关API的学习中,记录过相应的API调用方法
在POSTMAN中,创建POST请求访问过接口,并成功得到歌曲的详细信息:
而如今使用自己编写的网络请求工具包携带param参数创建POST请求,访问后却提示"绑定手机后,可进行下一步操作哦~"
2.问题分析
2.1.疑惑
一开始很疑惑,因为请求头、参数、url等信息都是完全一致的,按理说在POSTMAN请求和在java后端请求是没有区别的。
2.2.原因
后面查阅资料得知,POSTMAN在发送请求后,如果响应中有Set-Cookie,那么POSTMAN会将这段Cookie保存起来。在下一次请求时,将Cookie放入请求头,此时就能得到响应结果。
而在java后端,虽然响应中有Set-Cookie,但程序并不会像浏览器或POSTMAN一样将Cookie保存起来。因此我们需要自行从响应中的Set-Cookie将其取出,并在随后的请求中将这段Cookie加入请求头。
3.解决方案
- 先发送一次请求,得到响应
- 从响应的Set-Cookie中取出Cookie,用变量暂存起来
- 将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;"
那么在设置请求头时,应按如下格式进行设置:
Key | Value |
---|---|
Cookie | NMTID=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.具体实现
请根据自己使用的网络请求包进行适应性调整。这里借助之前我写过的网络请求包完成上述操作:
4.特别声明
对网易云音乐API的部分研究仅做学习交流使用,请勿用作任何商业用途。