Python 努力与API交互
我的任务是编写一个与ClearBooks的API交互的程序。他们有一些,但我仍然很难开始。从我从文档中收集到的信息来看,为了得到看似神秘的答案,我需要: 将“XML请求”发布到 将“请求http头”设置为内容类型:text/xml 包括一个带有本地API密钥的“SOAP头” 我目前的代码如下:Python 努力与API交互,python,api,http,soap,python-requests,Python,Api,Http,Soap,Python Requests,我的任务是编写一个与ClearBooks的API交互的程序。他们有一些,但我仍然很难开始。从我从文档中收集到的信息来看,为了得到看似神秘的答案,我需要: 将“XML请求”发布到 将“请求http头”设置为内容类型:text/xml 包括一个带有本地API密钥的“SOAP头” 我目前的代码如下: import requests url = "https://secure.clearbooks.co.uk/api/soap/" headers = {"Content-Type": "text/xm
import requests
url = "https://secure.clearbooks.co.uk/api/soap/"
headers = {"Content-Type": "text/xml", "apiKey": "(api key goes here)"}
response = requests.get(url=url, headers=headers)
print(response)
print(response.text)
>>> <Response [500]>
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><SOAP-ENV:Fault><faultcode>Sender</faultcode><faultstring>Invalid XML</faultstring></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>
我知道我的代码可能看起来很愚蠢,但这是我第一次尝试编写一个与互联网交互的程序,尽管我花了几天时间试图破解它,我发现这是一件非常困难的事情——我已经设法从普通网页中抓取文本,但在没有Codecademy或类似代码的情况下,还没有设法与任何API进行交互。请有人更新我的代码或更可能从零开始,以便它的工作?我意识到,如果没有自己的Clearbooks API密钥,您无法对其进行测试,但任何帮助都将不胜感激。您的代码一点也不愚蠢 但目前您正在发出HTTP“GET”请求。这与在web浏览器中键入url并按enter键相同 不过,您的第一条指令是将XML请求发布到SOAP服务器url。当你发出“POST”请求时,就像你在网页上提交表单一样。换句话说,您不仅需要请求一个url,还需要向该url发送一些数据 在这种情况下,您需要准备一个有效的SOAP消息,它是一个XML文档,并将其发布到SOAP服务器url 请看这里: 在本例中,我们不是发布表单编码的数据,而是希望将XML作为字符串发送,请参见上面url中的第二个示例 通过以字符串形式键入正确的消息,完全可以手动执行此操作。但至少使用XML库(如)或专用SOAP库(如)来简化这一过程可能更容易 我要指出的一点是,SOAP头是XML消息的一部分,与HTTP头不同
您已经正确地发送了内容类型:text/xmlhttp头,做得好:您的代码一点也不愚蠢
import requests
url = "https://secure.clearbooks.co.uk/api/soap/"
header = {"Content-Type": "text/xml"}
myxml = """<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"
xmlns:cb="https://secure.clearbooks.co.uk/api/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:enc="http://www.w3.org/2003/05/soap-encoding">
<env:Header>
<cb:authenticate apiKey="API_key_goes_here" />
</env:Header>
<env:Body>
<env:listProjects env:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
offset="3"
</env:listProjects>
</env:Body>
</env:Envelope>
"""
response = requests.post(url, data=myxml, headers=header)
print(response)
>>> <Response [200]>
但目前您正在发出HTTP“GET”请求。这与在web浏览器中键入url并按enter键相同
不过,您的第一条指令是将XML请求发布到SOAP服务器url。当你发出“POST”请求时,就像你在网页上提交表单一样。换句话说,您不仅需要请求一个url,还需要向该url发送一些数据
在这种情况下,您需要准备一个有效的SOAP消息,它是一个XML文档,并将其发布到SOAP服务器url
请看这里:
在本例中,我们不是发布表单编码的数据,而是希望将XML作为字符串发送,请参见上面url中的第二个示例
通过以字符串形式键入正确的消息,完全可以手动执行此操作。但至少使用XML库(如)或专用SOAP库(如)来简化这一过程可能更容易
我要指出的一点是,SOAP头是XML消息的一部分,与HTTP头不同
您已经正确地发送了内容类型:text/xml HTTP header,但做得很好:我非常感谢您,API已经回过头来说话了!:我不知道如何组合XML,但幸运的是找到了。如果有人感兴趣,我会发布我的代码作为答案。恭喜!如果您必须与此API进行大量交互,我强烈建议您查看。。。您只需指向它,它就为您构建了一个python客户端,您可以像client.service.CreatePayment一样使用它。。。为制定有效的SOAP消息节省了大量杂乱而脆弱的字符串模板。我非常感谢您,API已经改变了主意,开始说话了!:我不知道如何组合XML,但幸运的是找到了。如果有人感兴趣,我会发布我的代码作为答案。恭喜!如果您必须与此API进行大量交互,我强烈建议您查看。。。您只需指向它,它就为您构建了一个python客户端,您可以像client.service.CreatePayment一样使用它。。。节省了大量杂乱和脆弱的字符串模板来制定有效的SOAP消息。我收到一个500错误。与此非常相似。正在联系claerbooks。我收到一个500错误。与此非常相似。联系claerbooks。
import requests
url = "https://secure.clearbooks.co.uk/api/soap/"
header = {"Content-Type": "text/xml"}
myxml = """<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"
xmlns:cb="https://secure.clearbooks.co.uk/api/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:enc="http://www.w3.org/2003/05/soap-encoding">
<env:Header>
<cb:authenticate apiKey="API_key_goes_here" />
</env:Header>
<env:Body>
<env:listProjects env:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
offset="3"
</env:listProjects>
</env:Body>
</env:Envelope>
"""
response = requests.post(url, data=myxml, headers=header)
print(response)
>>> <Response [200]>