2013-06-14 3 views
0

Я работаю с API, у которого нет документации, и я ударил камень преткновения. У меня есть функция:Python Request Post issue

def add_to_publicaster(self): 
    # function that is called in the background whenever a user signs the petition and opts in to the mailing list 
    # Makes an API call to publicaster <--- More documentation to follow ---> 
    username = app.config['PUBLICASTER_USERID'] 
    userPass = app.config['PUBLICASTER_PASS'] 
    headers = {'Authorization': {username:userPass}, "Content-type" : "application/json", "Accept":'text/plain'} 
    url = 'https://api7.publicaster.com/Rest/Subscribers.svc/1?format=json' 
    data = {"Item": { 
     "Email": "juli[email protected]" 
     } 
    } 
    r = requests.post(url, headers = headers, data = data) 

Это просто предполагают, чтобы сделать запрос POST с этим форматом:

POST https://api7.publicaster.com/Rest/Subscribers.svc/1?format=json HTTP/1.1 
Content-Type: application/json 
Authorization: <AccountID>:<Password> 
Host: api7.publicaster.com 
Content-Length: 64 
Expect: 100-continue 
Connection: Keep-Alive 
{ "Item" : { 
    "Email" : [email protected] 
} 
} 

код в функции, однако, не продуцирующие требуемый запрос. Любые советы были бы очень полезны.

+0

Что вы получаете? – thefourtheye

+0

Очень длинное сообщение об ошибке, в котором в основном говорится, что сервер обнаружил ошибку при обработке запроса. Решение, я думаю, должно соответствовать запросу «выборки» как можно ближе. – JulianGindi

+0

вам нужно json закодировать ваши данные .. 'json.dumps (dict (data = data))' – karthikr

ответ

0

Ваши заголовки и URL-адреса предполагают, что вы хотите опубликовать данные JSON. Кодируйте структуру питона в JSON с помощью библиотеки json:

import json 

# ... 

data = {"Item": { 
    "Email": "[email protected]" 
    } 
} 
r = requests.post(url, headers = headers, data = json.dumps(data)) 

JSON может выглядеть много, как Python, но это действительно ограниченная форма исходного кода JavaScript.

+0

К сожалению, я пробовал это раньше и все еще получаю сообщение об ошибке. Из-за недокументированного характера API мне просто нужно продолжать экспериментировать. – JulianGindi

+0

@JulianGindi: Что вы * попробовали, не будет работать * вообще *. Там могут быть проблемы с точной полезной нагрузкой, но если ваши заголовки заявляют, что вы отправляете данные 'application/json', то, по крайней мере, кодируйте данные как JSON. –

0

Вы неправильно выполняете аутентификацию. Ваша функция должна выглядеть так:

def add_to_publicaster(self): 
    # function that is called in the background whenever a user signs the petition and opts in to the mailing list 
    # Makes an API call to publicaster <--- More documentation to follow ---> 
    username = app.config['PUBLICASTER_USERID'] 
    userPass = app.config['PUBLICASTER_PASS'] 
    headers = {"Content-type" : "application/json", "Accept":'text/plain'} 
    url = 'https://api7.publicaster.com/Rest/Subscribers.svc/1?format=json' 
    data = {"Item": { 
     "Email": "[email protected]" 
     } 
    } 
    r = requests.post(url, auth=(username, userPass), headers=headers, data=json.dumps(data))