我能够使用以下来自命令行的调用来卷曲此URL以获取Spotify Web API的访问令牌:
curl -H "Authorization: Basic <Base64 client_id:client_secret>" -d grant_type=client_credentials https://accounts.spotify.com/api/token
我得到了api_token的回复。但是当我尝试通过Jsoup在java中执行此操作时,我收到405错误:
Map<String, String> data = Maps.newHashMap();
data.put("grant_type", "client_credentials");
String clientCred =
new String(
Base64.encodeBase64((CLIENT_ID + ":" + CLIENT_SECRET).getBytes()));
String url = "https://accounts.spotify.com/api/token";
Document doc = Jsoup.connect(URIUtil.encodeQuery(url))
.header("Accept-Language", "en")
.header("Authorization", "Basic " + clientCred)
.header("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8")
.data(data)
.ignoreHttpErrors(true)
.header("Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9"
+ ",*/*;q=0.8")
.get();
我在设置请求参数时做错了什么?我尝试了一个简单的HttpURLConnection,使用相同的请求参数,并且同样的405错误也失败了。
答案 0 :(得分:3)
在-d
中使用curl
标记时,您实际上是在发送POST
。如果您使用POST
制作Jsoup
它将有效。
但是Jsoup
会抱怨org.jsoup.UnsupportedMimeTypeException
因为服务器会回复Content-Type: application/json
。然后你必须添加一个.ignoreContentType(true)
,你就完成了。
代码如下:
Document doc = Jsoup.connect(url)
.header("Accept-Language", "en")
.header("Authorization", "Basic " + clientCred)
.header("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8")
.data(data)
.ignoreHttpErrors(true)
.ignoreContentType(true)
.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9"+ ",*/*;q=0.8")
.post();
顺便说一下,我得到{"error":"invalid_client"}
,因为我没有钥匙,但我觉得你会好的。
我希望它会有所帮助。