Connaissez-vous l'API SOAP? Lors de la création d'une API, créons-la avec l'API SOAP! C'est rarement le cas, mais selon le service que vous utilisez, l'API SOAP est rarement fournie (impression personnelle). Dans cet article, je voudrais vous donner un aperçu de l'API SOAP et vous présenter Zeep, le client API SOAP de Python.
SOAP API SOAP Le protocole SOAP (Simple Object Access Protocol) est un protocole qui utilise des technologies standard Internet telles que HTTP et XML.
WSDL Le langage de description de services Web (WSDL) est un langage de description d'interface pour les services Web écrits en XML. Selon l'article suivant (https://www.atmarkit.co.jp/ait/articles/0303/18/news003.html), lorsque l'outil de développement lit le document WSDL, le code du module de service Web est généré. On s'attend à ce que
Étant donné que l'API Sponsord Search de Yahoo est une API SOAP, j'aimerais l'écrire en python.
L'exemple est également php ou java, donc il a l'air bien
Zeep
Utilisons Zeep immédiatement Créez un objet client Zeep en spécifiant l'URL WSDL. Spécifions ʻAccount Service` comme exemple
import zeep
client = zeep.Client(wsdl='https://ss.yahooapis.jp/services/V201901/AccountService?wsdl')
Les informations qui peuvent être lues à partir du WSDL sont ajoutées à l'objet créé et une méthode qui appelle l'appel disponible à partir du point de terminaison est également ajoutée.
>>> dir(client.service)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__self_class__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__thisclass__', 'get', 'mutate']
Ensuite, vérifiez les arguments à transmettre à la méthode dans WSDL.
Tout d'abord, vérifiez l'en-tête à transmettre à l'API SOAP. L'élément minOccurs = 1
est obligatoire, assurez-vous donc de le spécifier.
<complexType name="SoapHeader">
<sequence>
<element maxOccurs="1" minOccurs="1" name="license" type="xsd:string"/>
<element maxOccurs="1" minOccurs="1" name="apiAccountId" type="xsd:string"/>
<element maxOccurs="1" minOccurs="1" name="apiAccountPassword" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="accountId" type="xsd:long"/>
<element maxOccurs="1" minOccurs="0" name="onBehalfOfAccountId" type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="onBehalfOfPassword" type="xsd:string"/>
</sequence>
</complexType>
header = {
"RequestHeader": {
"license": <LICENSE>,
"apiAccountId": <API_ACCOUNT_ID>,
"apiAccountPassword": <API_ACCOUNT_PASSWORD>
}
}
Ensuite, vérifiez les arguments requis pour la méthode get. Vous devez spécifier selecter
, mais il semble que vous n'ayez pas besoin de spécifier les éléments dans selector
<element name="get">
<complexType>
<sequence>
<element maxOccurs="1" minOccurs="1" name="selector" type="tns:AccountSelector"/>
</sequence>
</complexType>
</element>
<complexType name="AccountSelector">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="accountIds" type="xsd:long"/>
<element maxOccurs="unbounded" minOccurs="0" name="accountTypes" type="tns:AccountType"/>
<element maxOccurs="unbounded" minOccurs="0" name="accountStatuses" type="tns:AccountStatus"/>
<element maxOccurs="1" minOccurs="0" name="paging" type="adv:Paging"/>
</sequence>
</complexType>
request = {
"selector": {}
}
Maintenant que nous avons les arguments à passer à la méthode, nous sommes prêts à appeler la méthode, mais en regardant le WSDL, nous voyons la description suivante. Vous devez obtenir le préfixe de point de terminaison à partir de Service de localisation
et changer de point de terminaison. Cependant, étant donné que Service de localisation
doit spécifier l'ID de compte
comme argument, Service de localisation
n'est pas connu lorsque l'on utilise ʻAccount Service
pour obtenir la liste d'ID de compte
. Vous ne pouvez pas utiliser `. Par conséquent, spécifiez une valeur fixe
<wsdl:service name="AccountService">
<wsdl:port binding="tns:AccountServiceSoapBinding" name="AccountService">
<wsdlsoap:address location="https://USE_ADDRESS_RETURNED_BY_LOCATION_SERVICE/services/V201901/AccountService"/>
</wsdl:port>
</wsdl:service>
Dans Zeep, vous pouvez changer le point de terminaison de l'objet client en utilisant la méthode create_service
de la classe Client
. Il semble bon de basculer entre l'environnement prod et l'environnement sandbox, ou de se connecter à l'environnement de test.
service = client.create_service(
'{http://ss.yahooapis.jp/V201901/Account}AccountServiceSoapBinding',
'https://ss.yahooapis.jp/services/V201901/AccountService'
)
Maintenant que vous avez les préparatifs nécessaires, utilisez get
pour obtenir la liste des ID de compte
. Ce sont les éléments à vérifier avec WSDL lors de l'utilisation de l'API SOAP.
response = service.get(**request, _soapheaders=header)
ʻAccount Servicebascule le point final avec une valeur fixe, mais d'autres services basculent vers le point final acquis par
Location Service`. Par exemple, si vous souhaitez utiliser «Service de campagne», suivez les étapes ci-dessous.
location_client = zeep.Client(wsdl='https://ss.yahooapis.jp/services/V201901/LocationService?wsdl')
location_request = {
"accountId": "{}".format(account_id)
}
res_location_service = location_client.service.get(**location_request, _soapheaders=header)
url_prefix = res_location_service['body']['rval']['value']
campaign_client = zeep.Client(wsdl='https://ss.yahooapis.jp/services/V201901/CampaignService?wsdl')
campaign_request = {
"selector": {
"accountId": "{}".format(account_id)
}
}
campaign_service = campaign_client.create_service(
'{http://ss.yahooapis.jp/V201901/Campaign}CampaignServiceSoapBinding',
'https://{}/services/V201901/CampaignService'.format(url_prefix)
)
response_campaign_reports = campaign_service.get(**campaign_request, _soapheaders=header)
En tant qu'article, il est devenu une explication de WSDL plutôt qu'une introduction de Python et Zeep ... J'ai senti qu'il était difficile de comprendre lequel était bon comme bibliothèque cliente d'API SOAP, donc c'était l'occasion de considérer Zeep lors de l'utilisation de python. Je suis content si
Recommended Posts