Android - HttpClient JSON POST с базовой аутентификацией

Я пытаюсь реализовать простую запись JSON для URL-адреса, который принимает JSON в теле с базовой аутентификацией на ANDROID.

Я пробовал с HttpUrlConnection, но я получил "unauthorized", и мои данные отправляются на сервер.

Другим способом, который я пытался использовать, является HttpClient, но теперь у меня другая проблема. Аутентификация работает идеально, но данные не отправляются на сервер...

Чтобы быть уверенным, я настраиваю небольшой тест в простом Java-проекте (не в Android-среде).

Это код, который я использую для POST на сервере:

DefaultHttpClient httpClient = new DefaultHttpClient();
ResponseHandler<String> resonseHandler = new BasicResponseHandler();
HttpPost postMethod = new HttpPost("http://localhost/api/v1/purchase/");    
postMethod.setEntity(new StringEntity("{\"amount_adult\" : 1, \"object_id\" : 13}"));
postMethod.setHeader( "Content-Type", "application/json");
String authorizationString = "Basic " + Base64.encodeToString(("travelbuddy" + ":" + "travelbuddy").getBytes(), Base64.DEFAULT); //this line is diffe
postMethod.setHeader("Authorization", authorizationString);
String response = httpClient.execute(postMethod,resonseHandler);
System.out.println("response :" + response);

Код в проекте Java отлично работает.

Когда я пытаюсь использовать тот же самый код в Android, я получаю internal server error с сервера, а это значит, что данные JSON не были получены.

Я действительно не понимаю, почему это работает в JAVA, но не в Android.

Эффект, который я хотел бы достичь, - это следующая команда:

curl --dump-header - -H "Content-Type: application/json" -X
POST --data '{"amount_adult":1, "object_id":13}' 
--user travelbuddy:travelbuddy http://localhost/api/v1/purchase/

Ответ 1

String authorizationString = "Basic " + Base64.encodeToString(
    ("travelbuddy" + ":" + "travelbuddy").getBytes(),
    Base64.DEFAULT);

...

Решение на самом деле немного проще:

    String authorizationString = "Basic " + Base64.encodeToString(
        ("travelbuddy" + ":" + "travelbuddy").getBytes(),
        Base64.NO_WRAP); // <=== Do not add '\n'

Ответ 2

Наконец, все сортируется. Решением может быть любой, кто может столкнуться с этой проблемой.

String authorizationString = "Basic " + Base64.encodeToString(("travelbuddy" + ":" + "travelbuddy").getBytes(), Base64.DEFAULT); //this line is diffe
postMethod.setHeader("Authorization", authorizationString);

Этот Base64.encodeToString добавляет дополнительный "\n" в конец строки авторизации. Затем на следующей строке сервера после символа "\n" обрабатывается тело запроса и, конечно, неверно.

Заменив все новые строки в строке авторизации, вы решите проблему:

    String authorizationString = "Basic " + Base64.encodeToString(("travelbuddy" + ":" + "travelbuddy").getBytes(), Base64.DEFAULT); //this line is diffe
authorizationString.replace("\n", "");
    postMethod.setHeader("Authorization", authorizationString);

Легкое исправление, но трудно найти; -)

Ответ 3

Я думаю, что самый простой способ:

postMethod.addHeader(BasicScheme.authenticate(new UsernamePasswordCredentials(user, pass), "UTF-8", false));

Ответ 4

Я думаю, вы не должны использовать localhost в url