SpringBoot+webservice

玉獅子發表於2019-04-20

今天看到一個專案要和工廠的ERP進行對接,用到了webservice。雖然使用用springboot較為方便,還是瞭解一下:

webservice是什麼

網上的解釋很多,其實就是跨語言和作業系統的的遠端呼叫技術。比如亞馬遜,可以將自己的服務以webservice的服務形式暴露出來,我們就可以通過web呼叫這些,無論我們使用的語言是java還是c,這也是SOA應用一種表現形式。

WSDL(Web Services Description Language)將無論用何種語言書寫的web service描述出來,比如其引數或返回值。WSDL是服務端和客戶端都能解讀的標準格式。客戶端通過URL地址訪問到WSDL檔案,在呼叫服務端之前先訪問WSDL檔案。 讀取到WSDL後通過客戶端的API類可以生成代理類,呼叫這些代理類就可以訪問webservice服務。代理類將客戶端的方法變為soap(Simple Object Access Protocol,可以理解為http+xml)格式通過http傳送,同時接受soap格式的返回值並解析。


webservice使用

  • 建立工程

    SpringBoot+webservice
  • 新增依賴

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.4</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.1.41</version>
        </dependency>
    
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
            <version>3.1.11</version>
        </dependency>

        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>2.11.0</version>
        </dependency>
    </dependencies>
複製程式碼
  • 測試物件TestBean

    public class TestBean {
        private String name;
        private String id;

        public String getName() {
            return name;
        }

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

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }
    }
複製程式碼
  • 服務端介面

    @WebService(name = "testService",targetNamespace = "http://service.webservicedemo.sxt.com")
    public interface Wbservice {

        @WebMethod
        @WebResult()
        public String helloService(@WebParam(name = "name") String name);
        
        @WebMethod
        public ArrayList<TestBean> getAllBean()
    }
複製程式碼
  • 服務端介面實現

    @WebService(name = "testService",
            targetNamespace = "http://service.webservicedemo.sxt.com",
            endpointInterface="com.sxt.webservicedemo.Service.Wbservice")

    @Component
    public class WebserviceImpl implements Wbservice {
        @Override
        public String helloService(String name) {
            return "hello"+name;
        }

        @Override
        public ArrayList<TestBean> getAllBean() {
            ArrayList<TestBean> list = new ArrayList<>();
            TestBean bean1 = new TestBean("zhangsan", "1");
            TestBean bean2 = new TestBean("lisi", "2");
            list.add(bean1);
            list.add(bean2);
            return list;
        }
    }
複製程式碼
  • 釋出配置

@Configuration
public class Webserviceconfig {

    @Bean
    public ServletRegistrationBean dispatcherServlet(){
        return new ServletRegistrationBean(new CXFServlet(),"/service/*");//釋出服務名稱
    }

    @Bean(name = Bus.DEFAULT_BUS_ID)
    public SpringBus springBus()
    {
        return  new SpringBus();
    }

    @Bean
    public Wbservice beanService()
    {
        return  new WebserviceImpl();
    }

    @Bean
    public Endpoint endpoint() {
        EndpointImpl endpoint=new EndpointImpl(springBus(), beanService());//繫結要釋出的服務
        endpoint.publish("/test"); //顯示要釋出的名稱
        return (Endpoint) endpoint;
    }
複製程式碼
  • 客戶端呼叫

public static void main(String[] args) throws Exception {
        JaxWsDynamicClientFactory dcflient=JaxWsDynamicClientFactory.newInstance();

        Client client=dcflient.createClient("http://localhost:8080/service/test?wsdl");

        Object[] objects=client.invoke("getBean","411001");
        System.out.println("*******"+objects[0].toString());
    }
複製程式碼