Reddit api Oauth: сервер вернул код ответа HTTP: 411 для ошибки URL - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь получить токен доступа от https://www.reddit.com/api/v1/access_token.. Для этого мне нужно отправить CLIENT_ID и CLIENT_SECRET по указанному выше URL.Я сделал это, используя Почтальон:

enter image description here

Как показано на скриншоте, я отправил grant_type в качестве GET параметра со значением client_credentials и параметр Authorization со значением Basic heregoestheencodedkeyandid.Тип reuest был установлен как POST.Он работал правильно - я получил токен доступа в ответе JSON.

Однако, когда я пытаюсь сделать то же самое с помощью Java, я получаю ошибку Server returned HTTP response code: 411:

public class RedditExample {
        private static String loginLink = "https://www.reddit.com/api/v1/access_token";

 public static void main(String[] args)  {
                RedditExample redditExample = new RedditExample ();

                redditExample.login();
        }

public boolean login()  {
            try  {
                URL loginURL = new URL(loginLink + "?grant_type=client_credentials");
                HttpURLConnection connection = (HttpURLConnection) loginURL.openConnection();
                setupPOSTConnection(connection);

                InputStream input = connection.getInputStream();
                String inputString = new Scanner(input, "UTF-8").useDelimiter("\\Z").next();

                System.out.println(inputString);
            }

            catch (Exception e) {
                System.out.println(e.toString());
            }

            return true;
        }

private static void setupPOSTConnection(HttpURLConnection connection) throws Exception  {
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");

            connection.setRequestProperty("Authorization", "Basic heregoestheencodedkeyandid");
            connection.connect();
        }
}

Я не уверен, что я делаю здесь по-другому, по сравнению с почтальоном, поэтому любая помощь будет оценена.

РЕДАКТИРОВАТЬ: Вот что я пытался добавить:

connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

connection.setDoInput(true); connection.setDoOutput(true); connection.setRequestProperty("Content-Length", "0"); connection.setRequestProperty("Content-Length", "10");

String userAgent = "test /u/someuser";
connection.setRequestProperty("User-Agent", userAgent);

К сожалению, ни сработало - ошибка все та же.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Установка длины содержимого явно не принимается HttpUrlConnection.Так что просто предоставьте тело запроса без содержимого.

StringBuilder postDataBuilder = new StringBuilder();
        byte[] postData = postDataBuilder.toString().getBytes("UTF-8");

        OutputStream out = conn.getOutputStream();
        out.write(postData);
        out.close();

Так что метод будет таким: -

private static void setupPOSTConnection(HttpURLConnection connection) throws Exception  {
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");

            connection.setRequestProperty("Authorization", "Basic heregoestheencodedkeyandid");
StringBuilder postDataBuilder = new StringBuilder();
        byte[] postData = postDataBuilder.toString().getBytes("UTF-8");

        OutputStream out = conn.getOutputStream();
        out.write(postData);
        out.close();
            connection.connect();
        }

Также я нашел другой способ простого добавления одной строки: -

private static void setupPOSTConnection(HttpURLConnection connection) throws Exception  {
                connection.setDoOutput(true);
                connection.setRequestMethod("POST");

                connection.setRequestProperty("Authorization", "Basic heregoestheencodedkeyandid");
    conn.setFixedLengthStreamingMode(0);
                connection.connect();
            }
0 голосов
/ 29 августа 2018

HTTP-код состояния 411 (требуемая длина) отправляется сервером как ответ, когда он по какой-либо причине отказывается принять сообщение без заголовка длины содержимого.Сервер просто может или не может принимать контент без заголовка Content-Length, и кажется, что этот API требователен.См. этот пост , подробно описывающий работающее POST-соединение с использованием Java.

...