2016-02-17 6 views
3

Можно ли отправить XMLPOST с spring, например RestTemplate?Как отправить запросы XML POST с Spring RestTemplate?

Я хочу послать следующий XML в URL localhost:8080/xml/availability

<AvailReq> 
    <hotelid>123</hotelid> 
</AvailReq> 

сделать Кроме того, я хочу, чтобы добавить заголовки НТТР на каждый запрос динамически (!).

Как я могу достичь этого с помощью пружины?

ответ

10

Прежде всего, определите ваши HTTP заголовки, как следующее:

HttpHeaders headers = new HttpHeaders(); 
headers.add("header_name", "header_value"); 

Вы можете установить любой HTTP заголовок с таким подходом. Для известных заголовков вы можете использовать заранее определенные методы. Например, для того, чтобы установить Content-Type заголовок:

headers.setContentType(MediaType.APPLICATION_XML); 

Затем определяют HttpEntity или RequestEntity подготовить объект запроса:

HttpEntity<String> request = new HttpEntity<String>(body, headers); 

Если вы каким-то образом получить доступ к XML строки, вы можете использовать HttpEntity<String> , В противном случае вы можете определить POJO, соответствующий этому XML. и, наконец, отправить запрос, используя postFor... методы:

ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8080/xml/availability", request, String.class); 

Здесь я POST ИНГ запрос на http://localhost:8080/xml/availability конечной точки и преобразовывая тело HTTP ответа в String.

Обратите внимание, что в приведенных выше примерах new HttpEntity<String>(...) может be replaced withnew HttpEntity<>(...) с использованием JDK7 и более поздних версий.

+0

OK Я вижу, спасибо. У меня есть автогенерированные классы 'JAXB' из' XSD'. Как я мог затем позволить 'RestTemplate' конвертировать эти, если исходящий должен быть' application/xml', а ответ - text/html', но все просто xml. – membersound

+0

Используйте свой класс 'JAXB', например' SomeClass', вместо 'String'. На самом деле это будет 'HttpEntity request = ...'. –

+0

'Jaxb2RootElementHttpMessageConverter' преобразует ваш класс' JAXB' в 'XML'. Он должен быть зарегистрирован по умолчанию. Если по какой-то причине он не был зарегистрирован, зарегистрируйте его вручную. –

2

Ниже вы найдете полный пример того, как использовать RestTemplate для обмена XML-документы и получить ответ HTML:

import static org.hamcrest.Matchers.is; 
import static org.junit.Assert.assertThat; 
import static org.springframework.test.web.client.match.MockRestRequestMatchers.header; 
import static org.springframework.test.web.client.match.MockRestRequestMatchers.content; 
import static org.springframework.test.web.client.match.MockRestRequestMatchers.method; 
import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; 
import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess; 

import org.junit.Test; 
import org.springframework.http.HttpEntity; 
import org.springframework.http.HttpHeaders; 
import org.springframework.http.HttpMethod; 
import org.springframework.http.MediaType; 
import org.springframework.http.ResponseEntity; 
import org.springframework.test.web.client.MockRestServiceServer; 
import org.springframework.web.client.RestTemplate; 
import org.w3c.dom.Document; 
import org.xml.sax.InputSource; 

import java.io.StringReader; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

public class XmlTest { 

    @Test 
    public void test() throws Exception { 
     RestTemplate restTemplate = new RestTemplate(); 
     MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate); 
     String htmlString = "<p>response</p>"; 
     String xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\"?><AvailReq><hotelid>123</hotelid></AvailReq>"; 

     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     Document document = builder.parse(new InputSource(new StringReader(xmlString))); 

     mockServer.expect(requestTo("http://localhost:8080/xml/availability")) 
       .andExpect(method(HttpMethod.POST)) 
       .andExpect(content().string(is(xmlString))) 
       .andExpect(header("header", "value")) 
       .andRespond(withSuccess("<p>response</p>", MediaType.TEXT_HTML)); 

     HttpHeaders headers = new HttpHeaders(); 
     headers.add("header", "value"); 
     HttpEntity<Document> request = new HttpEntity<>(document, headers); 

     final ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8080/xml/availability", request, String.class); 

     assertThat(response.getBody(), is(htmlString)); 
     mockServer.verify(); 
    } 
} 
1

Найти ниже, например, использовать RestTemplate для обмена XML в виде строки и получить ответ:

String xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\"?><AvailReq><hotelid>123</hotelid></AvailReq>"; 

    RestTemplate restTemplate = new RestTemplate(); 
    //Create a list for the message converters 
    List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>(); 
    //Add the String Message converter 
    messageConverters.add(new StringHttpMessageConverter()); 
    //Add the message converters to the restTemplate 
    restTemplate.setMessageConverters(messageConverters); 


    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.APPLICATION_XML); 
    HttpEntity<String> request = new HttpEntity<String>(xmlString, headers); 

    final ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8080/xml/availability", request, String.class); 
+0

Полезный ответ для десериализации мыла xml через URL-адрес – Blaze