Проверить тело запроса API - PullRequest
0 голосов
/ 28 мая 2018

Я выполняю запрос HTTP Post для API EndPoint.Это грант авторизации пароля протокола OAuth2.

Я получаю обратно код 400, «неверный запрос». Чтобы продвинуться вперед, я хочу получить точный вызов, который я делаю в выражении Log.d .. Мой вопрос состоит в том, как я могу войти точно, что взапрос POST, который я делаю?Мне неясно, как это сделать .. Таким образом, я могу начать отладку ..

Я хотел бы получить что-то вроде

API Call Made = "https://api.allthingstalk.io/login/parameters"..

Сейчас это трудно отладить ..

    // This method gets the AccessToken from the API EndPoint, this token is encoded in a class Token with all its parameters..
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public static Token getAccessToken () {

    Token accessToken = null;
    String urlParameters  = "param1=a&param2=b&param3=c";
    @SuppressLint({"NewApi", "LocalSuppress"}) byte[] postData = urlParameters.getBytes( StandardCharsets.UTF_8 );

    try {
        URL url = new URL("https://api.allthingstalk.io/login");
        HttpURLConnection client = null;

        client = (HttpURLConnection) url.openConnection();
        client.setRequestMethod("POST");
        client.setRequestProperty("grant_type", "password");
        client.setRequestProperty("username", username);
        client.setRequestProperty("password", password);
        client.setRequestProperty("client_id", "com.example.gebruiker.internetofthingsattplatform");
        client.setRequestProperty("Content-Type:", "application/x-www-form-urlencoded");
        client.setUseCaches(false);
        client.setDoOutput(true);

        int status = client.getResponseCode();
        String status_String = Integer.toString(status);
        Log.d(TAG, status_String);

        OutputStream outputStream = new BufferedOutputStream(client.getOutputStream());
        outputStream.write(postData);
        String postData_String = postData.toString();
        Log.d(TAG, postData_String);
        outputStream.flush();
        outputStream.close();


        if (client != null) // Make sure the connection is not null.
            client.disconnect();
    }
    catch(MalformedURLException error) {
    }
    catch(SocketTimeoutException error) {
    }
    catch (IOException error) {
    }

    return accessToken;
}

1 Ответ

0 голосов
/ 28 мая 2018

Во-первых, я бы настоятельно рекомендовал использовать такую ​​библиотеку, как Retrofit , как упомянул @Luis Henriques.Модернизация упрощает многие сложности, возникающие при создании руководства URLConnections.

Тем не менее, вы в значительной степени смотрите на свой запрос в точности так, как он выглядит при отправке.Если вы хотите более детальное представление, я бы рекомендовал изменить ваш URL-адрес на хост, которым вы управляете (например, localhost в настройке дома / офиса), и отслеживать соединение через Wireshark (убедитесь, что вы отправили егокак HTTP, а не HTTPS-запрос).

В качестве потенциальной ошибки вы передаете urlParameters в качестве тела сообщения.Разве вы не хотите, чтобы ваши параметры URL были частью URL?Посмотрите документацию API тоже: grant_type, password, username и client_id, должно быть в вашем теле сообщения не задано как свойство запроса.setRequestProperty устанавливает свойства заголовка.

...