Gérer l'API SOAP depuis Python (Zeep)

introduction

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

Cible

É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 parLocation 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)

Impressions

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

Les références

Recommended Posts

Gérer l'API SOAP depuis Python (Zeep)
Obtenir le calendrier de l'API Garoon SOAP avec Python + Zeep
Utilisez l'API e-Stat de Python
Utilisez l'API kabu Station® de Python
Utilisez l'API Flickr de Python
python Obtenez la météo à venir de l'API météo
Exécutez Ansible à partir de Python à l'aide de l'API
Utiliser l'API Google Analytics de Python
Collecter des informations sur Twitter avec Python (API Twitter)
[Python] Application Web à partir de 0! Pratique (3) - Mise en œuvre de l'API
Python: lecture de données JSON à partir de l'API Web
Utiliser l'API Google Cloud Vision de Python
J'ai essayé d'utiliser l'API UnityCloudBuild de Python
Explication API pour toucher mastodonte de python
Connectez-vous à l'API Websocket de Coincheck depuis Python
sql à sql
MeCab de Python
Essayez d'accéder à l'API YQL directement depuis Python 3
Touchez MySQL depuis Python 3
Exploitez Filemaker depuis Python
Traduire de Visual Studio 2017 vers Python (API Microsoft Translator Text)
Accéder à bitcoind depuis python
Changements de Python 3.0 à Python 3.5
Changements de Python 2 à Python 3.0
[Python] Récupérez le texte de la loi à partir de l'API e-GOV law
Python depuis ou import
Notification PUSH de Python vers Android à l'aide de l'API de Google
Utilisez MySQL depuis Python
Exécutez Python à partir d'Excel
Exécuter des commandes depuis Python
Gérez Excel avec python
Liste des API Python pour OpenCV3
Manipuler rabbimq avec python
Gérer le démarquage avec python
Utiliser MySQL depuis Python
Hit API REST de Watson à partir de Python avec IBM Bluemix
Faire fonctionner LXC depuis Python
Manipuler riak depuis python
Forcer Python depuis Fortran
Utilisez BigQuery depuis Python.
API C en Python 3
Exécuter la commande depuis Python
[Python] Lire depuis Stdin
Utilisez mecab-ipadic-neologd de Python
J'ai essayé de créer une API list.csv avec Python à partir de swagger.yaml
Appelez l'API Bing Image Search v5 depuis Python pour collecter des images
Obtenez des données de l'API d'analyse avec le client API Google pour python
Hit API de Mastodon en Python
Aplatir à l'aide du rendement Python de
Appeler CPLEX depuis Python (DO cplex)
Gérer les données ambiantes en Python
Utiliser l'API Trello avec python
Publier de Python vers Slack
Flirter de PHP à Python
AWS CDK-Lambda + API Gateway (Python)
API Web EXE par Python
Rendre MeCab disponible à partir de Python 3
Utiliser l'API Twitter avec Python