Est-il possible d'envoyer des requêtes XML
POST
avec spring
, par exemple RestTemplate
?
Je veux envoyer le xml suivant à l'url localhost:8080/xml/availability
<AvailReq>
<hotelid>123</hotelid>
</AvailReq>
Je souhaite également ajouter dynamiquement des en-têtes http à chaque demande (!).
Comment pourrais-je y parvenir avec le printemps?
Tout d'abord, définissez vos en-têtes HTTP
, comme suit:
HttpHeaders headers = new HttpHeaders();
headers.add("header_name", "header_value");
Vous pouvez définir n'importe quel en-tête HTTP
avec cette approche. Pour les en-têtes bien connus, vous pouvez utiliser des méthodes prédéfinies. Par exemple, pour définir l'en-tête Content-Type
:
headers.setContentType(MediaType.APPLICATION_XML);
Définissez ensuite un HttpEntity
ou RequestEntity
pour préparer votre objet de requête:
HttpEntity<String> request = new HttpEntity<String>(body, headers);
Si vous avez en quelque sorte accès à la chaîne XML
, vous pouvez utiliser HttpEntity<String>
. Sinon, vous pouvez définir un POJO correspondant à celui XML
. et enfin envoyer la demande en utilisant les méthodes postFor...
:
ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8080/xml/availability", request, String.class);
Ici, je POST
ing la demande au point de terminaison http://localhost:8080/xml/availability
Et la conversion du corps de réponse HTTP
en un String
.
Notez que dans les exemples ci-dessus, new HttpEntity<String>(...)
peut être remplacé parnew HttpEntity<>(...)
en utilisant JDK7 et versions ultérieures.
Vous trouverez ci-dessous un exemple complet sur la façon d'utiliser un RestTemplate
pour échanger des documents XML et recevoir une réponse 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();
}
}
Trouvez ci-dessous, par exemple, pour utiliser un RestTemplate pour échanger XML en tant que chaîne et recevoir une réponse:
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);