vbondarevsky / connector Goto Github PK
View Code? Open in Web Editor NEWКоннектор: удобный HTTP-клиент для 1С:Предприятие 8
License: Apache License 2.0
Коннектор: удобный HTTP-клиент для 1С:Предприятие 8
License: Apache License 2.0
Почему процедура "ЗаполнитьДополнительныеДанные" Экспортная?
При выполнении кода:
Сервер = "https://jsonplaceholder.typicode.com/";
Настройки = Новый Структура;
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type","application/json");
Настройки.Вставить("Заголовки", Заголовки);
//ПараметрыЗапроса = Новый Структура("username, password", "anonymous", "hrgesf7HDR67Bd");
ПараметрыЗапроса = "{""username"":""anonymous"",""password"":""anonymous""}";
НастройкиКопия = ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(Настройки));
Результат = КоннекторHTTP.Post(Сервер + "posts", ПараметрыЗапроса, НастройкиКопия);
Запись = Новый ЗаписьJSON();
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Настройки);
Дамп1 = Запись.Закрыть();
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, НастройкиКопия);
Дамп2 = Запись.Закрыть();
Видно, что настройки модифицируются. Это ведет к тому, что при последовательном использовании (например post и postjson) одной структуры с настройками возможны проблемы. Собственно, я их и получил, иначе сюда бы не писал.
Доброго времени суток! Хочу использовать библиотеку в разработке для зарубежных конфигураций, и русский язык там не очень подходит. Может есть какая-то инфа по англоязычным форкам, или планы на перевод кода?
Например, запрос на http://localhost/api/login
вернул заголовок
Set-Cookie
: login=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT
В этом случае нужно для cookie login установить путь /api
Метод по сути возвращает десериализованное тело ответа, а не структуру/соответствие.
При работе модуля из master ветки есть проблема с авторизацией.
Если работать с модулем из последнего релиза, то проблемы нет.
Чуть позже попробую скинуть детали и отладку.
Пробовали на версии до коммита включительно ed95515
В данный момент модуль является чисто серверным, планируется ли сделать клиент-серверный вариант?
Используем библиотеку на платформе 8.3.11.2867, режим совместимости "Версия 8.2.13". Обнаружили, что некорректно формируется подпись AWS в случае когда у запроса нет тела, например ListObjects
Причина - разное поведение функций ПолучитьТелоКак*() объекта HTTPЗапрос
В старших версиях платформы в случае, если тело запроса не было установлено, возвращает пустые ДвоичныеДанные, старые же версии платформы - Неопределено. Из-за разных типов рассчитывается разный sha-256 хеш тела запроса
КоннекторHTTP.КакТекст(ОтветСПустымТелом) возвращает Неопределено, а ожидается "" (пустая строка)
Скорей всего работать будет все кроме: ЧтениеZipФайла
При передачи параметра, содержащего закодированный урл с несколькими "вложенными параметрами" происходит некорректное декодирование.
Например урл: https://www.DOMEN.ru?URL_INNER=http%3A%2F%2Fwww.kuku.ru%2F%3Fs%3D1%26b%3D2&OTHER=1
Будет расценен как: https://www.DOMEN.ru?URL_INNER=http%3A%2F%2Fwww.kuku.ru%2F%3Fs%3D1&OTHER=1&b=2
Например, отправка XML
как текст или как файл
До выполнения метода Вычислить надо устанавливать безопасный режим всегда, иначе в кластере с включенными профилями безопасности будет выброшено исключение.
Описание проблемы:
Есть запрос к сайту с заголовком "contentType = 'application/json'", сайт делает редирект с кодом 308, но при попытке обратится по новому адресу появляется ошибка из-за того что заголовок contentType поменялся с 'application/json' на 'application/octet-stream'
Возможная причина и решение:
В функции ВызватьHTTPМетод если происходит редирект с кодом отличным от 307 и 308 то из куков удаляются заголовки "content-length,content-type,transfer-encoding" в противном случае по идее они должны остаться, но это не происходит, как решение добавил строку кода НовыйHTTPЗапрос.Заголовки = ПодготовленныйЗапрос.Заголовки;
До изменений:
Если Ответ.КодСостояния <> КодыСостоянияHTTP.ВременноеПеренаправление_307
И Ответ.КодСостояния <> КодыСостоянияHTTP.ПостоянноеПеренаправление_308 Тогда
УдалитьЗаголовки(ПодготовленныйЗапрос.Заголовки, "content-length,content-type,transfer-encoding");
НовыйHTTPЗапрос.Заголовки = ПодготовленныйЗапрос.Заголовки;
Иначе
ИсходныйПоток = ПодготовленныйЗапрос.HTTPЗапрос.ПолучитьТелоКакПоток();
ИсходныйПоток.КопироватьВ(НовыйHTTPЗапрос.ПолучитьТелоКакПоток());
КонецЕсли;
После:
Если Ответ.КодСостояния <> КодыСостоянияHTTP.ВременноеПеренаправление_307
И Ответ.КодСостояния <> КодыСостоянияHTTP.ПостоянноеПеренаправление_308 Тогда
УдалитьЗаголовки(ПодготовленныйЗапрос.Заголовки, "content-length,content-type,transfer-encoding");
НовыйHTTPЗапрос.Заголовки = ПодготовленныйЗапрос.Заголовки;
Иначе
ИсходныйПоток = ПодготовленныйЗапрос.HTTPЗапрос.ПолучитьТелоКакПоток();
ИсходныйПоток.КопироватьВ(НовыйHTTPЗапрос.ПолучитьТелоКакПоток());
НовыйHTTPЗапрос.Заголовки = ПодготовленныйЗапрос.Заголовки;
КонецЕсли;
Адрес прокси-сервера, используемый при тестировании, захардкожен, что затрудняет тестирование.
Вынести адрес прокси-сервера в параметры тестирования
Владимир, прежде всего преогромнейшее спасибо за чудесную библиотеку!
Воспроизведение ошибки:
В результате в ПодготовленныйЗапрос.HTTPЗапрос.АдресРесурса получим:
/query?date=2019-11-03T00:00:00.000000
Хотя ожидается:
/query?date=2019-11-03T00%3A00%3A00.000000
Где уши: метод КодироватьПараметрыЗапроса, строка:
ЗначениеПараметра = КодироватьСтроку(Значение, СпособКодированияСтроки.URLВКодировкеURL);
Исправление:
-ЗначениеПараметра = КодироватьСтроку(Значение, СпособКодированияСтроки.URLВКодировкеURL);
+ЗначениеПараметра = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL);
Спасибо за такую полезную библиотеку.
Предлагаю добавить новый метод КакXML, который по ответу возвращает XML с помощью ФабрикаXDTO
Нужно добавить проверку
Здравствуйте! Шикарная библиотека, я даже теперь не боюсь писать код для вызова разных API, поскольку стало супер просто ))
Вот мой мелкий кейс.
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /wp-json/wp/v2/settings
on this server.</p>
</body></html>
=> библиотека крашится в функции JsonВОбъект
на строчке Объект = ПрочитатьJSON(
, поскольку тело ответа - не json.
Я понимаю, что это не проблема библиотеки - ведь сайт вдруг вместо json начинает отдавать html :) Но м.б. обернуть Объект = ПрочитатьJSON
в Попытку/Исключение и вернуть, не знаю, какую-нибудь ошибку?
Например,
https://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?wsdl
В старых версиях (1.2.3) в структуре ответа был ключ "Ответ", содержащий встроенный объект 1С типа HTTPОтвет. Соответственно, я мог получить строковое тело ответа с как СтруктураОтвета.Ответ.ПолучитьТелоКакСтроку(); В актуальной версии это не работает так как ключа "Ответ" нет.
Прошу уточнить - это плановое изменение или регрессия. Если плановое, то как предполагается работать с текстовыми ответами?
При получении заголовков для подписи порт, отличный от стандартных 80 и 443, не добавляется к заголовку host, в результате чего получается некорректная подпись
RFC 2068 запрещает автоматический редирект для POST если получен код 301.
https://rfc2.ru/2068.rfc/53#p10.3.2
В GET преобразуют большинство браузеров. Думаю стоит привести поведение к RFC - возвращать просто 301 в этом случае
Возможно, опционально. В общем,
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("param", СтрРазделить("1,2", ","));
Ответ = КоннекторHTTP.GetJson("https://httpbin.org/anything/params", ПараметрыЗапроса);
должна быть возможность отправить не только https://httpbin.org/anything/params?param=1¶m=2
, но и https://httpbin.org/anything/params?param[]=1¶m[]=2
(важно для php, например)
Ошибка проверки типа в функции
Сравнивается значение с типом, а не тип значения с типом
Функция ОбъектЗащищенногоСоединения(ДополнительныеПараметры)
Если ДополнительныеПараметры.ПроверятьSSL = Ложь Тогда
СертификатыУЦ = Неопределено;
ИначеЕсли ТипЗнч(ДополнительныеПараметры.ПроверятьSSL) = Тип("СертификатыУдостоверяющихЦентровФайл") Тогда
СертификатыУЦ = ДополнительныеПараметры.ПроверятьSSL;
Иначе
СертификатыУЦ = Новый СертификатыУдостоверяющихЦентровОС;
КонецЕсли;
КлиентскийСертификат = Неопределено;
Если ДополнительныеПараметры.КлиентскийСертификатSSL = Тип("СертификатКлиентаФайл")
ИЛИ ДополнительныеПараметры.КлиентскийСертификатSSL = Тип("СертификатКлиентаWindows") Тогда
КлиентскийСертификат = ДополнительныеПараметры.КлиентскийСертификатSSL;
КонецЕсли;
Возврат Новый ЗащищенноеСоединениеOpenSSL(КлиентскийСертификат, СертификатыУЦ);
КонецФункции
должно быть:
Если ТипЗнч(ДополнительныеПараметры.КлиентскийСертификатSSL) = Тип("СертификатКлиентаФайл")
ИЛИ ТипЗнч(ДополнительныеПараметры.КлиентскийСертификатSSL) = Тип("СертификатКлиентаWindows") Тогда
КлиентскийСертификат = ДополнительныеПараметры.КлиентскийСертификатSSL;
КонецЕсли;
Коннектор принимает в качестве параметров в URL структуру или соответствие, которые не гарантируют порядок следования элементов. Возникают проблемы при взаимодействии с API, для которых порядок параметров в URL имеет значение.
Вопрос для рассмотрения.
Я воспользовался данной библиотекой для получения данных их JIRA.
С простыми праметрическими запросами проблем не возникло, но когда пришлось писать запросы с ипользованием jql, то возникли проблемы.
Дело в том, что могут использоваться запросы вида:
\search?jql=project=1200
\search?jql=worklogDate >= 2017-04-01 AND worklogDate <= 2017-05-01
Возникают две проблемы: Форматирование текста запроса и множественные знаки "=".
У Вас в функции РазобратьURL парсятся праметры по "=". В таком случае это приводит к ошибкам. Передача параметров через структуру помогает избежать проблемы, но не полностью, т.к. в процедуре ПодготовитьТелоЗапроса, при получении HTTPЗапрос.АдресРесурса, вызывается РазобратьURL еще раз для уже собранной строки. И она опять ломается.
Я для себя внес изменения:
АдресРесурса подготавливается сразу в функции ПодготовитьЗапрос через функцию ПодготовитьURL (точнее вместо нее).
Пришлось внести исключения в КодироватьПараметрыЗапроса для символов ">", " <" и других. Т.к. JIRA их использует в явном виде.
Методы запросов (Get, Post, ...) возвращают код состояния как число. Нужен удобный метод для получения описания состояния по коду, например
201 - "Created"
Портировали Коннектор на более старый режим совместимости - 8.3.11.2867, режим совместимости Версия 8.2.13.
Обнаружили, что некорректно формируется подпись AWS4 в случае когда запрос не содержит параметров (вида ?name=1&action=put)
Формируется неверный канонический запрос, канонические параметры запроса устанавливаются равными "=". Из за этого рассчитывается неверная подпись.
Пример правильного канонического запроса:
GET
/
host:chefstorage.s3.us-east-1.amazonaws.com
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-amz-date:20200214T181103Z
host;x-amz-content-sha256;x-amz-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Пример неправильного канонического запроса, формируемого Коннектором на старой платформе:
GET
/
=
host:chefstorage.s3.us-east-1.amazonaws.com
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-amz-date:20200214T181103Z
host;x-amz-content-sha256;x-amz-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Проблема в функции РазобратьURL(), РазобратьURL("http://localhost/")
на старых версиях платформы вернет структуру, ключ "Параметры" которой будет содержать массив с одной пустой строкой
В новых версиях платформы РазобратьURL("http://localhost/")
в "Параметры" возвращает пустой массив
В ЗаполнитьПараметрыЗапроса() когда Запрос равен пустой строке, СтрРазделить(Запрос, "&", Ложь)
на старых версиях платформы возвращает массив, содержащий одну пустую строку. Из-за такого поведения канонические параметры формируются неверно. В новых версиях платформы СтрРазделить("", "&", Ложь) возвращает пустой массив, там библиотека работает корректно
Существует проблема
Остутствует возможность загружать в базу расширение с модулем Коннектор, в дальнейшем оперативно проверять обновляения и при необходимости загружать свежую версию.
Хотелось бы иметь следующую функциональность
Собрать cfe с префиксом, для минимизации пересечений по имени модуля при использовании в соседних расширениях.
Сформировать описание пакета с сылками на проверки, для того чтобы при работе из 1С можно было получить общую информацию о состоянии пакета.
Дополнительный контекст
Развернуто мысль описал в http://forum.infostart.ru/forum9/topic249947/message2537570/
session=; path=/; expires=Sun, 17 Feb 2019 14:52:32 -0000; secure; HttpOnly
В данный момент чтобы запустить и проверить прохождение тестов, требуется действующий аккаунт ИТС. Это немного усложняет доработку библиотеки, у некоторых разработчиков (типа меня) аккаунта нет.
Возможно стоит сделать так, чтобы запуск и прохождение теста не зависели от наличия у тестирующего действующего аккаунта ИТС. httpbin вроде умеет работать с куками, его возможностей будет достаточно для того чтобы этот тест сделать?
В СоздатьСессию()
Сессия.Вставить("Cookies", Новый Соответствие);
Но в ПодготовитьЗапрос()
Cookies = ВыбратьЗначение(Неопределено, ДополнительныеПараметры, "Cookies", Новый Массив);
И в ДозаполнитьCookie(Cookies, URL)
Используется условие Если ТипЗнч(Cookies) = Тип("Массив") Тогда
Непонятно зачем использовать массив.
Текущая реализация библиотеки предназначена для серверного контекста. В некоторых случаях это неудобно, например:
-- при встраивании библиотеки во внешние обработки удобно было бы разместить ее в модуле формы
-- в случае клиент-серверного режима 1С Предприятия HTTP запрос будет делать сервер 1С Предприятия а не клиентская машина.
Я взял на себя смелость доработать библиотеку для работы в клиентском контексте. Прогресс есть, даже проходит часть тестов. Результатом работы будет две внешние обработки:
@vbondarevsky Владимир, требуется ли материнскому проекту эта доработка? Делать PR?
Не могу придумать реального случая, когда это может пригодиться, кроме отладки. В данный момент всегда берется текущая дата:
Варианты:
x-amz-date
или date
- использовать их значениеАутентификация = Новый Структура;
Аутентификация.Вставить("ДатаЗапроса", Дата(2020, 02, 01));
...
Привет, подскажи, есть ли возможность создать сессию пользователя имея ключ Api?
То есть авторизовав пользователя по ключу,
мы имеем Токен, который необходимо передавать в другие запросы....
Вопрос для обсуждения
При отправке любого запроса библиотека по-умолчанию шлет заголовок Accept-Encoding: gzip, т.е. всегда запрашивает у сервера сжатые данные. Имеет ли смысл делать такое действие по-умолчанию?
В текущей версии чтобы получить несжатые данные мне как пользователю библиотеки нужно предприниматься какие-то действия (какие?). Возможно, было бы удобно сделать так, чтобы по умолчанию этот заголовок не добавлялся. Возможно, сделать доп параметр, передача которого добавит заголовок при запросе:
Результат = КоннекторHTTP.PostJson("https://httpbin.org/post",, Новый Структура("СжиматьОтвет", Истина));
П.С. Как в текущей версии отключить запрос на сжатие?
Set-Cookie
: login=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0, login=test; expires=Tue, 26-Nov-2019 02:35:14 GMT
Сохранить в хранилище cookies нужно значение test
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.