Вы можете использовать публичный наблюдаемый список для хранения общедоступных данных или просто создать общедоступный метод настройки для хранения данных и получения из соответствующего контроллера
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
String encoded = Base64.getEncoder().encodeToString((username+":"+password).getBytes(StandardCharsets.UTF_8)); //Java 8
connection.setRequestProperty("Authorization", "Basic "+encoded);
Затем используйте соединение как обычно.
Если вы используете Java 7 или ниже, вам понадобится метод для кодирования String для Base64, например:
byte[] message = (username+":"+password).getBytes("UTF-8");
String encoded = javax.xml.bind.DatatypeConverter.printBase64Binary(message);
Да, это все, что вам нужно сделать, чтобы использовать Basic Auth. Код, указанный выше, чтобы установить свойство Request, должен быть выполнен сразу после открытия соединения и до получения входных или выходных потоков.
Вы можете использовать java.net.Authenticator для настройки базового auth. глобально для каждого запроса, отправляемого вашим приложением, см .:
Что касается проблемы кодирования Base64, я нашел эту библиотеку: http://sourceforge.net/projects/migbase64/
Я еще не полностью проверил ее, но я использую это для решения базовой проверки подлинности, показанного выше (а также для кодирования / декодирования изображения), и оно работает хорошо. Он предоставляет параметр для включения или отсутствия новой строки.
У меня тоже была эта проблема. И теперь я решил эту проблему. Мой код:
URL url = new URL(stringUrl);
String authStr = "MyAPIKey"+":"+"Password";
System.out.println("Original String is " + authStr);
// encode data on your side using BASE64
byte[] bytesEncoded = Base64.encodeBase64(authStr .getBytes());
String authEncoded = new String(bytesEncoded);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Authorization", "Basic "+authEncoded);
Это может помочь многим другим. Удачи.
Кстати, в случае, если кто-то другой сталкивается с этим, проблема с андроидом также присутствует, если вы используете org.apache.commons.codec.binary.Base64
и do Base64.encodeBase64String()
. Вам нужно сделать Base64.encodeBase64()
и получить байт [], затем построить строку.
Это полностью задело меня, что результаты будут разными для строки, заканчивающейся между этими двумя методами.
вам нужно сделать это, просто скопируйте его, чтобы он был счастлив
HttpURLConnection urlConnection;
String url;
// String data = json;
String result = null;
try {
String username ="danish.hussain@gmail.com";
String password = "12345678";
String auth =new String(username + ":" + password);
byte[] data1 = auth.getBytes(UTF_8);
String base64 = Base64.encodeToString(data1, Base64.NO_WRAP);
//Connect
urlConnection = (HttpURLConnection) ((new URL(urlBasePath).openConnection()));
urlConnection.setDoOutput(true);
urlConnection.setRequestProperty("Content-Type", "application/json");
urlConnection.setRequestProperty("Authorization", "Basic "+base64);
urlConnection.setRequestProperty("Accept", "application/json");
urlConnection.setRequestMethod("POST");
urlConnection.setConnectTimeout(10000);
urlConnection.connect();
JSONObject obj = new JSONObject();
obj.put("MobileNumber", "+97333746934");
obj.put("EmailAddress", "danish.hussain@dhl.com");
obj.put("FirstName", "Danish");
obj.put("LastName", "Hussain");
obj.put("Country", "BH");
obj.put("Language", "EN");
String data = obj.toString();
//Write
OutputStream outputStream = urlConnection.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
writer.write(data);
writer.close();
outputStream.close();
int responseCode=urlConnection.getResponseCode();
if (responseCode == HttpsURLConnection.HTTP_OK) {
//Read
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = bufferedReader.readLine()) != null) {
sb.append(line);
}
bufferedReader.close();
result = sb.toString();
}else {
// return new String("false : "+responseCode);
new String("false : "+responseCode);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
String encoded = Base64.encodeToString((username + ":" + password).getBytes("UTF-8"), Base64.NO_WRAP); connection.setRequestProperty("Authorization", "Basic " + encoded);
Обратите внимание, что у меня не было успеха только сBase64.encode
(т. Е. Без «encodeToString»), поскольку он произвел некоторые странные байты результата, представление которых ASCII даже не напоминало Base64. – ComFreek 7 March 2015 в 23:20