首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DHL SOAP请求

DHL SOAP请求
EN

Stack Overflow用户
提问于 2021-09-01 20:38:04
回答 2查看 751关注 0票数 2

我正在尝试使用来自DHL的API来添加装运细节,并得到一个标签作为回报。我正在与SoapUI一起使用soapbox,并且能够发出请求。现在我想用Python来做这件事。我对台阶不太确定。我偶然发现了这个:DHL Soap Request Python

有人能帮我把这事办完吗?身份验证工作正常,但我不知道如何构建soap请求。

第一个试验是使用SoapUI软件来执行一些简单的请求或测试所有的东西。凭我的凭据,我可以发送一个请求并得到一个标签作为回报。

作为端点,使用了以下URL,取自doc:https://cig.dhl.de/services/sandbox/soap

XML如下所示:

代码语言:javascript
复制
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cis="http://dhl.de/webservice/cisbase" xmlns:ns="http://dhl.de/webservices/businesscustomershipping/3.0"> 
   <soapenv:Header> 
      <cis:Authentification> 
         <cis:user>2222222222_01</cis:user> 
         <cis:signature>pass</cis:signature> 
      </cis:Authentification> 
   </soapenv:Header> 
   <soapenv:Body> 
      <ns:CreateShipmentOrderRequest> 
         <ns:Version> 
            <majorRelease>3</majorRelease> 
            <minorRelease>1</minorRelease> 
         </ns:Version> 
         <ShipmentOrder> 
            <sequenceNumber></sequenceNumber> 
            <Shipment> 
               <ShipmentDetails> 
                  <product>V62WP</product> 
                  <cis:accountNumber>${#Project#testAccountNumberV62WP}</cis:accountNumber> 
                  <customerReference>123456</customerReference> 
                  <shipmentDate>2021-09-03</shipmentDate> 
                  <costCentre></costCentre> 
                  <ShipmentItem> 
                     <weightInKG>1</weightInKG> 
                     <lengthInCM>25</lengthInCM> 
                     <widthInCM>15</widthInCM> 
                     <heightInCM>1</heightInCM> 
                  </ShipmentItem> 
                  <Service> 
                  </Service> 
                  <Notification> 
                     <recipientEmailAddress>empfaenger@test.de</recipientEmailAddress> 
                  </Notification> 
               </ShipmentDetails> 
               <Shipper> 
                  <Name> 
                     <cis:name1>Absender Zeile 1</cis:name1> 
                     <cis:name2>Absender Zeile 2</cis:name2> 
                     <cis:name3>Absender Zeile 3</cis:name3> 
                  </Name> 
                  <Address> 
                     <cis:streetName>Vegesacker Heerstr.</cis:streetName> 
                     <cis:streetNumber>111</cis:streetNumber> 
                     <cis:zip>28757</cis:zip> 
                     <cis:city>Bremen</cis:city> 
                     <cis:Origin> 
                        <cis:country></cis:country> 
                        <cis:countryISOCode>DE</cis:countryISOCode> 
                     </cis:Origin> 
                  </Address> 
                  <Communication> 
                     <!--Optional:--> 
                     <cis:phone>+49421987654321</cis:phone> 
                     <cis:email>absender@test.de</cis:email> 
                     <!--Optional:--> 
                     <cis:contactPerson>Kontaktperson Absender</cis:contactPerson> 
                  </Communication> 
               </Shipper> 
               <Receiver> 
                  <cis:name1>Name</cis:name1> 
                  <Address> 
                     <cis:name2>Empfänger Zeile 2</cis:name2> 
                     <cis:name3>Empfänger Zeile 3</cis:name3> 
                     <cis:streetName>Street</cis:streetName> 
                     <cis:streetNumber>Number</cis:streetNumber> 
                     <cis:zip>zipCode</cis:zip> 
                     <cis:city>City</cis:city> 
                     <cis:Origin> 
                        <cis:country></cis:country> 
                        <cis:countryISOCode>DE</cis:countryISOCode> 
                     </cis:Origin> 
                  </Address> 
                  <Communication> 
                     <cis:phone>+49421123456789</cis:phone> 
                     <cis:email>empfaenger@test.de</cis:email> 
                     <cis:contactPerson>Kontaktperson Empfänger</cis:contactPerson> 
                  </Communication> 
               </Receiver> 
            </Shipment> 
            <PrintOnlyIfCodeable active="1"/> 
         </ShipmentOrder> 
         <labelResponseType>URL</labelResponseType> 
         <groupProfileName></groupProfileName> 
         <labelFormat></labelFormat> 
         <labelFormatRetoure></labelFormatRetoure> 
         <combinedPrinting>0</combinedPrinting> 
      </ns:CreateShipmentOrderRequest> 
   </soapenv:Body> 
</soapenv:Envelope>

我的Python代码如下所示:

代码语言:javascript
复制
from requests import Session
from requests.auth import HTTPBasicAuth
from zeep import Client, xsd
from zeep.transports import Transport

user = "my_user_name"
password = "my_password"
USER = "2222222222_01" #from doc
PASSWORD = "pass" #from doc
EKP = "2222222222"

wsdl = "./geschaeftskundenversand-api-3.1.8.wsdl" #downloaded and stored local

session = Session()

# Authenticate  with gateway
session.auth = HTTPBasicAuth(user, password)
client = Client(wsdl, transport=Transport(session=session))

# Build Authentification header for API-Endpoint using zeep xsd
header = xsd.Element(
    '{http://test.python-zeep.org}Authentification',
    xsd.ComplexType([
        xsd.Element(
            '{http://test.python-zeep.org}user',
            xsd.String()),
        xsd.Element(
            '{http://test.python-zeep.org}signature',
            xsd.String()),
    ])
)
header_value = header(user = USER, signature = PASSWORD)
client.service.createShipmentOrder(_soapheaders=[header_value])

因此,我得到了一个跟踪:缺少元素版本

在我看来,身份验证是有效的,现在我需要插入XML的主体部分。我的理解是,下一步应该是:

client.service.createShipmentOrder

举个例子,我可以通过一本字典。createShipmentOrder是纪录片中所述的请求之一。它返回状态确定的XML、托运号和打印标签的URL。在我看来,现在我必须传递XML中所述的地址等等。在SoupUI中,请求被发送到端点URL https://cig.dhl.de/services/sandbox/soap。但是在我的Python代码中,没有说明端点。我需要它吗?还是它是我本地存储的wsdl文件的一部分?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-29 20:31:40

因此,由于没有人能够帮助我,所以我自己做了:)

我需要几个小时才能理解API,但现在很清楚.

你可以使用我问题中的大部分代码。您必须生成一个嵌套字典,其中包含所有需要的数据。例如:

代码语言:javascript
复制
dict = {'Version':{'majorRelease' : '3', 'minorRelease' : '1'},
                    'ShipmentOrder':
                        {'sequenceNumber':'','Shipment':
                            {'ShipmentDetails':
                                {'product':product, 'accountNumber':accountNumber, 'customerReference':customerReference,
                                'shipmentDate':shipmentDate,
                                'ShipmentItem':{'weightInKG':'0.9', 'lengthInCM':'35', 'widthInCM':'24', 'heightInCM':'5'}
                                },
                            'Shipper':{
                                'Name':{'name1':'your name'},
                                'Address':{'streetName':'your street','streetNumber':'1234', 'zip':'11111', city':'New York',
                                    'Origin':{'country':'', 'countryISOCode':'DE'}}
                            },
                            'Receiver':{
                            'name1':receiver_name,
                                'Address':{'streetName':receiver_street,'streetNumber':receiver_streetnumber, 'zip':receiver_zip, 'city':receiver_city,
                                'Origin':{'country':'', 'countryISOCode':'DE'}}
                            }
                            }
                        },
                        'labelFormat':label_groesse
            }

将wsdl文件保存到文件夹中,并将脚本链接到它,如下所示:

代码语言:javascript
复制
wsdl = "./geschaeftskundenversand-api-3.1.8.wsdl"

您需要在网关上为请求和身份验证提供一个标头。身份验证是在一个简单的请求上运行的,如问题中所示。

现在您所需要的只是soap请求:

代码语言:javascript
复制
response = client.service.createShipmentOrder(_soapheaders=[header_value], **dict)

你把头和小弟弟放进去了。如果你运行所有的东西,那么你会得到一个回复,上面写着'OK‘,里面有一个装运号和标签上的网址。

就这样。

我在Raspberry Pi4上运行带有流光部分的脚本,并让标签打印机打印所有内容。在这里,我打印标签的代码:

代码语言:javascript
复制
import subprocess
conn = cups.Connection() #Connection to CUPS
printers = conn.getPrinters() #Get all listed printers
use_printer = printers['QL-1110NWB']["device-uri"] #choose the one label printer
 
file = requests.get(label_url) #Save the label from url into pdf document locally

with open('label.pdf', 'wb') as pdf:
   pdf.write(file.content)

               
subprocess.run(['lp', '-d', 'QL-1110NWB', '-o fit-to-page', 'label.pdf']) # print the saved label
票数 2
EN

Stack Overflow用户

发布于 2022-04-13 22:54:02

如果您是为了测试目的通过sandbox,请看这个。https://stackoverflow.com/a/71864532/5987487

即使不使用沙箱,也要检查端点url在wsdl文件中是否正确。

我一直面临着同样的问题。我也阅读了所有可用的答案,但问题一点也不傻。可能是您发到了错误的soap端点。这在我的情况下是真的。

它甚至可以使用以下最小的代码-

代码语言:javascript
复制
header = xsd.Element(
                    'Authentification',
                     xsd.ComplexType([
                        xsd.Element('user', xsd.String()),
                        xsd.Element('signature', xsd.String())]))

header_value = header(user="2222222222_01", signature="pass")

client.set_default_soapheaders([header_value])

# A test case
client.service.getVersion(majorRelease='3')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69020306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档