#java #api #authorization #spotify
Вопрос:
Я пытался заставить это работать в течение нескольких дней. Я пытаюсь авторизоваться с помощью Spotify, используя поток авторизации учетных данных клиента с использованием Java. Тем не менее, я продолжаю получать ошибку HTTP с требуемой длиной 411, несмотря на наличие свойства Content-Length.
HttpsURLConnection spotifyAccounts = null;
try {
spotifyAccounts = (HttpsURLConnection) new URL("https://accounts.spotify.com/api/token?grant_type=client_credentials").openConnection();
spotifyAccounts.setDoOutput(true);
spotifyAccounts.setDoInput(true);
spotifyAccounts.setRequestMethod("POST");
String unencodedAuthorizationKey = "Basic " "42f48d16044a4c79b5168c5784889827" ":" "d6bb7a72e99342319e6b6d8c6fd3cedd";
String encodedKey = Base64.getEncoder().encodeToString(unencodedAuthorizationKey.getBytes());
spotifyAccounts.setRequestProperty("Authorization", encodedKey);
spotifyAccounts.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
spotifyAccounts.setRequestProperty("User-Agent", "Mozilla/5.0");
int totalLength = 0;
for(Entry<String, List<String>> entry : spotifyAccounts.getRequestProperties().entrySet()) {
for(String string : entry.getValue()) {
totalLength = string.getBytes().length;
}
}
spotifyAccounts.setRequestProperty("Content-Length", String.valueOf(totalLength));
spotifyAccounts.connect();
} catch(IOException ex) {}
Каждый раз, когда я получаю ошибку 411, я выводю значение свойства запроса длины содержимого примерно так:
int code = 0;
try {
code = spotifyAccounts.getResponseCode();
} catch (IOException ex) {
ex.printStackTrace();
}
if(code != 200) {
if(code == 411) {
System.out.println("Spotify Accounts - Content-Length: " spotifyAccounts.getContentLength());
System.out.println("Spotify Accounts - Connecting User Agent: " spotifyAccounts.getRequestProperty("User-Agent"));
}
// Other error code handling
}
Вывод длины содержимого всегда возвращает значение 1564.
Я перепробовал много вещей, таких как изменение HttpsURLConnection на HttpURLConnection, изменение заголовка типа содержимого и прямое указание длины содержимого на 0. Но все эти решения по-прежнему возвращают ошибку требуемой длины 411. Есть ли что-то еще, что я упускаю, или я чего-то не понимаю?
Ответ №1:
В документации spotify говорится, что вам нужно указать grant_type
в теле запроса, однако ?grant_type=client_credentials
это не работает. Вместо этого вы можете отправить тело, подобное этому:
byte[] input = "grant_type=client_credentials".getBytes(StandardCharsets.UTF_8);
try (OutputStream os = connection.getOutputStream()) {
os.write(input);
}