今天看到一個專案要和工廠的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使用
-
建立工程
-
新增依賴
<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());
}
複製程式碼