Вход | Регистрация


1С:Предприятие ::

Метки: 

HTTPСоединение + API

Я
   Затейник
 
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
может потому что пустой заголовок? может вообще ничего не передавать?
   arsik
 
2 - 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, такую длинную строку. А ее я получил из личного кабинета по логину и паролю, получается логин и пароль больше не нужны. Вот у меня наверное вопрос, как ее передать на сайт в коде программы этот самый пресловутый АПИ
   arsik
 
6 - 06.09.18 - 13:00
   Apokalipsec
 
7 - 06.09.18 - 13:16
Вы путаете понятие. API - это интерфейс. Вы ведете речь про ключ по которому вы авторизуетесь?
   Затейник
 
8 - 06.09.18 - 13:17
(7) да, про ключ
   Затейник
 
9 - 06.09.18 - 13:24
Соединение = Новый HTTPСоединение(АдресСервераОФД, , Пользователь ,Пароль,,,SSL );

Вот здесь передаю логин и пароль, ответ прилетает тот же...
Ключ АПИ вообще никуда не передаю.
   Apokalipsec
 
10 - 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=" + Страница, ЗаголовокЗапроса);
ОтветСервера = Соединение.Получить(ЗапросЗ);

И дальше уже работаем с ответом
 
 Рекламное место пустует
   Apokalipsec
 
11 - 06.09.18 - 13:37
То есть ключ вы передаете не в соединении, а в заголовке запроса.
   arsik
 
12 - 06.09.18 - 14:15
Вот же есть пример из мануалов
curl -H "Ofdapitoken: eyJpbm4iOlYtJTxMDAzMTQ3NSJdLCJ0ZXN0J

yHTydWV9.YDXh76CYn4YTgXRaqqHA_T6kN2C1GJ_Qxzm_jiZYNE4" https://api.ofdya.ru/ofdapi/v1/inn
-d '{ }'

В заголовок добавь
ЗаголовокЗапроса = Новый Соответствие;
    ЗаголовокЗапроса.Вставить("Ofdapitoken", "твой ключ");

   Затейник
 
13 - 06.09.18 - 14:18
(12) О другую дал ошибку, уже прогресс!!! я уже думал безнадега... сейчас покапаю дальше
   Затейник
 
14 - 06.09.18 - 14:20
{
  "code" : 0,
  "desc" : "unknown error"
}
   arsik
 
15 - 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
Думал может быть ошибка в параметрах, зашел на сайт, и руками вбил ДатаС, ДатаПо, и НомерФН, ответ прилетает корректный. Так почему при обращении кодом, он мне тоже самое не выдает ?
   arsik
 
20 - 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

yHTydWV9.YDXh76CYn4YTgXRaqqHA_T6kN2C1GJ_Qxzm_jiZYNE4" https://api.ofdya.ru/ofdapi/v1/KKTShift
-d '{ "fiscalDriveNumber": "0000000000000000",
"startDate" : "1970-01-01", "endDate" : "2017-07-01"} '


Параметр -d указывает что должно в пост запросе передаватся. Это json. Должно быть примерно.
Типа ЗапросHTTP.УстановитьТелоИзСтроки("{ "fiscalDriveNumber": "0000000000000000","startDate" : "1970-01-01", "endDate" : "2017-07-01"}");
   arsik
 
21 - 07.09.18 - 14:51
+ (20) Ну там с кавычками конечно нужно разобраться, это я так для примера скопипастил
   Затейник
 
22 - 07.09.18 - 14:54
На сайте есть как v1, так и v2
Сейчас попробую в теле передать.
   Затейник
 
23 - 07.09.18 - 15:04
(21) Да, работает.
   Fram
 
24 - 07.09.18 - 16:42
(23) ещё бы. Мануал это штука такая



Список тем форума
Рекламное место пустует Рекламное место пустует
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Э. Йодан
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует