Преобразование веб-запроса REST из Python в Java

У меня есть работающая программа на Python, и я пытаюсь преобразовать ее в Java.

webCmd = "http://192.168.1.xxx/rest/nodes/21 F1 DD 1/ST"
r = requests.get(webCmd, timeout=(0.1,2), auth=('username', 'password'))  

Я новичок в Java, и мой код не работает.

String authString = "username" + ":" + "password";
String encodedAuth = Base64.getEncoder().encodeToString(authString.getBytes());
String authHeader = "Basic " + encodedAuth;

webCmd = "http://192.168.1.xxx/rest/nodes/21 F1 DD 1/ST";

HttpURLConnection connection = (HttpURLConnection) new URL(webCmd).openConnection();
connection.setRequestProperty ("Authorization", authHeader);
connection.setRequestMethod("GET");

int responseCode = connection.getResponseCode();

Если я запускаю приведенный выше код, я получаю ошибку 404. Если я вставляю webCmd в браузер, он запрашивает имя пользователя, пароль и отвечает правильным выводом xml. Если я закомментирую строку setRequestProperty, то ответ будет 401, как и ожидалось. Есть идеи?

Не могли бы вы попробовать отправить те же запросы с закодированным именем пользователя и паролем через какую-нибудь программу, например Postman?

Naya 09.04.2019 18:24

Здесь просто выстрел в темноту, но, может быть, Python заботится о кодировании этих пробелов в пути URL, а Java — нет? Попробуйте еще раз, заменив пробелы на + или %20, может быть... (Редактировать: проверенные документы, и они упоминают об этом, поэтому обновляйте, чтобы ответить.)

Christoph Burschka 09.04.2019 18:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
127
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проверить https://docs.oracle.com/javase/8/docs/api/java/net/URL.html

Конкретно

The URL class does not itself encode or decode any URL components according to the escaping mechanism defined in RFC2396. It is the responsibility of the caller to encode any fields, which need to be escaped prior to calling URL, and also to decode any escaped fields, that are returned from URL. Furthermore, because URL has no knowledge of URL escaping, it does not recognise equivalence between the encoded or decoded form of the same URL. For example, the two URLs:

http://foo.com/hello world/ and http://foo.com/hello%20world

would be considered not equal to each other.

Ваш URL содержит пробелы, поэтому вам необходимо явно закодировать их. Я думаю, Python делает это автоматически.

Я предполагаю, что Python и мой браузер Chrome делают это за меня. Их добавление решило проблему. Спасибо.

GaryK4 09.04.2019 20:01

Другие вопросы по теме