охттп запрос с аутентификацией - PullRequest
0 голосов
/ 30 марта 2020

Я использую библиотеку okhttp (4.4.0) java, чтобы отправить запрос на публикацию в созданный мной веб-сервис. Кроме того, этот веб-сервис требует базовой аутентификации c и принимает только пост-запросы. Веб-служба находится за прокси-сервером, который просто перенаправляет запросы https на запросы http через порт 8080. Мой код выглядит следующим образом:

    ...
    RequestBody formBody = new FormBody.Builder()
                        .add("foo", this.foo)
                        .add("bar", this.bar)
                        .build();

    Request request = new Request.Builder()
                        .url("https://localhost/myWebApp")
                        .addHeader("User-Agent", "OkHttp Bot")
                        .addHeader("Authorization", Credentials.basic("myUser", "myPwd"))
                        .post(formBody)
                        .build();
    try (Response response = client.newCall(request).execute()) {
      if (!response.isSuccessful()) {
        throw new IOException("Unexpected code " + response);
      }
      return response.body().bytes();
    } catch (IOException e) {
      e.printStackTrace();
    }
    ...

Запрос не выполняется со следующей ошибкой:

Unexpected code Response{protocol=http/1.1, code=501, message=Not Implemented, url=https://localhost/myWebApp/}

Метод doGet веб-службы 'myWebApp' настроен на отправку сообщения о состоянии 501 Не реализовано. Но когда я выполняю пост-запрос, метод doGet не должен вызываться.

Просматривая журнал доступа моего веб-сервера, я обнаружил следующее:

    127.0.0.1 - - [30/Mar/2020:09:05:24 +0200] "POST /myWebApp HTTP/1.1" 302 -
    127.0.0.1 - myUser [30/Mar/2020:09:05:25 +0200] "GET /myWebApp/ HTTP/1.1" 501 1029

Итак, есть и почтовый запрос, и запрос на получение. Похоже, что сначала делается попытка отправить тело сообщения (без аутентификации?), А затем запрос get с аутентификацией, который был отклонен моим веб-сервисом.

Есть ли способ заставить это работать для меня? Я что-то пропустил? Пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Так что, похоже, я решил свою проблему. Спасибо @Yuri за указание на меня. Я просто добавил "/" в конце URL в моем коде, и это сработало как шарм.

...
 Request request = new Request.Builder()
                        .url("https://localhost/myWebApp/")
                        .addHeader("User-Agent", "OkHttp Bot")
                        .addHeader("Authorization", Credentials.basic("myUser", "myPwd"))
                        .post(formBody)
                        .build();
...

По какой-то причине (я пока не знаю, но, может быть, кто-то другой может меня просветить) любой заданный URL без завершающего sla sh перенаправляется на тот же URL с завершающим sla sh. Стандартные браузеры могут справиться с этим обстоятельством, кажется, клиент okhttp борется там.

0 голосов
/ 30 марта 2020

Ваш сервер должен вернуть запрос 401 для аутентификации клиента. Но отправляет 302 по какой-то причине. Это настройка для перенаправления пользователя в браузере с пользовательской страницей входа?

См. https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/Authenticate.java

...