|
HTTPСоединение + API | ☑ | ||
---|---|---|---|---|
0
Затейник
06.09.18
✎
12:51
|
Основная задача, из 1с, подключиться к сайту ОФД, HTTP соединением и забрать оттуда данные.
Если делать все руками, то все работает, мы заходим на адрес сервера ОФД, вводим в специальное окно полученный ранее API и запускаем сервисы "/ofdapi/v1/inn" например и получаем список инн. Теперь надо это сделать кодом. И сразу первый вопрос, каким образом передать мой ранее полученный API. Допустим передадим его в имя пользователя. SSL = Новый ЗащищенноеСоединениеOpenSSL(); Соединение = Новый HTTPСоединение(АдресСервераОФД, , РанееПолученныйАПИ,,,,SSL ); //Заголовок передаем пустой, потому что для этого метода на сайте ОФД он не задан, ЗаголовкиHTTP = Новый Соответствие; ЗаголовкиHTTP.Вставить("",""); ЗапросHTTP = Новый HTTPЗапрос("/ofdapi/v1/inn", ЗаголовкиHTTP); ОтветОтСервера = Соединение.ОтправитьДляОбработки(ЗапросHTTP,); СтрокаОтчетаСервера = ОтветОтСервера.ПолучитьТелоКакСтроку(); В строке прилетает ответ : { "error" : "null cannot be cast to non-null type kotlin.Long", "code" : 500, "status" : "Internal Server Error" } Не могу понять в чем ошибка, то ли не прошла авторизация по АПИ. Может его нужно передавать в заголовок HTTP запроса. Или еще как-то. Не работал с такими сервисами. Работающий пример очень бы помог. |
|||
1
Вафель
06.09.18
✎
12:53
|
может потому что пустой заголовок? может вообще ничего не передавать?
|
|||
2
arsik
гуру
06.09.18
✎
12:54
|
Посмотри в хроме в режиме разработчика как с сайтом общается он.
|
|||
3
Сергиус
06.09.18
✎
12:57
|
(0)Так наверно когда на сайте заходите, там надо логин/пароль вводить, вот их и надо как то передавать. В (2) верный совет.
|
|||
4
Затейник
06.09.18
✎
12:57
|
ЗапросHTTP = Новый HTTPЗапрос("/ofdapi/v1/inn");
Убрал заголовок вообще, ответ тож же. (2) Можно чуть подробнее как это сделать ? |
|||
5
Затейник
06.09.18
✎
12:59
|
(3) Я когда захожу на сайт, то в специальное поле ввожу API, такую длинную строку. А ее я получил из личного кабинета по логину и паролю, получается логин и пароль больше не нужны. Вот у меня наверное вопрос, как ее передать на сайт в коде программы этот самый пресловутый АПИ
|
|||
6
arsik
гуру
06.09.18
✎
13:00
|
||||
7
Apokalipsec
06.09.18
✎
13:16
|
Вы путаете понятие. API - это интерфейс. Вы ведете речь про ключ по которому вы авторизуетесь?
|
|||
8
Затейник
06.09.18
✎
13:17
|
(7) да, про ключ
|
|||
9
Затейник
06.09.18
✎
13:24
|
Соединение = Новый HTTPСоединение(АдресСервераОФД, , Пользователь ,Пароль,,,SSL );
Вот здесь передаю логин и пароль, ответ прилетает тот же... Ключ АПИ вообще никуда не передаю. |
|||
10
Apokalipsec
06.09.18
✎
13:29
|
(8) Ну тогда на пальцах:
1. Устанавливаете соединение с сервером: ssl1 = Новый ЗащищенноеСоединениеOpenSSL(); Соединение = Новый HTTPСоединение(АдресСервера, , , , , 10, ssl1); Возврат Соединение; 2. Сгенерировать Заголовок: Строка64 = ПолучитьBase64СтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки(КлючАпи + ":X")); ЗаголовокЗапроса = Новый Соответствие; ЗаголовокЗапроса.Вставить("Authorization", "Basic " + Строка64); ЗаголовокЗапроса.Вставить("Content-Type", "application/json"); Где ключАпи - ваш ключ. 3. Формируем само обращение: ЗапросЗ = Новый HTTPЗапрос("api/v2/contacts?per_page=100&page=" + Страница, ЗаголовокЗапроса); ОтветСервера = Соединение.Получить(ЗапросЗ); И дальше уже работаем с ответом |
|||
11
Apokalipsec
06.09.18
✎
13:37
|
То есть ключ вы передаете не в соединении, а в заголовке запроса.
|
|||
12
arsik
гуру
06.09.18
✎
14:15
|
Вот же есть пример из мануалов
curl -H "Ofdapitoken: eyJpbm4iOlYtJTxMDAzMTQ3NSJdLCJ0ZXN0J
В заголовок добавь ЗаголовокЗапроса = Новый Соответствие;
|
|||
13
Затейник
06.09.18
✎
14:18
|
(12) О другую дал ошибку, уже прогресс!!! я уже думал безнадега... сейчас покапаю дальше
|
|||
14
Затейник
06.09.18
✎
14:20
|
{
"code" : 0, "desc" : "unknown error" } |
|||
15
arsik
гуру
06.09.18
✎
14:26
|
(13) Сделай еще вот это
HTTPЗапрос.УстановитьТелоИзСтроки("{ }"); |
|||
16
Затейник
06.09.18
✎
14:29
|
Алилуя!!! (15) Большое спасибо. Данные пошли.
|
|||
17
Затейник
06.09.18
✎
14:36
|
SSL = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(АдресСервераОФД, , ,,,,SSL ); ЗаголовкиHTTP = Новый Соответствие; ЗаголовкиHTTP.Вставить("Ofdapitoken", КлючАПИ); ЗапросHTTP = Новый HTTPЗапрос(РесурсСервера, ЗаголовкиHTTP); ЗапросHTTP.УстановитьТелоИзСтроки("{ }"); ОтветОтСервера = Соединение.ОтправитьДляОбработки(ЗапросHTTP,); // ОтветОтСервера.ПолучитьТелоКакСтроку() |
|||
18
Затейник
07.09.18
✎
13:45
|
И так в продолжении разговора, не могу победить еще одну ошибку.
Ошибка: { "code" : 1, "desc" : "Error: bad input" } SSL = Новый ЗащищенноеСоединениеOpenSSL(); Соединение = Новый HTTPСоединение("api.ofd-ya.ru", ,,,30,SSL ); ЗаголовкиHTTP = Новый Соответствие; ЗаголовкиHTTP.Вставить("Ofdapitoken", КлючАПИ); ЗаголовкиHTTP.Вставить("fiscalDriveNumber", НомерФН); ЗаголовкиHTTP.Вставить("startDate", "2018-09-01"); ЗаголовкиHTTP.Вставить("endDate", "2018-09-07"); ЗапросHTTP = Новый HTTPЗапрос("/ofdapi/v2/KKTShift", ЗаголовкиHTTP); ЗапросHTTP.УстановитьТелоИзСтроки("{ }"); ОтветОтСервера = Соединение.ОтправитьДляОбработки(ЗапросHTTP,).ПолучитьТелоКакСтроку(); Код рабочий, на другой ресурс данные идут, но там другие заголовки, или только ключ АПИ, либо еще добавилась дата. А вот на ресурс "/ofdapi/v2/KKTShift" появился еще параметр номер ФН, который я передаю строкой, пробывал и числом, но все равно прилетает ответ ошибка в запросе. Буду рад любой свежей идее. |
|||
19
Затейник
07.09.18
✎
14:40
|
Думал может быть ошибка в параметрах, зашел на сайт, и руками вбил ДатаС, ДатаПо, и НомерФН, ответ прилетает корректный. Так почему при обращении кодом, он мне тоже самое не выдает ?
|
|||
20
arsik
гуру
07.09.18
✎
14:50
|
(19) Скинь ссылку на мануал. Согласно мануала (https://ofd-ya.ru/docs/API_OFD_YA.pdf) нету "/ofdapi/v2/KKTShift", есть "/ofdapi/v1/KKTShift"
Тебе fiscalDriveNumber, startDate, endDate не в заголовке нужно передавать, а в теле. Смотри пример curl. curl -H "Ofdapitoken: eyJpbm4iOlYtJTxMDAzMTQ3NSJdLCJ0ZXN0J
Параметр -d указывает что должно в пост запросе передаватся. Это json. Должно быть примерно. Типа ЗапросHTTP.УстановитьТелоИзСтроки("{ "fiscalDriveNumber": "0000000000000000","startDate" : "1970-01-01", "endDate" : "2017-07-01"}"); |
|||
21
arsik
гуру
07.09.18
✎
14:51
|
+ (20) Ну там с кавычками конечно нужно разобраться, это я так для примера скопипастил
|
|||
22
Затейник
07.09.18
✎
14:54
|
На сайте есть как v1, так и v2
Сейчас попробую в теле передать. |
|||
23
Затейник
07.09.18
✎
15:04
|
(21) Да, работает.
|
|||
24
Fram
07.09.18
✎
16:42
|
(23) ещё бы. Мануал это штука такая
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |