#spring #spring-boot #rest
#весна #spring-boot #rest
Вопрос:
Я создаю REST API с помощью SpringBoot (API1). который вызывает другой Rest API с использованием RestTemplate(API2). API2, который я вызываю, требует ввода xml и выдает вывод xml.
Вывод XML, который API 2 отправляет обратно, имеет структуру, подобную приведенной ниже
<xml>
<IList>
<IDetails>
<Id>INC123</Id>
</IDetails>
<IDetails>
<Id>INC124</Id>
</IDetails>
</IList>
</xml>
Класс Pojo, который я создал, приведен ниже:
@Data
@XmlRootElement(name="xml")
public class IResponse implements Serializable{
private static final long serialVersionUID = 1L;
@XmlElement(name="IList")
public IList iList;
}
@Data
@XmlRootElement(name="IList")
public class IList implements Serializable{
@XmlElement(name="IDetails")
public List<IDetails> iDetails;
}
@Data
@XmlRootElement(name="IDetails")
public class IDetails implements Serializable{
@XmlElement(name="Id")
public String id;
}
Вызов, который я выполняю :
ResponseEntity<IList> response = restTemplate.exchange(urlTemplate, HttpMethod.POST, request, IList.class);
Шаблон URL-адреса — это API2, который я вызываю.
При выполнении RestTemplate.exchange я получаю код состояния, если 200 Ok, вместе с ошибкой Недопустимый mime-тип «XML; charset = ISO-8859-1»: не содержит ‘/’ . Когда я отлаживал код.Я обнаружил, что это выдается responseExtractor.extractData(ответ) в пакете org.springframework.web.client; и метод doExecute.
Заголовки, которые я отправляю, являются
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_XML);
headers.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_XML_VALUE);
headers.add(HttpHeaders.ACCEPT_CHARSET, StandardCharsets.UTF_8.name());
API выполняется успешно, причина в том, что серверная задача, которую выполняет API, возникает при выполнении моего потока, но ответ, который я получаю, является недопустимым mime-типом «XML; charset = ISO-8859-1»: не содержит ‘/’.
Кто-нибудь может мне помочь, пожалуйста.
Комментарии:
1. вывод XML не является правильно сформированным XML. В нем отсутствует закрывающий элемент документа </xml>
2. Я отредактировал вопрос. Моя ошибка в публикации вопроса
3. работает ли это, если вы явно задаете заголовку content-type значение string вместо setContentType? заголовки.добавить(HttpHeaders. CONTENT_TYPE, MediaType. APPLICATION_XML_VALUE);
4. @codebrane: Нет, тогда тоже не работает
Ответ №1:
Во-первых, mime-тип всегда имеет представление type/subtype
.
Я вижу, вы используете Spring HttpHeaders
и MediaType
. Похоже, класс MediaType
не из пакета Spring, проверьте это. Возможно, в «неправильном» импортированном классе MimeType
значение MediaType.APPLICATION_XML
не application/xml
равно, но XML
.
Вы можете проверить это вручную, установив значение application/xml
.
2-е наблюдение: если в ваших заголовках уже есть заголовок ACCEPT, он будет добавлен (будет не менее 2 заголовков ACCEPT). Если вы хотите использовать один заголовок, используйте .set
вместо .add
него .
Комментарии:
1. Тип среды из пакета Springs. Я пытался даже использовать only .set. Все еще не работает
2. Итак, предоставьте дополнительную информацию. Я не понимаю, как вы устанавливаете заголовки в запрос. Выполняется ли это как требуется: request = new HttpEntity<>(dto_in_string_format, заголовки);?)
3. да, я устанавливаю заголовки в запрос следующим образом: HttpEntity<> request = new HttpEntity<>(requestbody,getHeaders()); где getHeaders устанавливает все заголовки запроса следующим образом: HttpHeaders headers = new HttpHeaders(); headers.add()
4. Проблема окончательно решена. Ошибка выдается RestTemplate, поскольку он всегда ожидает «/» в типе заголовка ответа. Я использовал другой http-клиент только для этой функции, и это сработало