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


1С:Предприятие :: 1С:Предприятие 8 общая

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

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 или кнопку "Обновить" в браузере.
Рекламное место пустует