web-dev-qa-db-ja.com

Spring RestTemplateでXML POSTリクエストを送信するには?

XMLなどのPOSTを使用して、springRestTemplateリクエストを送信できますか?

次のxmlをURL localhost:8080/xml/availability

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

また、各リクエストにカスタムhttpヘッダーを動的に追加しますか(!)。

春でどうやってこれを達成できますか?

12
membersound

まず、次のように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>_を使用できます。それ以外の場合は、XMLに対応するPOJOを定義できます。最後に_postFor..._メソッドを使用してリクエストを送信します。

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

ここでは、POSTリクエストを_http://localhost:8080/xml/availability_エンドポイントに_ingし、HTTP応答本文をStringに変換しています。

上記の例では、new HttpEntity<String>(...)で置き換えるnew HttpEntity<>(...)をJDK7以降で使用できることに注意してください。

30
Ali Dehghani

以下に、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();
    }
}
4
Kamill Sokol

たとえば、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);
3
Sam