Нативное http-соединение vs MSXML2.XMLHTTP
Доброго дня, коллеги.
Не буду мусолить, перейду сразу к примерам.
Есть такой вот нерабочий код:
Возвращает код статуса 400, типо "бэд риквест".
Но почему-то тоже самое через MSXML2.XMLHTTP работает:
Не подскажете, в где собака зарыта? Разве это не тоже самое?
ЗЫ: Платформа 8.3.17, режим совместимости 8.2
ЗЫЫ: До сего момента все запросы через нативное http-соединение работали.
Не буду мусолить, перейду сразу к примерам.
Есть такой вот нерабочий код:
HTTPСоединение = Новый HTTPСоединение("service.autopiter.ru");
HTTPЗаголовки = Новый Соответствие;
ТелоЗапроса = "<?xml version=""1.0"" encoding=""utf-8""?> <soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""> <soap:Body> <GetPriceId xmlns=""http://www.autopiter.ru/""> <ArticleId>"+ArticleId+" </ArticleId> <Currency>РУБ</Currency> <SearchCross>1</SearchCross> </GetPriceId> </soap:Body> </soap:Envelope>";
HTTPЗаголовки.Вставить("Content-Type", "text/xml; charset=utf-8");
HTTPЗаголовки.Вставить("Content-Length", СтрДлина(ТелоЗапроса));
HTTPЗаголовки.Вставить("SOAPAction", "http://www.autopiter.ru/GetPriceId");
HTTPЗапрос = Новый HTTPЗапрос("/v2/price", HTTPЗаголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса, , ИспользованиеByteOrderMark.НеИспользовать);
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
ПоказатьВозвращает код статуса 400, типо "бэд риквест".
Но почему-то тоже самое через MSXML2.XMLHTTP работает:
MSXML3 = Новый COMОбъект("MSXML2.XMLHTTP");
MSXML3.open("POST", "http://service.autopiter.ru/v2/price", 0);
MSXML3.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
MSXML3.setRequestHeader("Content-Length", СтрДлина(ТелоЗапроса));
MSXML3.setRequestHeader("SOAPAction", "http://www.autopiter.ru/GetPriceId");
MSXML3.send(ТелоЗапроса);
Не подскажете, в где собака зарыта? Разве это не тоже самое?
ЗЫ: Платформа 8.3.17, режим совместимости 8.2
ЗЫЫ: До сего момента все запросы через нативное http-соединение работали.
Найденные решения
(18) Установил "фидлер". Разница в запросах в заголовке "Cookie".
Прикол в том, что формат куки такой:
AuthCoocies=0102890788DDB95FD808FE89B7F04A4878D8080103000000 12F00FF; expires=Sat, 24-Oct-2020 18:11:56 GMT; path=/; HttpOnly; SameSite=Lax,
AuthCoocies=0102896A8ADDB95FD808FE891AF34A487801063300320030 0037003900340000012F00FF; expires=Sat, 24-Oct-2020 18:11:56 GMT; path=/; HttpOnly; SameSite=Lax
Так вот если я передаю все - ошибка.
Если передаю первый - тоже ошибка.
А если беру последний - все оК.
Это прикол такой?!
Прикол в том, что формат куки такой:
AuthCoocies=0102890788DDB95FD808FE89B7F04A4878D8080103000000
AuthCoocies=0102896A8ADDB95FD808FE891AF34A487801063300320030
Так вот если я передаю все - ошибка.
Если передаю первый - тоже ошибка.
А если беру последний - все оК.
Это прикол такой?!
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(5) Потому что через WSОпределение такая же ошибка как и через HTTPСоединение.
Снова ошибка, мол, заблокирован, хотя через MSXML2.XMLHTTP приходит верный ответ.
ЗЫ:http://service.autopiter.ru/v2/price?op=GetPriceId
Попытка
СсылкаНаВебСервис = "http://service.autopiter.ru/v2/price?WSDL";
ОпределениеСсылки = Новый WSОпределения(СсылкаНаВебСервис);
URIПространстваИмен = ОпределениеСсылки.Сервисы[0].URIПространстваИмен;
WSПрокси = Новый WSПрокси(ОпределениеСсылки, URIПространстваИмен, "NewPrice", "NewPriceSoap");
Исключение
WSПрокси = Неопределено;
КонецПопытки;
Результат = WSПрокси.GetPriceId(ArticleId, "", "РУБ", "1", "0", "0");
ПоказатьСнова ошибка, мол, заблокирован, хотя через MSXML2.XMLHTTP приходит верный ответ.
ЗЫ:
(10) Ну так попробуй его приготовь!
Ни одна описанная операция этого г**осервиса не работает (или 1с до сих пор не умеет работать с soap, передавая какую-то дополнительную хрень).
Возмём другую операцию - FindCatalog (<wsdl:operation name="FindCatalog">,doc )
Указан всего один параметр типа строка (<s:element minOccurs="0" maxOccurs="1" name="Number" type="s:string"/>).
Делаю вызов:
И снова получаю сообщение, что я забанен на сутки, хотя через MSXML2.XMLHTTP все работает.
ЗЫ: не тому адресовывал, речь про WS.
Ни одна описанная операция этого г**осервиса не работает (или 1с до сих пор не умеет работать с soap, передавая какую-то дополнительную хрень).
Возмём другую операцию - FindCatalog (<wsdl:operation name="FindCatalog">,
Указан всего один параметр типа строка (<s:element minOccurs="0" maxOccurs="1" name="Number" type="s:string"/>).
Делаю вызов:
Результат = WSПрокси.FindCatalog(Article);
И снова получаю сообщение, что я забанен на сутки, хотя через MSXML2.XMLHTTP все работает.
ЗЫ: не тому адресовывал, речь про WS.
СсылкаНаВебСервис = "http://service.autopiter.ru/v2/price?WSDL";
ОпределениеСсылки = Новый WSОпределения(СсылкаНаВебСервис);
URIПространстваИмен = ОпределениеСсылки.Сервисы[0].URIПространстваИмен;
Прокси = Новый WSПрокси(ОпределениеСсылки, URIПространстваИмен, "NewPrice", "NewPriceSoap12");
Результат = Прокси.Authorization(Логин, Пароль, Истина);
Показать
(11)
С soap у 1С могут быть проблемы. Он его не в полном объеме поддерживает. Во всяком случае раньше было не в полном. С простыми сервисами проблем обычно не было, а вот со сложными или хитрыми - были.
Но если у тебя через MSXML2.XMLHTTP все работает, то стопудово можно приготовить и через HTTPСоединение.
Просто поставь Fiddler и найди 20 отличий.
или 1с до сих пор не умеет работать с soap, передавая какую-то дополнительную хрень
С soap у 1С могут быть проблемы. Он его не в полном объеме поддерживает. Во всяком случае раньше было не в полном. С простыми сервисами проблем обычно не было, а вот со сложными или хитрыми - были.
Но если у тебя через MSXML2.XMLHTTP все работает, то стопудово можно приготовить и через HTTPСоединение.
Просто поставь Fiddler и найди 20 отличий.
(15)
Загугли. Там все просто. Это просто прокси, который умеет перехватывать твой локальный http-трафик и показывать запросы именно в том виде, в котором они от тебя уходят. Т.е. ты сможешь увидеть, чем отличается одинэсный запрос от валидного. Он специально для такого рода отладки и придуман.
Не умею им пользоваться.
Загугли. Там все просто. Это просто прокси, который умеет перехватывать твой локальный http-трафик и показывать запросы именно в том виде, в котором они от тебя уходят. Т.е. ты сможешь увидеть, чем отличается одинэсный запрос от валидного. Он специально для такого рода отладки и придуман.
(16)
Я все равно ничего не поделаю с тем, что 1с передаёт служебные заголовки, на которые мой сервис ругается.
MSXML2.XMLHTTP ничего лишнего не передаёт.
Сомневаюсь:)
Т.е. ты сможешь увидеть, чем отличается одинэсный запрос от валидного. Он специально для такого рода отладки и придуман.
Я все равно ничего не поделаю с тем, что 1с передаёт служебные заголовки, на которые мой сервис ругается.
MSXML2.XMLHTTP ничего лишнего не передаёт.
Но если у тебя через MSXML2.XMLHTTP все работает, то стопудово можно приготовить и через HTTPСоединение.
Сомневаюсь:)
(18) Установил "фидлер". Разница в запросах в заголовке "Cookie".
Прикол в том, что формат куки такой:
AuthCoocies=0102890788DDB95FD808FE89B7F04A4878D8080103000000 12F00FF; expires=Sat, 24-Oct-2020 18:11:56 GMT; path=/; HttpOnly; SameSite=Lax,
AuthCoocies=0102896A8ADDB95FD808FE891AF34A487801063300320030 0037003900340000012F00FF; expires=Sat, 24-Oct-2020 18:11:56 GMT; path=/; HttpOnly; SameSite=Lax
Так вот если я передаю все - ошибка.
Если передаю первый - тоже ошибка.
А если беру последний - все оК.
Это прикол такой?!
Прикол в том, что формат куки такой:
AuthCoocies=0102890788DDB95FD808FE89B7F04A4878D8080103000000
AuthCoocies=0102896A8ADDB95FD808FE891AF34A487801063300320030
Так вот если я передаю все - ошибка.
Если передаю первый - тоже ошибка.
А если беру последний - все оК.
Это прикол такой?!
(19) В общем, работает исключительно так:
Но это костыль какой-то. Наверное, нужно смотреть сколько их и какие параметры имеет ... и уже на основании этого брать конкретный. Я не знаю почему у меня их несколько, может просто у меня несколько сеансов висит (постман с "кип-элайв" + 1с).
СтрокаКуки = HTTPОтвет.Заголовки["Set-Cookie"];
ПоследнийКуки = Сред(СтрокаКуки, _СтрНайти(СтрокаКуки, "AuthCoocie", "СКонца"));
HTTPЗаголовки.Вставить("Cookie", ПоследнийКуки);
Но это костыль какой-то. Наверное, нужно смотреть сколько их и какие параметры имеет ... и уже на основании этого брать конкретный. Я не знаю почему у меня их несколько, может просто у меня несколько сеансов висит (постман с "кип-элайв" + 1с).
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот