Добрый день. Есть задача соединить 1С 7.7 и сайт посредством API. Ранее API в 1С никогда не использовал. Воспользовался гуглом, нашел, как ни странно, не много информации, но все же. Накидал в 1С небольшую процедурку:
Процедура Сформировать()
ИмяФайлаBody = "d:\Temp\test.json";
ТочкаВхода="https://api.ifurni.net/api/";
oADOStream = СоздатьОбъект("ADODB.Stream");
oADOStream.Type = 1; //Binary
oADOStream.Open();
oADOStream.LoadFromFile(ИмяФайлаBody);
WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
//Отключаем проверку сертификата
Скрипт= СоздатьОбъект("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", "text/json");
WinHttp.setRequestHeader("Content-type", "text/json");
WinHttp.SetRequestHeader("Content-length", "" + oADOStream.Size);
WinHttp.SetRequestHeader("key", "MasterKey");
WinHttp.SetRequestHeader("action", "get_worker_list");
Попытка
WinHttp.Send(oADOStream);
СтрокаОтветаНаЗапрос = WinHttp.ResponseText();
тк=СоздатьОбъект("Текст");
тк.ДобавитьСтроку(СтрокаОтветаНаЗапрос);
тк.Записать("D:\temp\test_return.json");
Статус = СокрЛП(WinHttp.Status);
Описание = СокрЛП(WinHttp.StatusText);
Сообщить(СтрокаОтветаНаЗапрос);
Исключение
Сообщить("Ошибка: "+ОписаниеОшибки(),"!");
КонецПопытки;
КонецПроцедуры
{"status":"ok","error":"","data":{"client_1":{"phone":"+38 (097) 875-26-44","name":"???»N?N???N? 1","ifp_id":"125","code":null}}}
WinHttp.SetRequestHeader("Accept-Language", "ru");
WinHttp.SetRequestHeader("Accept-Charset", "utf-8");
WinHttp.SetRequestHeader("Content-Language", "ru");
WinHttp.SetRequestHeader("Content-Charset", "utf-8");
WinHttp.Option(2,"utf-8");
WinHttp.SetRequestHeader("Accept-Charset", "windows-1251");
WinHttp.SetRequestHeader("Content-Charset", "windows-1251");
WinHttp.Option(2,"windows-1251");
А тут нигде нету возможности указать кодировку?
тк=СоздатьОбъект("Текст");
тк.ДобавитьСтроку(СтрокаОтветаНаЗапрос);
тк.Записать("D:\temp\test_return.json");
Vofka @ Сегодня, 15:43
,
Указать кодировку для Объекта типа текст можно (ну и только, что попробовал на всякий случай), по Монитору четко видно, что сама функция WinHttp.ResponseText() возвращает уже в кракозябрах. Я так понимаю как то надо указать напрямую до запроса, но не могу понять как
А что-то из этого не работает?
WinHttp.setRequestHeader("Content-type", "text/json;Charset=ISO-8859-1");
WinHttp.setRequestHeader("Content-type", "text/json;Charset=UTF-8");
WinHttp.setRequestHeader("Content-type", "text/json;Charset=Windows-1251");
Makcim1981 @ Сегодня, 10:14
допишите
ИмяФайла = ("D:\temp\test_return.json");
Если ФС.СуществуетФайл(ИмяФайла)=1 Тогда
Текст = СоздатьОбъект("Текст");
Текст.КодоваяСтраница(0); // Win
Текст.Открыть(СокрЛ(ИмяФайла));
Если Текст.КоличествоСтрок()=0 Тогда
Предупреждение("В файле нет данных");
Иначе
НомерСтр = 1;
Пока НомерСтр<=Текст.КоличествоСтрок() Цикл
Состояние("Обрабатываю строку № "+НомерСтр);
ТекущаяСтрока = СокрЛП(Текст.ПолучитьСтроку(НомерСтр));
Если ПустаяСтрока(ТекущаяСтрока) =1 Тогда
НомерСтр = НомерСтр + 1;
Продолжить;
КонецЕсли;
НомерСтр = НомерСтр + 1;
КонецЦикла;
сообщить(ТекущаяСтрока);
сообщить(_ПреобразоватьСтрокуИзУТФ8(ТекущаяСтрока));
КонецЕсли;
КонецЕсли;
// Преобразовать строку из UTF-8
Функция _ПреобразоватьСтрокуИзУТФ8(Стр)
Длина=СтрДлина(Стр);
Итог="";
Для Н=1 По Длина Цикл
Знак=Сред(Стр,Н,1);
Код=КодСимв(Знак);
Если Код<128 Тогда
Итог=Итог+Знак;
ИначеЕсли (Код>=128)И(Код<192) Тогда
Иначе
Н=Н+1;
Знак2=Сред(Стр,Н,1);
Код2=КодСимв(Знак2);
Если Код=208 Тогда
Если Код2=129 Тогда Итог=Итог+"Ё";
Иначе Итог=Итог+Симв(КодСимв("А")+Код2-144);
КонецЕсли;
ИначеЕсли Код=209 Тогда
Если Код2=145 Тогда Итог=Итог+"ё";
Иначе Итог=Итог+Симв(КодСимв("р")+Код2-128);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Итог;
КонецФункции
popenko @ Сегодня, 11:52
,
Не помогло ... мне кажется, что проблема в самом объекте WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1") ... точнее в правильной передаче параметров в него.
уже на этом этапе возвращается СтрокаОтветаНаЗапрос = WinHttp.ResponseText(); строка с краказябрами которые нельзя конвертировать. То есть мне кажется, что в самом объекте уже перекодируется на нечитаемую фигню.
После примененного выше совета разница не велика )
{"status":"ok","error":"","data":{"client_1":{"phone":"+38 (097) 875-26-44","name":"???»N?N???N? 1","ifp_id":"125","code":null}}} - до
{"status":"ok","error":"","data":{"client_1":{"phone":"+38 (097) 875-26-44","name":"???N?N???N? 1","ifp_id":"125","code":null}}} - после
Просто убрало один символ функцией
Прийдется либо curl либо другой объект пробовать (((
попробовал по другому
httpRequest = СоздатьОбъект("MSXML2.xmlhttp");
httpRequest.open("POST", "https://api.ifur.net/api",0);
httpRequest.setRequestHeader("Content-Type", "text/xml");
httpRequest.setRequestHeader("key", "MasterKey");
httpRequest.setRequestHeader("action", "client_get");
httpRequest.send();
ОтветСервера = httpRequest.responseText;
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua