Имя: Пароль:
1C
1С v8
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
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"
}
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
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"}");
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) ещё бы. Мануал это штука такая
Независимо от того, куда вы едете — это в гору и против ветра!