Curl有效,但Jsoup为Spotify API提供405错误

时间:2014-12-23 06:52:16

标签: java curl jsoup httpurlconnection

我能够使用以下来自命令行的调用来卷曲此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错误也失败了。

1 个答案:

答案 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"},因为我没有钥匙,但我觉得你会好的。

我希望它会有所帮助。