#java #okhttp
#java #okhttp
Вопрос:
Сначала я хотел аутентифицировать свое java-приложение с помощью OkHttp, а затем после аутентификации ответ возвращает идентификатор сеанса (ключ), который я хотел использовать в последующих вызовах API. ниже приведен код, который я использую для достижения этой цели.
String url = "my application url";
String username = "xxx";
String password = "zzz";
String userpass = username ":" password;
String basicAuth = "Basic :" new String(Base64.getEncoder().encode(userpass.getBytes()));
OkHttpClient client = new OkHttpClient();
Response response ;
Request request = new Request.Builder()
.url(url)
.addHeader("Authorization", basicAuth)
.build();
response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code " response);
System.out.println(response.body().string());
но он выдает ошибку, в которой говорится
{«ResponseStatus»: «СБОЙ», «ResponseMessage»: «Метод запроса ‘GET’ не поддерживается», «errorCodes»: null, «ошибки»:[{«type»:»METHOD_NOT_SUPPORTED», «message»:»Метод запроса ‘GET’ не поддерживается»}],»Тип ошибки»:»ОБЩИЕ»}
может кто-нибудь, пожалуйста, помочь мне решить эту проблему. или, если у кого-либо есть какая-либо другая идея для аутентификации java-приложения с использованием okhttp, пожалуйста, предложите…
Комментарии:
1. Заголовок basic auth неверен, должен быть
"Basic: " ...
, но это на самом деле не объясняет сообщение об ошибке.
Ответ №1:
Вы должны использовать вспомогательные классы, чтобы избежать большей части логики для имени пользователя и пароля.
String credential = Credentials.basic("jesse", "password1");
return response.request().newBuilder()
.header("Authorization", credential)
.build();
Предполагая, что этот API является POST, а не GET, также следуйте
Request request = new Request.Builder()
.url("https://api.github.com/markdown/raw")
.post(RequestBody.create(postBody, MEDIA_TYPE_MARKDOWN))
.build();
Ответ №2:
У вас уже все было в порядке. Требуется лишь небольшое исправление:
String basicAuth = "Basic " new String(Base64.getEncoder().encode(userpass.getBytes()));
т.е. вам просто нужно удалить лишнее ‘:’, поскольку об этом уже позаботились .addHeader("Authorization", basicAuth)
частично.