2014-12-04 2 views
1

저는 ClearBooks 용 API와 상호 작용하는 프로그램을 작성해야합니다. 그들은 약간 documentation을 가지고 있습니다. 그러나 저는 여전히 시작하기 위해 정말로 고심 중입니다.API와의 상호 작용을 위해 애 쓰고 있습니다.

  1. 포스트에 'XML 요청' "https://secure.clearbooks.co.uk/api/soap/는"
  2. 은 '요청 HTTP 헤더를 설정하려면 : 나는 겉으로는 신화를 수신하기 위해 "응답 (200)"에서, ​​문서에서 수집 할 수있는 건, 내가 필요 '에 "콘텐츠 유형 : 텍스트/XML"
  3. 이 포함'(I 로컬 있습니다) 내 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> 
,536,

나는 내 코드가 아마도 어리석은 것처럼 보인다고 알고있다. 그러나 인터넷과 상호 작용하는 프로그램을 작성하려고 시도한 것은 이번이 처음이다. 해킹하려고 며칠을 보냈음에도 불구하고, 나는 정말 어려움을 겪었습니다. 일반 웹 페이지에서 텍스트를 가져 왔지만 Codecademy 또는 이와 유사한 API가없는 API와 상호 작용할 수 없었습니다. 누군가 제 코드를 업데이트 할 수 있습니까 (아니면 처음부터 새로 추가 할 수 있습니까?) 나 자신의 Clearbooks API 키없이 테스트 할 수있는 것이 아니라는 것을 깨달았습니다.하지만 도움이 될 것입니다.

답변

2

코드가 바보가 아닙니다.

하지만 현재 HTTP 'GET'요청을하고 있습니다. 이것은 웹 브라우저에 URL을 입력하고 Enter 키를 누르는 것과 같습니다.

첫 번째 지시 사항은 "XML 요청을 SOAP 서버 URL에 게시"하는 것입니다. 'POST'요청을하면 웹 페이지에서 양식을 제출할 때와 같습니다. 다른 말로하면, 당신은 단지 url을 요구하지 않고, 당신은 url에 어떤 데이터를 보냅니다.

이 경우 XML 문서 인 유효한 SOAP 메시지를 준비하고 SOAP 서버 URL에 POST해야합니다.

는 여기를 참조하십시오 : http://docs.python-requests.org/en/latest/user/quickstart/#more-complicated-post-requests 우리가 폼 인코딩 된 데이터를 게시하지 않습니다이 경우

, 우리는 (위의 URL에서 두 번째 예제 참조) 문자열로 XML을 보낼

그것은 할 전적으로 가능 올바른 메시지를 문자열로 입력하여 수동으로 수정하십시오. 그러나 적어도 lxml과 같은 XML 라이브러리를 사용하거나 suds과 같은 전용 SOAP 라이브러리를 사용하는 것이 더 쉽습니다.

"SOAP 헤더"는 XML 메시지의 일부이며 HTTP 헤더와 동일하지 않습니다. http://www.w3schools.com/webservices/ws_soap_header.asp

당신은 제대로하지만, 잘 :) 수행

+0

내가 충분히 감사 할 수는 API가 머리를 켜고 말 한 Content-Type: text/xml HTTP 헤더를 보낸! : D 나는 XML을 어떻게 조합할지는 모르지만 운 좋게 [이 예제] (http://msgboard.alphasoftware.com/alphaforum/archive/index.php?t-100518.html)를 발견했다. 누군가가 관심을 가지기 때문에 내 코드를 대답으로 게시 할 것입니다. –

+0

축하합니다! 이 API와의 많은 상호 작용이 필요한 경우 [suds] (https://fedorahosted.org/suds/) ... [API wsdl의 URI] (https : //secure.clearbooks.co.uk/api/wsdl/https://secure.clearbooks.co.uk/api/wsdl /) 그리고 당신은'client.service.CreatePayment (...) '와 같이 사용할 수있는 python 클라이언트를 만듭니다 ... 유효한 SOAP 메시지를 공식화하기 위해 많은 지저분하고 부서지기 쉬운 문자열 템플릿을 저장합니다 – Anentropic

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]> 
+0

500 오류가 발생했습니다. 이것과 매우 비슷합니다. claerbooks 연락. –

관련 문제