Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 努力与API交互_Python_Api_Http_Soap_Python Requests - Fatal编程技术网

Python 努力与API交互

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

我的任务是编写一个与ClearBooks的API交互的程序。他们有一些,但我仍然很难开始。从我从文档中收集到的信息来看,为了得到看似神秘的答案,我需要:

将“XML请求”发布到 将“请求http头”设置为内容类型:text/xml 包括一个带有本地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>

我知道我的代码可能看起来很愚蠢,但这是我第一次尝试编写一个与互联网交互的程序,尽管我花了几天时间试图破解它,我发现这是一件非常困难的事情——我已经设法从普通网页中抓取文本,但在没有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]>