Springboot construit le client + serveur WebService

Présentation des services Web

La technologie de service Web permet à différentes applications s'exécutant sur différentes machines d'échanger des données ou de s'intégrer les unes aux autres sans logiciel ou matériel tiers spécialisé supplémentaire. Les applications implémentées selon la spécification Web Service peuvent échanger des données entre elles quel que soit le langage, la plate-forme ou le protocole interne qu'elles utilisent.

En termes simples, WebService est une technologie d'appel à distance dans les langages de programmation et les plates-formes de système d'exploitation. Le soi-disant langage de programmation croisée et plate-forme d'exploitation croisée signifie que le programme côté serveur est écrit en Java et que le programme côté client peut être écrit dans d'autres langages de programmation, et vice versa. La plate-forme multi-systèmes d'exploitation signifie que le programme serveur et le programme client peuvent s'exécuter sur des systèmes d'exploitation différents. L'appel à distance signifie qu'une application sur un ordinateur peut appeler une application sur un autre ordinateur. Par exemple : Alipay, Alipay ne dispose pas de données telles que les cartes bancaires, il appelle simplement l'interface fournie par la banque pour obtenir les données. Il existe également des prévisions météorologiques, etc., et le Bureau météorologique expose ses propres services système sous la forme de services Web, afin que des sites Web et des programmes tiers puissent appeler ces fonctions de service.

Principe du Web Service

XML, SOAP et WSDL sont les trois technologies majeures qui constituent la plate-forme WebService.

  • WebService utilise le protocole Http pour transmettre des données entre le client et le serveur. WebService utilise XML pour encapsuler des données. Le principal avantage de XML est qu'il est multiplateforme.

  • Lorsque WebService envoie des requêtes et reçoit des résultats via le protocole HTTP, le contenu de la requête envoyée et le contenu du résultat sont encapsulés au format XML, et certains en-têtes de message HTTP spécifiques sont ajoutés pour illustrer le format de contenu du message HTTP. Le format du contenu est spécifié par le protocole SOAP.

  • Le serveur WebService doit d'abord utiliser un fichier WSDL pour expliquer les services dont il dispose et qui peuvent être appelés de l'extérieur. En termes simples, WSDL est comme une spécification pour décrire WebService et ses méthodes, paramètres et valeurs de retour. Un fichier WSDL est stocké sur un serveur Web et est accessible via une adresse URL. Avant que le client appelle un WebService, il doit connaître l'adresse du fichier WSDL du service. Le fournisseur de services Web peut exposer son adresse de fichier WSDL de deux manières : 1. S'enregistrer auprès du serveur UDDI afin qu'il puisse être trouvé par d'autres 2. Informer directement l'appelant client.

Le processus d'interaction WebService est que WebService suit le protocole SOAP pour encapsuler les données via XML, puis transmet les données via le protocole Http.

Spécification des services Web JAVA

Il existe trois spécifications WebService dans Java, à savoir JAXM&SAAJ, JAX-WS (JAX-RPC) et JAX-RS.

(1) JAX-WS:

JAX-WS (API Java pour XML-WebService). La première spécification de service Web JAVA basée sur SOAP JAX-RPC (java API For XML-Remote Procedure Call) a été remplacée par la spécification JAX-WS. JAX-WS est une évolution de JAX-RPC, mais JAX-WS n'est pas complètement Il est rétrocompatible avec JAX-RPC.La plus grande différence entre les deux est le style RPC/encodé WSDL, que JAX-WS ne fournit plus. L'API de JAX-RPC a été supprimée depuis JAVA EE5. Si vous utilisez J2EE1.4, son API se trouve dans le javax.xml.rpc.package. L'API de la spécification JAX-WS (JSR 224) se trouve dans le package javax.xml.ws., dont la plupart sont des annotations, fournissant des opérations d'API pour les services Web (généralement plus utilisées côté client, car le côté client peut être généré à l'aide du SDK, de sorte que les API de ce package sont rarement utilisées directement).

(2) JAXM&SAAJ:

  • JAXM (JAVA API For XML Message) définit principalement l'API requise pour envoyer et recevoir des messages, ce qui équivaut au côté serveur du service Web. Son API se trouve dans le package javax.messaging.*, qui est un package facultatif de Java EE, vous devez donc le télécharger séparément.

  • SAAJ (SOAP With Attachment API For Java, JSR 67) est une API utilisée conjointement avec JAXM. Elle fournit un support important pour la création de packages SOAP et l'analyse des packages SOAP, et prend en charge la transmission des pièces jointes. Elle doit être utilisée à la fois côté serveur et côté serveur. le côté client. La spécification SAAJ est également mentionnée ici, dont l'API se trouve dans le package javax.xml.soap.*.

  • JAXM&SAAJ et JAX-WS sont tous deux des services Web basés sur SOAP. En revanche, JAXM&SAAJ divulgue davantage de détails sous-jacents de SOAP et le codage est plus gênant, tandis que JAX-WS est plus abstrait, cache plus de détails et est plus orienté objet. , vous n'avez pas besoin de vous soucier des détails de SOAP. Donc, si vous souhaitez contrôler plus de détails sur le message SOAP, vous pouvez utiliser JAXM&SAAJ.

(3)JAX-RS:

JAX-RS est un ensemble de spécifications de service Web développées par JAVA pour le style REST (Representation State Transfer). En raison de sa publication tardive, cette spécification (JSR 311, la version actuelle de JAX-RS est 1.0) n'a pas été publiée ensemble. avec JDK1.6.

Premiers pas avec WebService

Implémentation du serveur

Implémentons un cas d'un système météo : le client envoie le nom de la ville, et le serveur répond avec la météo correspondante.

// 1.  编写SEI(Service Endpoint Interface),SEI在webservice中称为portType,在java中就是普通接口 
package com.wdx.webservice.test2service;

public interface WeatherInterface {
    public String queryWeather(String cityName);
}
//2.  编写SEI实现类,此类作为webservice提供服务类
package com.wdx.webservice.test2service;

import javax.jws.WebService;

@WebService     //@WebService表示该类是一个服务类,需要发布其中的public的方法
public class WeatherInterfaceImpl implements WeatherInterface {

    @Override
    public String queryWeather(String cityName) {
        System.out.println("获取城市名"+cityName);
        String weather="暴雨";
        return weather;
    }

}
// 3.  第三步:发布服务,Endpoint类发布服务,publish方法,两个参数:1.服务地址;2.服务实现类 

public class WeatherServer {
    public static void main(String[] args) {
        Endpoint.publish("http://127.0.0.1:12345/weather", new WeatherInterfaceImpl());
    }
}

//4. 测试服务是否发布成功,通过阅读wsdl,确定客户端调用的接口、方法、参数和返回值存在,证明服务发布成功
//我们在浏览器输入 http://127.0.0.1:12345/weather?wsdl 来获取wsdl文件进行阅读
//wsdl,是以XML文件形式来描述WebService的”说明书”,有了说明书,我们才可以知道如何使用或是调用这个服务.
//现在我们还不知道怎么去阅读,后面我们会详解,只要能获取到,就能确定WebService服务发布成功 

insérez la description de l'image ici

implémentation client

//客户端调用服务有很多种方法,我们先用工具生成客户端代码,后面会详解  

//wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).当然,无论服务器端的WebService是用什么语言写的,都可以生成调用webservice的客户端代码。

1.创建一个客户端空项目,cmd命令行进入此项目的src目录
  使用以下命令生成客户端代码  

    wsimport -s . http://127.0.0.1:12345/weather?wsdl

    -s是指编译出源代码文件,后面的.(点)指將代码放到当前目录下.
     最后面的http….是指获取wsdl说明书的地址

insérez la description de l'image ici
Créer un nouveau client dans le fichier catalogue généré

//2.编写客户端
public class WeatherClient {

    public static void main(String[] args) {
        //创建服务视图,视图是从wsdl文件的service标签的name属性获取
        WeatherInterfaceImplService weatherInterfaceImplService=new WeatherInterfaceImplService();  

        //获取服务实现类,实现类从wsdl文件的portType的name属性获取
        WeatherInterfaceImpl weatherInterfaceImpl=weatherInterfaceImplService.getPort(WeatherInterfaceImpl.class); 
        //获取查询方法,从portType的operation标签获取
        String weather=weatherInterfaceImpl.queryWeather("北京");
        System.out.println(weather);

    }

}

À ce stade, notre client peut obtenir les données du serveur distant. Ensuite, expliquons chaque partie en détail.

WSDLName

WSDL (Web Services Description Language), langage de description de services Web, c'est le manuel d'utilisation du serveur de services Web, qui décrit l'interface, la méthode, les paramètres et la valeur de retour du serveur. WSDL est automatiquement généré avec la publication réussie du service sans en écrivant.

structure du document

insérez la description de l'image ici

  • Service : une collection de ports associés, y compris leurs interfaces, opérations, messages, etc. associés.
  • Liaison : protocole spécifique et spécification du format de données pour un type de port spécifique
  • portType : point de terminaison de service, décrivant la méthode d'opération que le service Web peut exécuter, et les messages associés, pointant vers portType via la liaison
  • message : définit les paramètres de données d'une opération (méthode)
  • types : définit tous les types de données utilisés par le service Web

méthode de lecture

Les documents WSDL doivent être lus de bas en haut.

1. Regardez d'abord la balise de service, regardez l'attribut de liaison du port correspondant, puis recherchez la balise de liaison ci-dessus via la valeur.
2. Grâce à la balise de liaison, vous pouvez obtenir le protocole spécifique et d'autres informations, puis vérifier l'attribut type de la liaison.
3. Grâce à l'attribut type de la liaison, recherchez le portType correspondant et vous pouvez obtenir les méthodes utilisables. , paramètres, valeurs de retour, etc.
4. Via l'attribut de message de la balise d'opération sous le portType, vous pouvez rechercher le message pour obtenir des informations spécifiques sur les paramètres de données.

Lire la documentation wsdl pour construire le client

  1. Sélectionnez le port en fonction de wsdl:service. Puisque nous utilisons http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl ici, le port est MobileCodeWSSoap
    insérez la description de l'image ici

  2. Observez wsdl:binding en fonction de la valeur wsdl:port et sélectionnez le nom de méthode requis (tel que getMobileCodeInfo) en fonction de wsdl:operation
    insérez la description de l'image ici

  3. Trouvez wsdl:portType et wsdl:operation selon la valeur de type de wsdl:binding, connaissez son entrée et sa sortie,
    insérez la description de l'image ici
    sachez que l'entrée est tns:getMobileCodeInfoSoapIn ; la sortie est tns:getMobileCodeInfoSoapOut

  4. Rechercher l'entrée et la sortie dans wsdl:message
    insérez la description de l'image ici

  5. Trouvez la valeur correspondante de message dans s:element de wsdl:types et déterminez le type d'entrée et de sortie et le nombre de méthodes dans xs:complexType correspondant à xs:sequence
    insérez la description de l'image ici

Construction de clients Python

from suds.client import Client
import logging

try:
    client = Client('http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl')
    print(client)
    # result = client.service.__getattr__("getMobileCodeInfo")('15118888888')
    result = client.service.__getattr__("getDatabaseInfo")()
except Exception as e:
    logging.error(e)
    # return []
print(type(result))
    # return result
print(result)

Construction du client Java

import cn.com.webxml.MobileCodeWSSoap;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.io.IOException;
import java.net.URL;

public class MobileClient2 {

    public static void main(String[] args) throws IOException {
        //创建WSDL文件的URL
        URL wsdlDocumentLocation=new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl");
        //创建服务名称
        //1.namespaceURI - 命名空间地址
        //2.localPart - 服务视图名
        QName serviceName=new QName("http://WebXml.com.cn/","MobileCodeWS");
        Service service= Service.create(wsdlDocumentLocation, serviceName);

        //获取服务实现类
        MobileCodeWSSoap mobileCodeWSSoap= service.getPort(MobileCodeWSSoap.class);
        //调用方法
        String message=mobileCodeWSSoap.getMobileCodeInfo("15118888888", null);
        System.out.println(message);

    }

}

SAVON

SOAP est Simple Object Access Protocol. Il s'agit de données au format XML envoyées par http. Il peut traverser les plates-formes et les pare-feu. SOAP n'est pas un protocole propriétaire de service Web.

SOAP=http+xml

Structure du savon

必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
可选的 Header 元素,包含头部信息
必需的 Body 元素,包含所有的调用和响应信息
可选的 Fault 元素,提供有关在处理此消息所发生错误的信息

Méthode d'appel client du Webservice

1 : Générer la méthode d'appel client

wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).
wsimport.exe位于JAVA_HOME\bin目录下 
常用参数为:
        -d<目录>  - 将生成.class文件。默认参数。
        -s<目录> - 将生成.java文件。
        -p<生成的新包名> -将生成的类,放于指定的包下

Appelez le service de requête d'attribution de téléphone mobile sur le réseau public
Adresse de service du réseau public (qui fournit de nombreux services d'appels gratuits)

http://www.webxml.com.cn/zh_cn/index.aspx

第一步:wsimport生成客户端代码 

wsimport -p cn.cad.mobile -s . http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl

会出现一些警告,是因为服务端提供的一些方法是SOAP1.2标准的,这个工具没有实现SOAP1.2标准的生成方式。    

insérez la description de l'image ici

 第二步:查看wsdl文件,获取我们需要的信息 

insérez la description de l'image ici

//第三步:根据获取到的服务名等信息来创建我们的客户端  

public class MobileClient {

    public static void main(String[] args) {
        //创建服务视图
        MobileCodeWS mobileCodeWS=new MobileCodeWS();
        //获取服务实现类
        MobileCodeWSSoap mobileCodeWSSoap= mobileCodeWS.getPort(MobileCodeWSSoap.class);
        //调用查询方法
        String message=mobileCodeWSSoap.getMobileCodeInfo("xxxxxxxx", null);
        System.out.println(message);

    }
}

insérez la description de l'image ici

Cette méthode est facile à utiliser, mais certains éléments clés sont codés en dur dans le code généré lors de la génération du code, ce qui n'est pas pratique pour la maintenance, il n'est donc utilisé que pour les tests.

Deux : méthode d'appel de programmation de service

public class MobileClient2 {

    public static void main(String[] args) throws IOException {
        //创建WSDL文件的URL
        URL wsdlDocumentLocation=new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl"); 
        //创建服务名称
        //1.namespaceURI - 命名空间地址
        //2.localPart - 服务视图名
        QName serviceName=new QName("http://WebXml.com.cn/","MobileCodeWS");
        Service service=Service.create(wsdlDocumentLocation, serviceName);

        //获取服务实现类
        MobileCodeWSSoap mobileCodeWSSoap= service.getPort(MobileCodeWSSoap.class);
        //调用方法
        String message=mobileCodeWSSoap.getMobileCodeInfo("XXXXXXX", null);
        System.out.println(message);

    }

}

Cette méthode peut personnaliser des éléments tels que l'espace de noms et le nom de la vue de service, ce qui est pratique pour la maintenance future et constitue une méthode de développement standard.

Trois : méthode d'appel HttpURLConnection

Cette méthode consiste à écrire le client par vous-même, non plus généré par l'outil, ce qui est plus gênant.

开发步骤: 

        第一步:创建服务地址

        第二步:打开一个通向服务地址的连接

        第三步:设置参数

        第四步:组织SOAP数据,发送请求

        第五步:接收服务端响应 

Modifier le contenu WSDL à l'aide d'annotations

Rôle :
Grâce aux annotations, les services Web peuvent être décrits de manière plus vivante. Modifier le document wsdl généré automatiquement pour fournir aux utilisateurs un document wsdl plus clair

Les annotations de WebService se trouvent sous le package javax.jws :

@WebService-定义服务,在类上边
    targetNamespace:指定命名空间
    name:portType的名称
    portName:port的名称
    serviceName:服务名称
    endpointInterface:SEI接口地址,如果一个服务类实现了多个接口,只需要发布一个接口的方法,可通过此注解指定要发布服务的接口。 

@WebMethod-定义方法,在公开方法上边
    operationName:方法名
    exclude:设置为true表示此方法不是webservice方法,反之则表示webservice方法,默认是false 

@WebResult-定义返回值,在方法返回值前边
    name:返回结果值的名称 

@WebParam-定义参数,在方法参数前边
    name:指定参数的名称
//以我们前面做的天气案例为例子

@WebService(
        targetNamespace="http://service.cad.com",
        portName="WeatherSOAPPort",
        serviceName="WeatherWSS",
        name="WeatherSOAP"  
)
public class WeatherInterfaceImpl implements WeatherInterface {

    @WebMethod(
            operationName="getWeather",
            exclude=false
    )
    public @WebResult(name="result")String queryWeather(@WebParam(name="cityName")String cityName) {
        System.out.println("获取城市名"+cityName);
        String weather="暴雨";    
        return weather;
    }

}

Republiez ensuite le service et nous pourrons visiter à nouveau le fichier wsdl pour voir ce que nous avons modifié

insérez la description de l'image ici

Lien de référence : Java implémente un service Web simple_développement de l'interface de service Web Java_Blog de l'oncle Ma Porridge - Blog CSDN
En cas d'infraction, veuillez contacter Lide

Je suppose que tu aimes

Origine blog.csdn.net/qq_39706515/article/details/130732202
conseillé
Classement