Loopj Put и Post с базовым auth возвращают нулевой ответ без ошибок - PullRequest
0 голосов
/ 10 ноября 2018

Это попытка использовать Loopj для синхронного вызова пут и пост из класса утилит HTTP. В коде используется синхронный клиент, поскольку он используется внутри AsyncTask, и некоторые взаимодействия с пользовательским интерфейсом сильно зависят от ответа json, поэтому AsyncTask управляет выполнением вызова асинхронно.

Все вызовы get из класса утилит HTTP работают успешно. Пост и пут нет, и они оба, похоже, имеют ту же проблему.

Строка json создается с помощью Gson. Я протестировал вывод json из приложения непосредственно в Postman, и он отправляет API точно так, как ожидалось, поэтому он выглядит хорошо сформированным и ведет себя полностью, как и ожидалось, без каких-либо ошибок.

Вызовы put и post создаются без ошибок. Добавляется базовая авторизация (как показано на экземпляре клиента). Метод put SyncHTTPClient вызывается с использованием нулевого параметра контекста. Я провел небольшое исследование и нашел один пост, где это делалось успешно.

https://github.com/loopj/android-async-http/issues/1139

Вызов put вызывается, но не вводит переопределенные методы обработчика. Он просто возвращает ноль. Я включил часть рабочего класса для просмотра:

public void executePutSave(String name, String pass, String jsonBody) {
    client.setBasicAuth(name, pass);
    executeLoopJPutCall("/api/Save", jsonBody);
}

public void executeLoopJPutCall(String relativeUrl, String jsonBody) {
    String url = getAbsoluteUrl(relativeUrl);
    StringEntity entity = new StringEntity(jsonBody, "UTF-8");
    jsonResponse = null;
    client.put(null, url, entity, "application/json", new JsonHttpResponseHandler() {
                @Override
                public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                    super.onSuccess(statusCode, headers, response);
                    jsonResponse = response.toString();
                    Log.i(TAG, "onSuccess: " + jsonResponse);
                }
                @Override
                public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) { 
                    super.onFailure(statusCode, headers, throwable, errorResponse);
                    jsonResponse = errorResponse.toString();
                    Log.e(TAG, "onFailure: " + statusCode + errorResponse );
                }
            }
    );
}

1 Ответ

0 голосов
/ 12 ноября 2018

Таким образом, очевидно, что заголовок должен быть явно добавлен при использовании приведенного выше кода для Post или Put json для API. Как только я изменил строку аутентификации заголовка из этого:

client.setBasicAuth(name, pass);

К этому:

    String userpass = name + ":" + pass;
    String encoded = new String(Base64.encode(userpass.getBytes(),Base64.NO_WRAP));
    client.addHeader("Authorization", "Basic "+encoded);

... все работало как положено.

Я нашел информацию в этом блоге: https://github.com/loopj/android-async-http/issues/113

Передача нулевого контекста тоже работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...