【问题标题】:Struggling to interact with an API努力与 API 交互
【发布时间】:2014-12-04 15:26:56
【问题描述】:

我的任务是编写一个与 ClearBooks 的 API 交互的程序。他们有一些documentation,但我仍然很难开始。根据我从文档中收集到的信息,为了接收看似神秘的“响应 200”,我需要:

  1. 向“https://secure.clearbooks.co.uk/api/soap/”发布“XML 请求”
  2. 将“请求 http 标头”设置为“Content-Type: text/xml”
  3. 在我的 API 密钥(我在本地拥有)中包含一个“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>

我知道我的代码可能看起来很愚蠢,但这是我第一次尝试编写与 Internet 交互的程序,尽管我花了几天时间尝试破解它,但这是我我发现真的很难 - 我已经设法从通用网页中抓取文本,但没有设法与没有 Codecademy 或类似的任何 API 进行交互。请问有人可以更新我的代码(或者更有可能从头开始)以便它工作吗?我知道如果没有自己的 Clearbooks API 密钥,您就无法测试它,但我们将非常感谢您提供任何帮助。

【问题讨论】:

    标签: python api http soap python-requests


    【解决方案1】:

    你的代码一点也不傻。

    但目前您正在发出 HTTP 'GET' 请求。这与在您的网络浏览器中输入一个网址并按回车键相同。

    您的第一条指令是“发布 XML 请求”到 SOAP 服务器 url。当您发出“POST”请求时,就像您在网页上提交表单一样。换句话说,您不仅请求一个 url,还向该 url 发送一些数据。

    在这种情况下,您需要准备一个有效的 SOAP 消息,它是一个 XML 文档,并将其 POST 到 SOAP 服务器 url。

    请看这里:http://docs.python-requests.org/en/latest/user/quickstart/#more-complicated-post-requests

    在这种情况下,我们不发布表单编码的数据,我们希望将 XML 作为字符串发送(参见上面 url 的第二个示例)

    完全可以手动执行此操作,只需将正确的消息输入为字符串。但至少使用lxml 等XML 库或suds 等专用SOAP 库可能更容易。

    我要指出的一点是,“SOAP 标头”是 XML 消息的一部分,与 HTTP 标头不同。 http://www.w3schools.com/webservices/ws_soap_header.asp

    您已经正确发送了Content-Type: text/xml HTTP 标头,做得好:)

    【讨论】:

    • 感激不尽,API已经转过头来说话了! :D 我不知道如何组合 XML,但幸运的是找到了 this example。如果有人感兴趣,我会发布我的代码作为答案。
    • 恭喜!如果您必须与此 API 进行大量交互,我强烈建议您查看suds...您只需将其指向the URI of the API's wsdl,它就会为您构建一个您可以像client.service.CreatePayment(...) 一样使用的python 客户端...节省很多用于制定有效 SOAP 消息的凌乱而脆弱的字符串模板
    【解决方案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]>
    

    【讨论】:

    • 我收到 500 错误。与此非常相似。联系claerbooks。
    猜你喜欢
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2023-04-03
    • 2015-09-22
    • 2017-07-24
    • 1970-01-01
    相关资源
    最近更新 更多