Версия для печати темы (https://pro1c.org.ua/index.php?s=d443ed8ee29ed042458e4511768f99b2&showtopic=33300)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ POST запрос API из 1с77

Автор: whtblck 17.11.16, 16:40

Добрый день.
Мало что понимаю в API, и с ним связанном.
Нужно из 1с77 отправить запрос по API методом POST.
Отправить нужно запрос в формате json сюда:
lc.epicentrk.com.ua/api/292/{секретный_ключ}/INVOICE_DATA

делаю:

    Если ЗагрузитьВнешнююКомпоненту("v7plus.dll") = 0 Тогда
        Сообщить("не удалось найти компоненту v7plus.dll", "!!!");
        Возврат;
    КонецЕсли;
    Попытка
        Соединение = СоздатьОбъект("Addin.V7HttpReader");
    Исключение
        Сообщить("Ошибка подключения! (" + ОписаниеОшибки() + ")", "!!!");
    КонецПопытки;

затем сам запрос:

    Попытка
        СтрокаСоединения = "lc.epicentrk.com.ua/api/292/"+СекретныйКлюч+"/INVOICE_DATA";
        ФайлJSON = "d:\1cv77bd\Temp\test.json";
        ФайлОтвет = "d:\1cv77bd\Temp\test_err.json";
        Соединение.УстановитьЗаголовокЗапроса("type",         "POST");
        Соединение.УстановитьЗаголовокЗапроса("data",         "objects");
        Соединение.УстановитьЗаголовокЗапроса("contentType", "application/json; charset=utf-8");
        Соединение.УстановитьЗаголовокЗапроса("dataType",     "json");
        
        Соединение.ОтправитьДляОбработки(СокрЛП(СтрокаСоединения), ФайлJSON ,1,ФайлОтвет,1);
    Исключение
        Сообщить("Ошибка: " + Соединение.СтрокаСостоянияОтвета);
    КонецПопытки

и получаю:
HTTP/1.1 500 Internal Server Error
в файле-ответе:
{"Message":"An error has occurred."}

 ! 

http://pro1c.org.ua/index.php?act=announce&id=2: 5,9
 

что я делаю не так?

Автор: Мичман Харитонов 17.11.16, 18:06

А протокол используется http или https?
Если второе, то у v7plus.dll с ним возможны проблемы...

Автор: logist 17.11.16, 19:20

Цитата(whtblck @ 17.11.16, 17:40) *
HTTP/1.1 500 Internal Server Error
в файле-ответе:
{"Message":"An error has occurred."}

Это говорит о том, что ошибка выполнения произошла на самом сервере, вероятно вы передаете ему что-то чего он не ждет, не тот формат данных, или не те данные.

Автор: whtblck 18.11.16, 0:06

Мичман Харитонов @ Вчера, 18:06 * ,
http

logist @ Вчера, 19:20 * ,
я уже знаю, что такое 500-я ошибка.
но онлайн отладчиком POST-запросов этот же запрос отрабатывает

Автор: nik389 18.11.16, 16:12

попробуйте curl, для ваших целей самое то..

Автор: Sharzem 18.11.16, 20:34

Цитата(Мичман Харитонов @ 17.11.16, 18:06) *
А протокол используется http или https?
Если второе, то у v7plus.dll с ним возможны проблемы...

Согласен на все 100 %, но проблемы будут во всех случаях. Не буду останавливаться конкретно на проблемах при работе с этой "штучкой", но основная это обрезка данных (на просторах валом инфы о проблемах).
Могу предложить такой вариант:
Функция ОтправитьЗапросПост(СекретныйКлюч,прИмяФайла)//Имя файла - "d:\1cv77bd\Temp\test.json"
    
    лпСайт="https://lc.epicentrk.com.ua/api/292/"+СекретныйКлюч+"/INVOICE_DATA";//"https" должно быть, я так считаю

    oADOStream = СоздатьОбъект("ADODB.Stream");
    oADOStream.Type = 1; //Binary
    oADOStream.Open();
    oADOStream.LoadFromFile(прИмяФайла);

    WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
        WinHttp.Option(2,"utf-8");
    //Отключаем проверку сертификата
    Скрипт= СоздатьОбъект("MSScriptControl.ScriptControl");
    Скрипт.language="javascript";
    Скрипт.AddObject("WinHttp",WinHttp);
    Скрипт.Eval("WinHttp.Option(4)=13056");//intSslErrorIgnoreFlags
    Скрипт.Eval("WinHttp.Option(6)=true");//blnEnableRedirects
    Скрипт.Eval("WinHttp.Option(12)=true");//blnEnableHttpsToHttpRedirects
    //Сам запрос
    WinHttp.Open("POST", лпСайт, 0);
    WinHttp.SetRequestHeader("Accept-Language", "ru");// думаю что "ru"...
    WinHttp.SetRequestHeader("Accept-Charset", "utf-8");
    WinHttp.SetRequestHeader("Content-Language", "ru");
    WinHttp.SetRequestHeader("Content-Charset", "utf-8");
    WinHttp.SetRequestHeader("Content-type", "application/octet-stream; charset=utf-8;");//Другая сторона должна понять входные данные см.oADOStream, а вот если вдруг не поймет (в чем у меня есть сомнения...), тогда придется указать явное без указания параметров выше:
    //WinHttp.setRequestHeader("Accept", "text/json");
    //WinHttp.setRequestHeader("Content-type", "text/json");
        //при явном строка ниже не нужна:
    WinHttp.SetRequestHeader("Content-length", "" + oADOStream.Size);
    
    Попытка
        WinHttp.Send(oADOStream);
                //При явном - строку запроса нужно получить из файла, тогда получится:
                // WinHttp.Send(строка запроса из файла);
                лпОтвет = WinHttp.ResponseText();
                Сообщить(лпОтвет)
        Возврат 1;
    Исключение
        Сообщить("Ошибка: "+ОписаниеОшибки(),"!");
        Возврат 0;
    КонецПопытки;
КонецФункции // ОтправитьЗапросПост



Цитата(nik389 @ 18.11.16, 16:12) *
попробуйте curl, для ваших целей самое то..

Поделитесь пожалуйста опытом его использования, для меня как-то сложно...). Я видимо чего-то не понял из описаний 19000000.gif
Как можно с помощью курл реализовать - приведите пример, конкретно к задаче этой темы ?

Автор: whtblck 20.11.16, 0:13

Sharzem @ 18.11.16, 20:34 * ,
попробую, с понедельника.
Выяснилась еще проблема на стороне сервера, жду ответа от них

Автор: nik389 20.11.16, 22:00

Sharzem @ 18.11.16, 20:34 * ,
в качестве примера (когда-то делал отправку смс):
отправка файла методом POST через curl:

для удобства создаем файл с параметрами param.ini:
url = "sms-fly.com/api/api.php"
user = "380672223344:password"
header = "Content-Type: text/xml", "Accept: text/xml""
-d @send.xml //файл для отправки
-o Log\log.txt //сюда пишем ответ сервера

стартуем:
curl.exe -K param.ini

Автор: Sharzem 21.11.16, 0:54

nik389 @ Сегодня, 22:00 * ,
Прикольно, спасибо.

Для такого обмена с помощью json в UTF-8, файлик скорее всего нужно будет писать без BOM.

В моем примере входной файл уже без BOM.
Я сначала формирую файл с помощью FSO в 1251, а потом во время конвертации задаю ему параметр: oADOStream.Position=3; просто в примере этот момент упущен.
ЗЫ: UTF-8 без BOM это кодировка CESU-8. О, так вернее 31000000.gif

Автор: whtblck 25.11.16, 15:53

Господа, всем спасибо, заработало

Автор: Vofka 25.11.16, 16:16

whtblck, а с чем была связана проблема (почему не работало)?

Автор: whtblck 28.11.16, 22:52

whtblck @ 25.11.16, 15:53 * ,
Проблема была связана с непониманием "физики процесса". Я в самом начале сказал "Мало что понимаю в API, и с ним связанном".
И не говорил, что оно не работает smile.gif
Помогла вот эта ветка:
http://pro1c.org.ua/redirect.php?http://forum.infostart.ru/forum9/topic161772/

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua