Behandeln Sie die SOAP-API von Python (Zeep)

Einführung

Kennen Sie die SOAP-API? Wenn Sie eine API erstellen, erstellen wir sie mit der SOAP-API! Dies ist selten der Fall, aber je nach verwendetem Dienst wird die SOAP-API selten bereitgestellt (persönlicher Eindruck). In diesem Artikel möchte ich Ihnen einen Überblick über die SOAP-API geben und Ihnen Zeep, den SOAP-API-Client von Python, vorstellen.

SOAP API SOAP Das Simple Object Access Protocol (SOAP) ist ein Protokoll, das Internet-Standardtechnologien wie HTTP und XML verwendet.

WSDL Web Services Description Language (WSDL) ist eine Schnittstellenbeschreibungssprache für in XML geschriebene Webdienste. Gemäß dem folgenden Artikel (https://www.atmarkit.co.jp/ait/articles/0303/18/news003.html) wird der Code für das Webdienstmodul generiert, wenn das Entwicklungstool das WSDL-Dokument liest. Scheint erwartet worden zu sein

Ziel

Die Sponsord Search-API von Yahoo ist eine SOAP-API, daher möchte ich diese in Python schreiben.

Das Beispiel ist auch PHP oder Java, also sieht es gut aus

Zeep

Verwenden wir sofort Zeep Erstellen Sie ein Zeep-Clientobjekt, indem Sie die WSDL-URL angeben. Geben wir als Beispiel "Account Service" an

import zeep
client = zeep.Client(wsdl='https://ss.yahooapis.jp/services/V201901/AccountService?wsdl')

Informationen, die aus der WSDL gelesen werden können, werden dem erstellten Objekt hinzugefügt, und eine Methode, die den vom Endpunkt verfügbaren Aufruf aufruft, wird ebenfalls hinzugefügt.

>>> 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']

Überprüfen Sie als Nächstes die Argumente, die in WSDL an die Methode übergeben werden sollen. Überprüfen Sie zunächst den Header, der an die SOAP-API übergeben werden soll. Das Element "minOccurs = 1" ist erforderlich. Geben Sie es daher unbedingt an.

<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>
    }
}

Überprüfen Sie als Nächstes die erforderlichen Argumente für die Methode get. Sie müssen selecter angeben, aber es scheint, dass Sie die Elemente in selector nicht angeben müssen

<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": {}
}

Nachdem wir nun die Argumente haben, die an die Methode übergeben werden sollen, können wir die Methode aufrufen. Wenn wir jedoch auf die WSDL zurückblicken, sehen wir die folgende Beschreibung. Sie müssen das Endpunktpräfix von "Location Service" abrufen und die Endpunkte wechseln. Da der Standortdienst jedoch die Konto-ID als Argument angeben muss, ist der Standortdienst nicht bekannt, wenn der Kontodienst zum Abrufen der Konto-ID-Liste verwendet wird. Sie können `nicht verwenden. Geben Sie daher einen festen Wert an

<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>

In Zeep können Sie den Endpunkt des Clientobjekts mithilfe der Methode "create_service" der Klasse "Client" wechseln. Es scheint gut, zwischen der Produktumgebung und der Sandboxumgebung zu wechseln oder sich mit der Testumgebung zu verbinden.

service = client.create_service(
    '{http://ss.yahooapis.jp/V201901/Account}AccountServiceSoapBinding',
    'https://ss.yahooapis.jp/services/V201901/AccountService'
)

Nachdem Sie die erforderlichen Vorbereitungen getroffen haben, verwenden Sie "get", um die "Account ID" -Liste abzurufen. Dies sind die Elemente, die mit WSDL überprüft werden müssen, wenn die SOAP-API aufgerufen wird.

response = service.get(**request, _soapheaders=header)

In "Account Service" wird der Endpunkt mit einem festen Wert umgeschaltet, in anderen Diensten wird er auf den vom "Location Service" erfassten Endpunkt umgeschaltet. Wenn Sie beispielsweise "Campaign Service" verwenden möchten, führen Sie die folgenden Schritte aus.

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)

Impressionen

Als Artikel wurde es eher zu einer Erklärung von WSDL als zu einer Einführung von Python und Zeep ... Ich hatte das Gefühl, dass es schwierig war zu verstehen, welche als Client-Bibliothek der SOAP-API gut ist, daher war es eine Gelegenheit, Zeep bei der Verwendung von Python in Betracht zu ziehen. Ich bin froh wenn

Verweise

Recommended Posts

Behandeln Sie die SOAP-API von Python (Zeep)
Holen Sie sich mit Python + Zeep einen Zeitplan von der Garoon SOAP API
Verwenden Sie die e-Stat-API von Python
Verwenden Sie die kabu Station® API von Python
Verwenden Sie die Flickr-API von Python
Python Holen Sie sich das kommende Wetter von der Wetter-API
Führen Sie Ansible über Python mithilfe der API aus
Verwenden Sie die Google Analytics-API von Python
Sammeln von Informationen von Twitter mit Python (Twitter API)
[Python] Webanwendung von 0! Hands-on (3) -API-Implementierung-
Python: Lesen von JSON-Daten von der Web-API
Verwenden Sie die Google Cloud Vision-API von Python
Ich habe versucht, die UnityCloudBuild-API von Python zu verwenden
API-Erklärung zum Berühren von Mastodon aus Python
Stellen Sie von Python aus eine Verbindung zur Websocket-API von coincheck her
SQL zu SQL
MeCab von Python
Versuchen Sie, direkt von Python 3 aus auf die YQL-API zuzugreifen
Berühren Sie MySQL in Python 3
Bedienen Sie Filemaker von Python aus
Übersetzen von Visual Studio 2017 nach Python (Microsoft Translator Text API)
Greifen Sie über Python auf Bitcoind zu
Änderungen von Python 3.0 zu Python 3.5
Änderungen von Python 2 zu Python 3.0
[Python] Ruft den Gesetzestext aus der e-GOV-Gesetz-API ab
Python aus oder importieren
PUSH-Benachrichtigung von Python an Android mithilfe der Google-API
Verwenden Sie MySQL aus Python
Führen Sie Python aus Excel aus
Führen Sie Befehle aus Python aus
Behandle Excel mit Python
Liste der Python-APIs für OpenCV3
Behandle Rabbimq mit Python
Markdown mit Python behandeln
Verwenden Sie MySQL aus Python
Treffen Sie Watsons REST-API von Python mit IBM Bluemix
Betreiben Sie LXC von Python aus
Manipuliere Riak aus Python
Erzwinge Python aus Fortran
Verwenden Sie BigQuery aus Python.
C-API in Python 3
Führen Sie den Befehl von Python aus
[Python] Von Stdin lesen
Verwenden Sie mecab-ipadic-neologd von Python
Ich habe versucht, API list.csv mit Python aus swagger.yaml zu erstellen
Rufen Sie die Bing Image Search API v5 von Python auf, um Bilder zu sammeln
Abrufen von Daten aus der Analyse-API mit Google API Client für Python
Hit Mastodons API in Python
Mit Python abflachen
Rufen Sie CPLEX von Python aus auf (DO cplex)
Behandeln Sie Umgebungsdaten in Python
Verwenden Sie die Trello-API mit Python
Post von Python nach Slack
Flirte von PHP nach Python
AWS CDK-Lambda + API-Gateway (Python)
EXE Web API von Python
Stellen Sie MeCab in Python 3 zur Verfügung
Verwenden Sie die Twitter-API mit Python