Curl работает, но Jsoup выдает ошибку 405 для Spotify API

1

Я могу скрутить этот 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. Но когда я пытаюсь сделать это в java через Jsoup, я получаю ошибку 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
    Попробуйте добавить реферер и пользовательский агент.
  • 0
    Я тоже попробовал, не получилось. Я также попытался удалить и добавить заголовки, которые я показал выше.
Теги:
curl
jsoup
httpurlconnection

1 ответ

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"} потому что у меня нет ключа, но я думаю, что все будет в порядке.

Надеюсь, это поможет.

  • 0
    Да, сделать это почтовый звонок работает отлично. Большое спасибо. Я новичок в Jsoup и не знаю, когда делать POST-вызовы, против GET, против, когда использовать Jsoup.connect (). Execute () для получения ответа.
  • 0
    Что ж, использование POST или GET - это не вопрос Jsoup, это зависит от того, что ожидает сервер. Вообще говоря, если вы хотите отправить форму (что имеет место), вы захотите сделать сообщение. С другой стороны, использование Jsoup позволяет вам выполнять оба метода http (get и post), но также дает вам объект Response который дает вам больше информации в дополнение к содержимому ответа (например, код состояния и заголовки ответа). Пожалуйста, обратитесь к JSoup документам для получения дополнительной информации документов

Ещё вопросы

Сообщество Overcoder
Наверх
Меню