Имя: Пароль:
1C
1С v8
Интеграция 1С и ИМ ABCP - как правильно получить ответ от ИМ?
0 slafor
 
12.09.22
10:31
Хотим настроить интеграцию 1С и Интернет-магазина на базе ABCP. Вроде бы все у них написано, какие строки отправлять, какие ответы должны приходить, и все с примерами. Но почти ничего не понятно... )

Вот пишу я строку в браузере, вида: h t t p s://id1****.public.api.abcp.ru/cp/orders?userlogin=api@id****8&userpsw=7385*******************f6fff1e6b&dateUpdatedStart=2013-08-02 ,
мне приходит ответ в окне: https://disk.yandex.ru/i/OaIyr9Ba8UBE3g . Это должен быть список заказов с определенной даты.

Пишу такой код, где пароль указан только в строке: https://disk.yandex.ru/i/nU34_fpIZyRkLw , или и в строке, и в параметрах объекта HTTPСоединение, или только в параметрах объекта, результаты (ФайлОтвета) получаются разные, либо такой: https://disk.yandex.ru/i/rUaUJ0saVLyAYw , либо такой: https://disk.yandex.ru/i/gZo95MnQ_MQCPA . Но ничего похожего на то, что получается по прямой ссылке в браузере.

Пробовал менять порт (443, 80), указывать и удалять параметр ЗащищенноеСоединениеOpenSSL - все одинаково не работает.

Код ответа всегда "400".

Подскажите, пожалуйста, что я делаю не так?

Да, и то, что я получаю в браузере (напомню, это здесь: https://disk.yandex.ru/i/OaIyr9Ba8UBE3g), это что? Это не json?
1 Kassern
 
12.09.22
10:38
(0) "это что? Это не json?" - это json
"Пишу такой код, где пароль указан только в строке" - не пишите такой код. В строке хттп соединения у вас должен быть лишь "id1****.public.api.abcp.ru", а вся остальная портянка в http запросе
2 Kassern
 
12.09.22
10:40
Так же у http соединения есть параметры, такие как логин и пароль. Можно попробовать через них аунтификацию сделать.
Так же нужно указать правильные заголовки у http запроса, чтобы получить корректный результат.
3 Kassern
 
12.09.22
10:41
Так же нужно скорее всего в УРЛ перекодировать ваш текст запроса, так как у вас там пробелы у даты. Проверьте в документации, в каком формате должна быть дата.
4 slafor
 
18.09.22
13:41
(1) Да, это json, и он отлично парсится у меня через FireFox: https://disk.yandex.ru/i/PamENfo5xKFJQA .
Причем неважно, пишу я http, или https - все равно все читается.

Но из 1С так сделать не получается. Хотя вроде бы код пишу правильно - единственное, что, заголовки пока не знаю, как правильно написать:

АдресЗапроса = "id*****.public.api.abcp.ru/cp/orders/?userlogin=api@id*****&userpsw=7385ee757dfc**********ff6fff1e6b";
АдресСайта = "id*****.public.api.abcp.ru";

ФайлОтвета = КаталогВременныхФайлов()+ "Orders.json";
    
HTTPСоединение = Новый HTTPСоединение(АдресСайта,443,"api@id*****","7385ee757dfc**********ff6fff1e6b",,,Новый ЗащищенноеСоединениеOpenSSL());    
    
Заголовки = Новый Соответствие();
// Передаем в заголовках размер и тип данных на отправку
Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    
запросPOST = Новый HTTPЗапрос(АдресЗапроса,Заголовки);
        
    Попытка
        Ответ = HTTPСоединение.ОтправитьДляОбработки(запросPOST,ФайлОтвета);            
    Исключение        
    Ответ = Неопределено;        
    КонецПопытки;
    
Возврат Ответ;

В итоге в файле ФайлОтвета получаю: "{"errorCode":3,"errorMessage":"Public API unknown operation"}".
А если пишу "АдресЗапроса = "/cp/orders", то получаю "{"errorCode":4,"errorMessage":"Недостаточно фактических параметров"}. А код состояния всегда один - "400".

Понимаю, что все очень просто - надо элементарно получить такой же файл ответа, какой получается при прямом вызове указанной строки HTTP запроса в любом браузере, но почему-то не получается.

(3) Текст запроса пишу теперь без даты, в браузере показывает все заказы, в 1С - ту же фигню, что и раньше.

(2) Логин и пароль вводил как в строке запроса, так и в параметрах HTTP-соединения, так и в обоих местах сразу - результат одинаковый! Пробовал и с портом 443, и с 80, и с ЗащищенноеСоединениеOpenSSL(), и без него - те же <...>. "вид сбоку". В общем, ничего не меняется и файл я не получаю. Самое главное, вообще непонятно, почему такой код состояния в ответе.
5 slafor
 
18.09.22
15:22
По-моему, разобрался: там надо использовать не POST, а GET.

Т.е. вместо строки
Ответ = HTTPСоединение.ОтправитьДляОбработки(запрос,ФайлОтвета);
надо писать строку
Ответ = HTTPСоединение.Получить(запрос,ФайлОтвета);