我的任务是编写一个与ClearBooks API交互的程序。他们有一些documentation,但我仍然在努力开始。从我可以从文档中收集到的内容,为了接收看似神秘的“响应200”,我需要:
我目前的代码如下:
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密钥的情况下测试的东西,但是非常感谢任何帮助。
答案 0 :(得分:2)
你的代码根本就不傻。
但是目前你正在制作一个HTTP&#39; GET&#39;请求。这与在网络浏览器中输入网址并点击输入相同。
您的第一条指令是&#34;发布XML请求&#34;到SOAP服务器的URL。当你做一个&#39; POST&#39;请求它就像您在网页上提交表单一样。换句话说,您不只是请求网址,您也会将一些数据发送到该网址。
在这种情况下,您需要准备一个有效的SOAP消息(一个XML文档),并将其发送到SOAP服务器URL。
见这里:http://docs.python-requests.org/en/latest/user/quickstart/#more-complicated-post-requests
在这种情况下,我们不发布表单编码数据,我们希望将XML作为字符串发送(请参阅上面url的第二个示例)
通过以字符串形式输入正确的消息,完全可以手动执行此操作。但是至少可以更容易地使用诸如lxml
之类的XML库或诸如suds
之类的专用SOAP库来使这更容易。
我要指出的一件事是&#34; SOAP Header&#34;是XML消息的一部分,与HTTP标头不同。 http://www.w3schools.com/webservices/ws_soap_header.asp
您已正确发送了Content-Type: text/xml
HTTP标头,但做得好:)
答案 1 :(得分:2)
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]>