苦苦挣扎与API互动

时间:2014-12-04 15:26:56

标签: python api http soap python-requests

我的任务是编写一个与ClearBooks API交互的程序。他们有一些documentation,但我仍然在努力开始。从我可以从文档中收集到的内容,为了接收看似神秘的“响应200”,我需要:

  1. 将“XML请求”发布到“https://secure.clearbooks.co.uk/api/soap/
  2. 将“请求http标头”设置为“Content-Type:text / xml”
  3. 在我的API密钥(我在本地使用)
  4. 中加入“SOAP标头”

    我目前的代码如下:

    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密钥的情况下测试的东西,但是非常感谢任何帮助。

2 个答案:

答案 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]>