Spring Boot實現Web Service介面調用

一、SOAP和RESTful協議

SOAP(Simple Object Access Protocol)和RESTful(Representational State Transfer)是兩種常見的Web Service協議。SOAP是基於XML和HTTP協議的,是一種重量級協議;RESTful則是基於HTTP協議的,主要使用JSON數據格式,是一種輕量級協議。

在Spring Boot中,可以選擇使用SOAP或RESTful協議進行Web Service介面調用。如果需要保證數據的安全性和事務一致性,SOAP是一個不錯的選擇;如果介面簡單,數據格式較為簡單,則可以選擇RESTful協議。

二、SOAP協議下的Web Service介面調用

1、首先,在pom.xml中加入以下依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web-services</artifactId>
</dependency>

2、在Spring Boot主類中添加@EnableWs和@Bean註解,開啟Web Service支持,並定義WebService介面:

@SpringBootApplication
@EnableWs
public class DemoApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(DemoApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Bean
    public ServletRegistrationBean messageDispatcherServlet(ApplicationContext applicationContext) {
        MessageDispatcherServlet servlet = new MessageDispatcherServlet();
        servlet.setApplicationContext(applicationContext);
        servlet.setTransformWsdlLocations(true);
        return new ServletRegistrationBean(servlet, "/ws/*");
    }

    @Bean(name = "countries")
    public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema countriesSchema) {
        DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
        wsdl11Definition.setPortTypeName("CountriesPort");
        wsdl11Definition.setLocationUri("/ws");
        wsdl11Definition.setTargetNamespace("http://spring.io/guides/gs-producing-web-service");
        wsdl11Definition.setSchema(countriesSchema);
        return wsdl11Definition;
    }

    @Bean
    public XsdSchema countriesSchema() {
        return new SimpleXsdSchema(new ClassPathResource("countries.xsd"));
    }

    @WebService
    public interface CountryService {
        @WebMethod
        String getCapital(String countryName);
        @WebMethod
        String getCurrency(String countryName);
    }

    @Service
    public class CountryServiceImpl implements CountryService {

        private Map<String, Country> countries = new HashMap<>();

        public CountryServiceImpl() {
            Country spain = new Country();
            spain.setName("Spain");
            spain.setCapital("Madrid");
            spain.setCurrency(Currency.EUR);
            countries.put(spain.getName(), spain);

            Country poland = new Country();
            poland.setName("Poland");
            poland.setCapital("Warsaw");
            poland.setCurrency(Currency.PLN);
            countries.put(poland.getName(), poland);

            Country uk = new Country();
            uk.setName("United Kingdom");
            uk.setCapital("London");
            uk.setCurrency(Currency.GBP);
            countries.put(uk.getName(), uk);
        }

        @Override
        public String getCapital(String countryName) {
            return countries.get(countryName).getCapital();
        }

        @Override
        public String getCurrency(String countryName) {
            return countries.get(countryName).getCurrency().toString();
        }
    }

    public enum Currency {
        EUR, GBP, PLN
    }

    public class Country {
        private String name;
        private String capital;
        private Currency currency;

        public String getName() {
            return name;
        }

        public void setName(String value) {
            this.name = value;
        }

        public String getCapital() {
            return capital;
        }

        public void setCapital(String value) {
            this.capital = value;
        }

        public Currency getCurrency() {
            return currency;
        }

        public void setCurrency(Currency value) {
            this.currency = value;
        }

    }

}

3、在resources目錄下創建一個countries.xsd文件,定義數據格式:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:tns="http://spring.io/guides/gs-producing-web-service"
           targetNamespace="http://spring.io/guides/gs-producing-web-service"
           elementFormDefault="qualified">

    <xs:element name="getCapitalRequest">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="arg0" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="getCapitalResponse">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="return" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="getCurrencyRequest">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="arg0" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="getCurrencyResponse">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="return" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    
</xs:schema>

4、啟動項目,並使用SOAPUI等工具進行介面測試。

三、RESTful協議下的Web Service介面調用

1、首先,在pom.xml中加入以下依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web-services</artifactId>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.1</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.11.1</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>2.11.1</version>
</dependency>

2、定義一個Controller類,實現介面方法:

@RestController
public class CountryController {

    private Map<String, Country> countries = new HashMap<>();

    public CountryController() {
        Country spain = new Country();
        spain.setName("Spain");
        spain.setCapital("Madrid");
        spain.setCurrency(Currency.EUR);
        countries.put(spain.getName(), spain);

        Country poland = new Country();
        poland.setName("Poland");
        poland.setCapital("Warsaw");
        poland.setCurrency(Currency.PLN);
        countries.put(poland.getName(), poland);

        Country uk = new Country();
        uk.setName("United Kingdom");
        uk.setCapital("London");
        uk.setCurrency(Currency.GBP);
        countries.put(uk.getName(), uk);
    }

    @RequestMapping(value = "/capital/{name}", method = RequestMethod.GET)
    public String getCapital(@PathVariable("name") String name) {
        return countries.get(name).getCapital();
    }

    @RequestMapping(value = "/currency/{name}", method = RequestMethod.GET)
    public String getCurrency(@PathVariable("name") String name) {
        return countries.get(name).getCurrency().toString();
    }

    public enum Currency {
        EUR, GBP, PLN
    }

    public class Country {
        private String name;
        private String capital;
        private Currency currency;

        public String getName() {
            return name;
        }

        public void setName(String value) {
            this.name = value;
        }

        public String getCapital() {
            return capital;
        }

        public void setCapital(String value) {
            this.capital = value;
        }

        public Currency getCurrency() {
            return currency;
        }

        public void setCurrency(Currency value) {
            this.currency = value;
        }

    }
}

3、啟動項目,使用Postman等工具進行介面測試。

四、總結

在Spring Boot中,可以很方便地實現SOAP和RESTful協議下的Web Service介面調用。選擇哪種協議,需要根據具體的需求和業務情況進行分析和選擇。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/312962.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-06 15:17
下一篇 2025-01-06 15:17

相關推薦

發表回復

登錄後才能評論