Сбой метода Loopj Post - ошибка при попытке отправить сообщение JSON

Я работаю в приложении для Android, которое должно отправлять электронную почту пользователя с помощью почтового метода. Конечная точка API находится по адресу https://api-iddog.idwall.co/, когда я уже запускаю некоторые тесты и смогли получить значения отсюда. Я использую библиотеку Loopj.

Однако мне было поручено использовать эту конечную точку:

https://api-iddog.idwall.co/signup

Руководство по документации показывает, что мне нужно построить метод POST, используя следующие параметры:

используя заголовок Content-Type: application/json

и URL сообщения должен быть примерно таким:

Почтовый документ API

Имея все это в виду, я создал метод с именем attempPost(). В этом методе я создаю объект AsyncHttpRequest, объект RequestParams и сохраняю действительный адрес электронной почты, введенный пользователем.

private void attempPost() {

    AsyncHttpClient client = new AsyncHttpClient();
    RequestParams params = new RequestParams();

    String url = "https://api-iddog.idwall.co/signup";
    String userEmail = userEmailView.getText().toString();

    JSONObject jsonEmail = new JSONObject();
    try {
        jsonEmail.put("email", userEmail);

    } catch (JSONException e) {
        e.printStackTrace();
    }
    Log.d("Dog", " " + jsonEmail.toString());


    params.put("-d", jsonEmail);
    client.addHeader("Content-Type", "application/json");
    client.post(url, params, new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
            Log.d("Dog", "onSucess" + responseBody.toString());

        }

        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {

            Log.e("Dog", "" + error.toString());

        }
    });



}

Этот метод вызывается в OnclickListener, и журнал возвращает сообщение BadRequest и код состояния 400. Я уже пытался применить некоторые примеры кода из документа Loopj, но у меня не получилось. Может ли кто-нибудь дать мне представление о том, что я делаю неправильно? Из того, что я могу понять, ответ об успехе должен быть строкой (токен), и мне нужен этот токен для завершения проекта.

РЕДАКТИРОВАТЬ.

Я немного поработал над документацией и другими примерами здесь, в стеке, и нашел это: https://stackoverflow.com/questions/13052036/posting-json-xml-using-android-async-http-loopj

В принятом ответе есть пример того, как публиковать JSON.

Затем я внес несколько изменений в свой метод attempPost.

private void attempPost() {

    AsyncHttpClient client = new AsyncHttpClient();
    RequestParams params = new RequestParams();


    String url = "https://api-iddog.idwall.co/signup";
    String userEmail = userEmailView.getText().toString();

    JSONObject jsonParams = new JSONObject();
    try {
        jsonParams.put("email", "[email protected]");
    } catch (JSONException e) {
        e.printStackTrace();


    }

    client.post(getApplicationContext(), url, jsonParams, "application/json", new AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
            Log.d("Dog", "onSucess" + responseBody.toString());

        }

        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
            Log.e("Dog", "" + error.toString());
            Log.e("Dog", "status code " + String.valueOf(statusCode));
        }
    });

}

Но Android Studio говорит мне преобразовать jsonParams в сущность. В примере, который я получил из стека, для этого используется следующий код:

StringEntity entity = new StringEntity(jsonParams.toString());

Однако моя студия Android получает ужас, который говорит:

Необработанное исключение: java.io.UnsupportedEncodingException,

До этого момента я не мог найти способ решить эту проблему.


person Arthur Gomes da Silva    schedule 03.10.2018    source источник
comment
Content-Type не является параметром. Это заголовок.   -  person Roddy of the Frozen Peas    schedule 03.10.2018
comment
@RoddyoftheFrozenPeas Как я могу добавить этот новый заголовок?   -  person Arthur Gomes da Silva    schedule 03.10.2018
comment
Я добавил client.addHeader(Content-Type, application/json); и удалил params.put(Content-Type,äpplication/json), но кажется, что loopj все еще пытается использовать другой заголовок при отправке метода POST.   -  person Arthur Gomes da Silva    schedule 04.10.2018


Ответы (1)


Мне удалось заставить его работать, теперь API возвращает правильный ответ и код состояния 200. Я преобразовал JsonObject в ByteArrayEntity, поскольку StringEntity не был вариантом.

private void attempPost() {

    AsyncHttpClient client = new AsyncHttpClient();
    RequestParams params = new RequestParams();

    String userEmail = userEmailView.getText().toString();

    JSONObject jsonParams = new JSONObject();
    try {
        jsonParams.put("email", userEmail);
    } catch (JSONException e) {
        e.printStackTrace();


    }

    ByteArrayEntity be = new ByteArrayEntity(jsonParams.toString().getBytes());


    //TODO create a class to handle JSON post, getmethods and parse token value
    client.post(getApplicationContext(), API_URL, be, "application/json", new JsonHttpResponseHandler() {


        @Override
        public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
            super.onSuccess(statusCode, headers, response);
            Log.d("Dog", "onSucess " + response.toString());
            Log.d("Dog", "status code " + String.valueOf(statusCode));
        }

        @Override
        public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
            super.onFailure(statusCode, headers, throwable, errorResponse);
            Log.e("Dog", "" + errorResponse.toString());
            Log.e("Dog", "status code " + String.valueOf(statusCode));
        }


    });

}
person Arthur Gomes da Silva    schedule 04.10.2018