Spring Boot API連携

Spring BootのRest APIサービスをXML形式で呼び出してみた

Spring BootのRest APIサービスでXML形式を取り扱う際も、JSON形式の場合と同じように、Rest APIサービスを呼び出せばよい。

今回は、STS(Spring Tool Suite)を利用したSpring Bootアプリケーション上で、XML形式でRest APIサービスを呼び出してみたので、そのサンプルプログラムを共有する。

前提条件

下記記事の実装が完了していること。

Spring BootのRest APIサービスでXML形式を取り扱えるようにしてみたこれまでこのブログで紹介してきたRestAPIサービスでは、JSON形式でリクエストボディの送信と結果の受信を行ってきたが、XML形式で...
Spring BootのRest APIサービスでURL情報を追加するHATEOASを利用してみたHATEOASを利用すると、RestAPIサービスにおいて、例えば、データ追加後に、追加したデータを取得するURL情報も合わせて返却する...

作成したサンプルプログラムの内容

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、前提条件のプログラムから変更したプログラムである。

pom.xml(追加分)の内容は以下の通りで、データ受信/送信をXML形式に変換可能にするライブラリを追加している。

<!-- データ受信/送信をXML形式に変換可能にするライブラリを追加 -->
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

また、Rest APIでXML形式/JSON形式でデータ取得する処理を呼び出すサービスクラスの内容は以下の通りで、XML形式の場合も、JSON形式の場合と同じような実装になっている。

package com.example.demo;

import java.util.Arrays;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
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.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class DemoRestApiCallXmlService {

    /** 全てのユーザーデータを取得するURL */
    private static final String GET_ALL_USERS = "http://localhost:8085/users";

    /** ユーザーデータを追加するURL */
    private static final String POST_USER = "http://localhost:8085/users";

    /** RestTemplateオブジェクト */
    @Autowired
    private RestTemplate restTemplate;

    /** HttpHeadersオブジェクト */
    @Autowired
    private HttpHeaders httpHeaders;

    /** ログ出力のためのクラス */
    private static Log log = LogFactory.getLog(DemoRestApiCallXmlService.class);

    /**
     * Rest APIでXML形式/JSON形式でデータ取得する処理の呼び出しを実行する.
     */
    public void execRestApiXml() {
        // Headersに「Accept: application/xml」を指定
        httpHeaders.setAccept(Arrays.asList(MediaType.APPLICATION_XML));

        // Headersに「Accept: application/xml」を指定し、戻り値を文字列で取得
        ResponseEntity<String> responseXml1 = restTemplate.exchange(
              GET_ALL_USERS, HttpMethod.GET, new HttpEntity<>(httpHeaders)
            , String.class);
        String resBodyXml1 = responseXml1.getBody();
        log.debug("USER_DATAテーブルから全データを取得した結果" 
                + "(Accept: application/xml、戻り値: 文字列) : ");
        log.debug(resBodyXml1);
        log.debug("");

        // Headersに「Accept: application/xml」を指定し、
        // 戻り値をUserDataオブジェクトのリストで取得
        ResponseEntity<List<UserData>> responseList = restTemplate.exchange(
             GET_ALL_USERS, HttpMethod.GET, new HttpEntity<>(httpHeaders)
           , new ParameterizedTypeReference<List<UserData>>() {});
        List<UserData> userDataList = responseList.getBody();
        log.debug("USER_DATAテーブルから全データを取得した結果" 
                + "(Accept: application/xml、戻り値: UserDataオブジェクトのリスト) : ");
        printUserDataList(userDataList);
        log.debug("");

        // Headersに「Accept: application/json」を指定
        httpHeaders.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));

        // Headersに「Accept: application/json」を指定し、戻り値を文字列で取得
        ResponseEntity<String> responseJson1 = restTemplate.exchange(
             GET_ALL_USERS, HttpMethod.GET, new HttpEntity<>(httpHeaders)
           , String.class);
        String resBodyJson1 = responseJson1.getBody();
        log.debug("USER_DATAテーブルから全データを取得した結果" 
            + "(Accept: application/json、戻り値: 文字列) : ");
        log.debug(resBodyJson1);
        log.debug("");

        // Headersに「Accept: application/json」を指定し、
        // 戻り値をUserDataオブジェクトのリストで取得
        ResponseEntity<List<UserData>> responseJson2 = restTemplate.exchange(
             GET_ALL_USERS, HttpMethod.GET, new HttpEntity<>(httpHeaders)
           , new ParameterizedTypeReference<List<UserData>>() {});
        List<UserData> resBodyJson2 = responseJson2.getBody();
        log.debug("USER_DATAテーブルから全データを取得した結果" 
            + "(Accept: application/json、戻り値: UserDataオブジェクトのリスト) : ");
        printUserDataList(resBodyJson2);
        log.debug("");

        // Headersに「Accept: */*」を指定
        httpHeaders.setAccept(Arrays.asList(MediaType.ALL));

        // Headersに「Accept: */*」を指定し、戻り値を文字列で取得
        ResponseEntity<String> responseAll1 = restTemplate.exchange(
             GET_ALL_USERS, HttpMethod.GET, new HttpEntity<>(httpHeaders)
           , String.class);
        String resBodyAll1 = responseAll1.getBody();
        log.debug("USER_DATAテーブルから全データを取得した結果" 
            + "(Accept: */*、戻り値: UserDataオブジェクトのリスト) : ");
        log.debug(resBodyAll1);
        log.debug("");

        // Headersに「Accept: */*」を指定し、
        // 戻り値をUserDataオブジェクトのリストで取得
        ResponseEntity<List<UserData>> responseAll2 = restTemplate.exchange(
              GET_ALL_USERS, HttpMethod.GET, new HttpEntity<>(httpHeaders)
            , new ParameterizedTypeReference<List<UserData>>() {});
        List<UserData> resBodyAll2 = responseAll2.getBody();
        log.debug("USER_DATAテーブルから全データを取得した結果" 
            + "(Accept: */*、戻り値: UserDataオブジェクトのリスト) : ");
        printUserDataList(resBodyAll2);
        log.debug("");

        // Headersに「Accept: application/xml」「Content-Type:application/xml」
        // を指定し、戻り値を文字列で取得
        httpHeaders.setAccept(Arrays.asList(MediaType.APPLICATION_XML));
        httpHeaders.setContentType(MediaType.APPLICATION_XML);

        // user_dataテーブルに、id=4であるデータを追加
        UserData newUserData1 
            = new UserData(4, "テスト プリン4", 2003, 1, 25, "2", "テスト4");
        ResponseEntity<String> responseAdd1 = restTemplate.exchange(
              POST_USER, HttpMethod.POST
            , new HttpEntity<>(newUserData1, httpHeaders), String.class);
        String resBodyAdd1 = responseAdd1.getBody();
        log.debug("USER_DATAテーブルにデータを追加した結果" 
          + "(Accept: application/xml、Content-Type: application/xml、戻り値: 文字列) : ");
        log.debug(resBodyAdd1);
        log.debug("");

        // Headersに「Accept: application/xml」「Content-Type:application/json」を
        // 指定し、戻り値を文字列で取得
        httpHeaders.setAccept(Arrays.asList(MediaType.APPLICATION_XML));
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);

        // user_dataテーブルに、id=5であるデータを追加
        UserData newUserData2 
            = new UserData(5, "テスト プリン5", 2008, 6, 11, "1", "テスト5");
        ResponseEntity<String> responseAdd2 = restTemplate.exchange(
              POST_USER, HttpMethod.POST
            , new HttpEntity<>(newUserData2, httpHeaders), String.class);
        String resBodyAdd2 = responseAdd2.getBody();
        log.debug("USER_DATAテーブルにデータを追加した結果" 
          + "(Accept: application/xml、Content-Type: application/json、戻り値: 文字列) : ");
        log.debug(resBodyAdd2);
        log.debug("");

        // Headersに「Accept: application/json」「Content-Type:application/json」を
        // 指定し、戻り値を文字列で取得
        httpHeaders.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);

        // user_dataテーブルに、id=6であるデータを追加
        UserData newUserData3 
            = new UserData(6, "テスト プリン6", 2012, 12, 3, "2", "テスト6");
        ResponseEntity<String> responseAdd3 = restTemplate.exchange(
               POST_USER, HttpMethod.POST
             , new HttpEntity<>(newUserData3, httpHeaders), String.class);
        String resBodyAdd3 = responseAdd3.getBody();
        log.debug("USER_DATAテーブルにデータを追加した結果" 
          + "(Accept: application/json、Content-Type: application/json、戻り値: 文字列) : ");
        log.debug(resBodyAdd3);
        log.debug("");

        // Headersに「Accept: */*」「Content-Type: application/xml」を指定し、
        // 戻り値を文字列で取得
        httpHeaders.setAccept(Arrays.asList(MediaType.ALL));
        httpHeaders.setContentType(MediaType.APPLICATION_XML);

        // user_dataテーブルに、id=7であるデータを追加
        UserData newUserData4 
            = new UserData(7, "テスト プリン7", 2001, 7, 21, "1", "テスト7");
        ResponseEntity<String> responseAdd4 = restTemplate.exchange(
              POST_USER, HttpMethod.POST
            , new HttpEntity<>(newUserData4, httpHeaders), String.class);
        String resBodyAdd4 = responseAdd4.getBody();
        log.debug("USER_DATAテーブルにデータを追加した結果" 
          + "(Accept: */*、Content-Type: application/xml、戻り値: 文字列) : ");
        log.debug(resBodyAdd4);
        log.debug("");
    }

    /**
     * 引数で指定されたユーザーデータリストを出力する.
     * 
     * @param userDataList ユーザーデータリスト
     */
    private void printUserDataList(List<UserData> userDataList) {
        if (userDataList != null && !userDataList.isEmpty()) {
            for (UserData userData : userDataList) {
                log.debug(userData);
            }
        }
    }
}

さらに、Spring Bootのメインクラスの内容は以下の通りで、Rest APIでXML形式/JSON形式でデータ取得する処理を実行するサービスクラスを呼び出している。

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoRestApiCallApplication implements CommandLineRunner {

    /** Rest APIでXML形式/JSON形式でデータ取得する処理を呼び出すサービスクラス */
    @Autowired
    private DemoRestApiCallXmlService demoRestApiCallXmlService;
    
    public static void main(String[] args) {
        SpringApplication.run(DemoRestApiCallApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        // Rest APIでXML形式/JSON形式でデータ取得する処理を呼び出す
        demoRestApiCallXmlService.execRestApiXml();
    }

}

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-call-rest-api-xml/demoRestApiCall



「DesignEvo」は多くのテンプレートからロゴを簡単に作成できるツールだった多くのテンプレートが用意されていてロゴを簡単に作成できるツールの一つに、「DesignEvo」があります。今回は、「DesignEvo」...

サンプルプログラムの実行結果

サンプルプログラムの実行結果は、以下の通り。

1) 接続先となるOracleデータベース上に、以下のUSER_DATAテーブルとデータを作成しておく。
サンプルプログラムの実行結果_1

2) Rest APIサービスのSpring Bootアプリケーションを起動後、今回作成したプロジェクトのSpring Bootアプリケーションを起動する。その結果出力されたログの内容は以下の通りで、XML形式の場合も、JSON形式の場合と同じように実行できることが確認できる。
サンプルプログラムの実行結果_2

3) 2)の操作を実行後に、接続先となるOracleデータベース上のUSER_DATAテーブルを確認すると、以下のようにデータが追加されていることが確認できる。
サンプルプログラムの実行結果_3

要点まとめ

  • Spring BootのRest APIサービスでXML形式を取り扱う際も、JSON形式の場合と同じように、Rest APIサービスを呼び出せばよい。