我试图通过Authorization Code Flow从spotify网络API获取访问令牌。在curl中执行请求时,它会按预期返回令牌:
curl -H "Authorization: Basic Mj...zk=" -d grant_type=authorization_code -d code=AQ...Ew -d redirect_uri=http://localhost:8081/callback https://accounts.spotify.com/api/token
但是,当我尝试在java代码中执行相同的请求时,我收到400错误请求:
final String url = "https://accounts.spotify.com/api/token";
CloseableHttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("grant_type", "authorization_code"));
params.add(new BasicNameValuePair("code", req.getParameter("code")));
params.add(new BasicNameValuePair("redirect_uri ", "http://localhost:8081/callback"));
httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
httpPost.setHeader(HttpHeaders.AUTHORIZATION,"Basic " + Base64.encodeBase64String(("2...0" + ":" + "4...9").getBytes()));
httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded");
CloseableHttpResponse response = client.execute(httpPost);
System.out.println(response);
这是我得到的错误回复:
HttpResponseProxy{HTTP/1.1 400 Bad Request [Server: nginx, Date: Fri, 06 Oct 2017 21:20:39 GMT, Content-Type: application/json, Content-Length: 68, Connection: keep-alive, Keep-Alive: timeout=600] ResponseEntityProxy{[Content-Type: application/json,Content-Length: 68,Chunked: false]}}
我错过了什么或做错了什么?
答案 0 :(得分:0)
使用StringEntity而不是UrlEncodedFormEntity来修复它自己:
final String url = "https://accounts.spotify.com/api/token";
CloseableHttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded");
httpPost.setHeader(HttpHeaders.AUTHORIZATION, "Basic " + Base64.encodeBase64String(("2...0" + ":" + "4...9").getBytes()));
StringEntity data = new StringEntity("grant_type=authorization_code&&code=" + req.getParameter("code") + "&&redirect_uri=http://localhost:8081/callback");
httpPost.setEntity(data);
HttpResponse response = client.execute(httpPost);