Я вызываю метод Post
класса org.apache.http.client.fluent.Request
, и он блокируется - следующая строка кода не выполняется. Я получаю запись, в которой говорится, что я тоже получил успешный ответ! Мои сообщения журнала (ниже) подтверждают, что сообщение вернулось со статусом OK (200).
>> ...with body JSON:
<< status: 200
Так что же случилось? Что еще более важно, что я могу сделать, чтобы защитить себя?
PS Я использовал этот код тысячи раз, и, насколько я знаю, такого раньше никогда не было.
Контекст
Это приложение Spring BOOT (версия 1.3.5). Я использую RESTTemplate для внутренней связи между микросервисами, но я использую свободный клиент apache для связи с внешним веб-сервисом. Я использую org. apache .httpcomponents (версия 4.5.2).
Мой код:
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpResponseException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.fluent.Request;
import org.apache.http.entity.ContentType;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.eneura.devcom.microservices.exceptions.ExternalWebServiceCommunicationFailureException;
import com.eneura.devcom.microservices.exceptions.InvalidArgumentException;
import com.eneura.devcom.microservices.exceptions.PreconditionsFailureException;
final private String internalDoPostSingleCall(
String subUrlPath, String jsonString, List<String> parmList
)
throws InvalidArgumentException, ExternalWebServiceCommunicationFailureException, HttpResponseException
{
String bodyArg = (StringUtils.isNotBlank(jsonString)) ? jsonString : ""; //don't pass in null or blanks or ... just fold down to ""
String url = computeUrl(subUrlPath, parmList);
logger.info(">> sending POST " + url);
logger.info(">> ...with body JSON: " + bodyArg);
String res;
try {
res = Request
.Post( url )
.bodyString(
bodyArg, ContentType.APPLICATION_JSON
).execute()
.handleResponse(new ResponseHandler<String>() {
public String handleResponse(
final HttpResponse response) throws IOException {
StatusLine statusLine = response.getStatusLine();
HttpEntity entity = response.getEntity();
logger.info("<< status: " + statusLine.getStatusCode() );
if (statusLine.getStatusCode() >= 300) {
throw new HttpResponseException(statusLine
.getStatusCode(), statusLine
.getReasonPhrase());
}
String content =
(null == entity) ? (
"" // ok not to have any content back.
) : (
IOUtils.toString(entity.getContent(), "UTF-8")
);
return content;
}
});
} catch (HttpResponseException e) {
throw e;
} catch (IOException e) {
String msg =
"failed to perform POST to ExternalWebService - exception: " + e.getLocalizedMessage();
throw new ExternalWebServiceCommunicationFailureException(msg);
}
logger.info("<< body returned for POST (len="+ res.length() +"): " + res);
return res;
}
Журнал сообщений:
2020-03-14 18:46:14.119 INFO 15213 --- [http-nio-6444-exec-9] c.e.d.m.s.avcourier.AVRestDelegate : >> sending POST https://externalwebservice.com/api/v1/operations/a0a01212445566770011001130304040/cancel
2020-03-14 18:46:14.119 INFO 15213 --- [http-nio-6444-exec-9] c.e.d.m.s.avcourier.AVRestDelegate : >> ...with body JSON:
2020-03-14 18:46:14.393 INFO 15213 --- [http-nio-6444-exec-9] c.e.d.m.s.avcourier.AVRestDelegate : << status: 200
2020-03-14 18:50:07.589 INFO 15213 --- [AsyncResolver-bootstrap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver : Resolving eureka endpoints via configuration
2020-03-14 18:55:07.590 INFO 15213 --- [AsyncResolver-bootstrap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver : Resolving eureka endpoints via configuration
2020-03-14 19:00:07.591 INFO 15213 --- [AsyncResolver-bootstrap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver : Resolving eureka endpoints via configuration