2

Пытаюсь сделать запрос на авторизацию в систему Papirus.net по этой инструкции. Но все попытки приводят к неудаче, а именно - 400 Bad Request.

Код следующий:

import httplib, json

params = json.dumps({"ClientID": "myid",
                     "Login": "[email protected]",
                     "Password": "mypwd"})

headers = {'Content-Type': 'application/json; charset=utf-8\r\n',
           'Content-Length': 123}
url = 'https://papirus.net/restapi/accesstoken'
conn = httplib.HTTPSConnection('papirus.net', 443)
conn.request('POST', url='/restapi/accesstoken', body=params, headers=headers)
response = conn.getresponse()
print response.status, response.reason
data = response.read()
print data
conn.close()

Ну соответственно clientid, login и password указал иные.

После запуска - ошибка:

400 Bad Request
{"ApiException":{"Code":"Unspecified","Message":"A connection error occurred. Please try again later."}}

Данные заголовки мне посоветовали сделать в поддержке Papirus'а. Больше подсказать ничего не могут!

6
  • 2
    Зачем вы Content-Length руками пишете? Если там расхождение хотя бы в один символ, то запрос будет обрезан.
    – etki
    15 апр 2014 в 11:21
  • Запрос, кстати забыл указать, идет такой: {"Login": "[email protected]", "Password": "mypwd", "ClientID": "myid"} Ну вообще мне этот заголовок посоветовали в поддержке Papirus'а... Хорошо, убрал его. Теперь ошибка та же, но с другим пояснением: 400 Bad Request {"ApiException":{"Code":"BadFormat","Message":"There was an error deserializing the object of type Papirus.PublicApi.Requests.AccessTokenParams. Unexpected end of file. Following elements are not closed: ClientID, root."}}
    – fixatorika
    15 апр 2014 в 12:21
  • 1
    @fixatorika, Насколько я понимаю, их парсер json не получает последние символы. а) попробуйте все-таки послать Content-Length, но со значением len(params) б) если и так не выйдет, сделайте простенький сервер на локалхосте (или еще где, неважно), который будет отлавливать запрос и писать его в чистом виде (заголовки + тело) в файл, возможно, сам запрос почему-то режется. в) наиболее идиотское решение проблемы - допишите в конец params несколько пробелов, возможно, это решит проблемы с длиной.
    – etki
    15 апр 2014 в 14:16
  • Смастерил простой серверок, который принял такой вот запрос POST /restapi/accesstoken HTTP/1.1 Host: Accept-Encoding: identity Content-Length: 121 Content-Type: application/json; charset=utf-8 {"Login": "[email protected]", "Password": "mypwd", "ClientID": "myid"} К сожалению выставление Content-Length со значением len(params) не помогло. И пробелы в конце params тоже.
    – fixatorika
    15 апр 2014 в 15:41
  • 1
    @fixatorika, я написал ответ, там вообще не на стороне клиента ошибки. Content-Length, кстати, должен нормально обсчитываться сам, не берусь утверждать, но о нем наверняка можно вообще в будущем не думать.
    – etki
    15 апр 2014 в 15:50

2 ответа 2

2

Если еще будете общаться с техподдержкой, шлите им лучи ненависти:

Request Body  
{  
    "ClientId": "1234abcd-1234-abcd-1234-abcd1234abcd",  
    "Login": "[email protected]",  
    "Password": "******"  
}

Этот пример означает, что их парсер не понимает json простой строкой. Им обязательно нужен символ новой строки с одной из фигурных скобок (я так и не разобрался, с какой, но это неважно). На питоне это решается простым параметром json.dumps:

params = json.dumps({"ClientID": "myid",
                     "Login": "[email protected]",
                     "Password": "mypwd"}, indent=4)
print params

(вывод)

fike@aves:~/Temp/python/shorts$ python papirus.py 
{
    "Login": "[email protected]", 
    "Password": "mypwd", 
    "ClientID": "myid"
}
401 Unauthorized
{"ApiException":{"Code":"AuthorizationErrorInvalidLoginOrPassword","Message":"Invalid user name (email) \/ password"}}

Ненависть / смешная третья опция

2
  • А вот тут начинается самое интересное!) При запросе с такими параметрами "myid","[email protected]", "mypwd", indent=4 действительно выходит такая ошибка 401 Unauthorized НО! При верных параметрах: params = json.dumps({"ClientID": "********--************", "Login": "************@*****.**********.ru", "Password": "********"}, indent=4) headers = {'Content-Type': 'application/json; charset=utf-8'} прежняя ошибка 400 Bad Request "A connection error occurred. Please try again later." Вот так, и в чем подвох...
    – fixatorika
    15 апр 2014 в 16:13
  • @fixatorika, вот это уже вряд ли кто-то кроме поддержки сможет пояснить. Судя по тексту ошибки (если это все, что он выдает), проблема может быть опять на их стороне. Возможно, заголовки почему-то не нравятся, но у них в доке ни слова про это. Кстати, информацию о запросе можно увидеть, вызвав conn.set_debuglevel(1), после этого информация о запросе будет выводиться в stdout.
    – etki
    15 апр 2014 в 16:22
0

@Fike, действительно, проблема была со стороны сервиса. Как выяснилось в запросе нужно было указывать параметр ClientId, а не ClientID. В любом случае, спасибо за помощь! Пример полностью рабочий)

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.