2013-09-12 3 views
1

Я пытаюсь подключиться к FreshBooks API с использованием модуля python и httplib. Мне удалось выполнить эту работу с пакетом Requests, но поскольку я стартер и хочу учиться, я бы также хотел, чтобы он работал, используя стандартную библиотеку Python.Не удается получить успешный ответ с помощью httplib в Python

Так что это код, использующий HTTPLIB:

import base64, httplib 

# test script created to connect with my test Freshbooks account 

headers = {} 
body = '/api/2.1/xml-in' 
headers["Authorization"] = "Basic {0}".format(
    base64.b64encode("{0}:{1}".format('I have put here my Auth Token', 'user'))) 
headers["Content-type"] = "application/xml" 

# the XML we ll send to Freshbooks 
XML = """<?xml version="1.0" encoding="utf-8"?> 
<request method="task.list"> 
    <page>1</page> 
    <per_page>15</per_page> 
</request>""" 


# Enable the job 
conn = httplib.HTTPSConnection('devjam-billing.freshbooks.com') 
conn.request('POST', body, None, headers) 
resp = conn.getresponse() 
print resp.status 
conn.send(XML) 

print resp.read() 
conn.close() 

И это то, что возвращает Freshbooks:

200                                                                    
<?xml version="1.0" encoding="utf-8"?>                                                            
<response xmlns="http://www.freshbooks.com/api/" status="fail">                                                     
    <error>Your XML is not formatted correctly.</error>                                                        
    <code>40010</code>                                                                
</response 

На мой второй сценарий, где я использовал пакеты, которые я имел тот же самый ответ, который я установил добавление заголовков в post():

import requests 

XML = """<?xml version="1.0" encoding="utf-8"?> 
<request method="task.list"> 
    <page>1</page> 
    <per_page>15</per_page> 
</request>""" 
headers = {'Content-Type': 'application/xml'} # set what your server accepts 
r = requests.post('https://devjam-billing.freshbooks.com/api/2.1/xml-in', auth=  ('my auth token', 'user'), data=XML, headers=headers) 

print r.status_code 
print r.headers['content-type'] 
# get the response 
print r.text 

Я пробовал на первом сделать что-то подобное, добавив:

headers["Content-type"] = "application/xml" 

без успеха.

Любые идеи? Кроме того, b64encode является безопасным вариантом безопасности для кодирования или есть более безопасный способ сделать это? Благодарю.

ответ

1

вам действительно нужно отправить данные POST (XML-строка) в запросе, так, замените это:

conn.request('POST', body, None, headers) 
resp = conn.getresponse() 
print resp.status 
conn.send(XML) 
print resp.read() 

с этим:

conn.request('POST', body, XML, headers) 
resp = conn.getresponse() 
print resp.status 
print resp.read() 

Надеюсь, это поможет!

0

Возможно, вы отправляете данные в неподходящее время. Посмотрите с docs (внимание мое).

HTTPConnection.send (данные)

Отправка данных на сервер. Это должно использоваться непосредственно только после вызван метод endheaders() и до вызывается getresponse().

В вашем случае:

conn.endheaders() 
conn.send(XML) 
resp = conn.getresponse()