У меня возникли проблемы с внедрением клиента для службы аутентификации с подтверждением http. Используя CURL я могу вызвать службу правильно:Ошибка аутентификации Http с джерси 2.x, работает с curl
curl -v --digest -u "username:password" -H "Content-Type: application/json" --data @entity.json http://<server>:<port>/path
где entity.json содержит JSON структуру объекта сущности, отправляемый на сервер
Использование Wireshark я вижу след, что HTTP POST отправляется и принимается ответ сервера 401. Будет отправлено новое сообщение с использованием правильной комбинации md5-пароля и т. Д. И будет получено 200 OK с объектом объекта ответа json. Все отлично.
Я попытался осуществить это с помощью джерси 2.x:
import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.ws.rs.client.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
public class RestApi
{
private static final Logger log = LoggerFactory.getLogger(RestApi.class)
private Client client;
private String server;
private String username;
private String password;
public RestApi(String server, String username, String password) {
this.server = server;
this.username = username;
this.password = password;
}
public Client getClient() {
if(this.client == null) {
HttpAuthenticationFeature feature = HttpAuthenticationFeature.digest(username, password);
this.client = ClientBuilder.newClient();
this.client.register(feature)
}
return this.client;
}
public <T> T post(
final String path,
final Object bodyValue,
final Class<T> c) throws RestPostException {
log.debug("POST path='{}', server='{}', bodyValue='{}'", path, server, bodyValue);
WebTarget webTarget = getClient().target(server).path(path);
Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON_TYPE);
Response response = invocationBuilder.post(Entity.entity(bodyValue, MediaType.APPLICATION_JSON_TYPE));
if (response.getStatus() != 200) {
String errorString = response.readEntity(String.class);
throw new RestPostException(
"POST failed to '" + server + "/" + path + "' body value: '" + bodyValue + "' : HTTP error code : " + response.getStatus() +
". Error string:" + errorString);
}
T retval = response.readEntity(c);
return retval;
}
}
Метод пост вызывается из другого класса, как это:
String returnedValue = getRestApi().post(
path,
v,
String.class);
где v это мой объект JSON для отправки в запросе.
Отслеживание этого с помощью wirehark. Я вижу, что POST отправляется (согласно трассировке POST точно соответствует той, которую я посылаю с помощью curl), с несанкционированным ответом 401. Будет отправлено новое сообщение, и я не получу 200 OK. Вместо этого я получаю новый 401 Несанкционированный.
У кого-нибудь есть опыт? Вы видите какие-либо отсутствующие настройки, конфигурацию и т. Д. С тем, как я использую код Java?