Сегодня я увидел проект по подключению к заводской ERP с помощью веб-сервиса. Хотя использовать springboot удобнее, давайте посмотрим:
что такое веб-сервис
В Интернете есть много объяснений, но на самом деле это технология удаленного вызова через языки и операционные системы. Например, Amazon может предоставлять свои собственные сервисы в виде сервисов веб-сервисов, и мы можем вызывать их через Интернет. Независимо от того, используем ли мы язык java или c, это также форма приложения SOA.
WSDL (язык описания веб-служб) описывает веб-службу, написанную на любом языке, например ее параметры или возвращаемые значения. WSDL — это стандартный формат, который могут интерпретировать как серверы, так и клиенты. Клиент получает доступ к файлу WSDL через URL-адрес и сначала обращается к файлу WSDL перед вызовом сервера. После прочтения WSDL классы прокси можно сгенерировать через класс API клиента, а доступ к службе веб-сервиса можно получить, вызвав эти классы прокси. Прокси-класс изменяет метод клиента в формат soap (Simple Object Access Protocol, который можно понимать как http+xml) и отправляет его через http, а также принимает и анализирует возвращаемое значение в формате soap.
использование веб-сервиса
-
Создать проект
-
добавить зависимости
<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());
}