У меня есть работающая программа на 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, как и ожидалось. Есть идеи?
Здесь просто выстрел в темноту, но, может быть, Python заботится о кодировании этих пробелов в пути URL, а Java — нет? Попробуйте еще раз, заменив пробелы на +
или %20
, может быть... (Редактировать: проверенные документы, и они упоминают об этом, поэтому обновляйте, чтобы ответить.)
Проверить 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/
andhttp://foo.com/hello%20world
would be considered not equal to each other.
Ваш URL содержит пробелы, поэтому вам необходимо явно закодировать их. Я думаю, Python делает это автоматически.
Я предполагаю, что Python и мой браузер Chrome делают это за меня. Их добавление решило проблему. Спасибо.
Не могли бы вы попробовать отправить те же запросы с закодированным именем пользователя и паролем через какую-нибудь программу, например Postman?