Нативное http-соединение vs MSXML2.XMLHTTP

1. triviumfan 94 09.09.20 18:07 Сейчас в теме
Доброго дня, коллеги.

Не буду мусолить, перейду сразу к примерам.
Есть такой вот нерабочий код:
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-соединение работали.
Найденные решения
9. triviumfan 94 10.09.20 13:34 Сейчас в теме
(8) Но необходимые заголовки, которые описаны в документации, передаются.
Вывод - сей сервис *овно.
Решено оставить работу через MSXML2.XMLHTTP. Точка.
19. triviumfan 94 23.09.20 15:37 Сейчас в теме
(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

Так вот если я передаю все - ошибка.
Если передаю первый - тоже ошибка.
А если беру последний - все оК.
Это прикол такой?!
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user958326 09.09.20 19:20 Сейчас в теме
(1)
видимо все же не тоже самое
3. comptr 34 10.09.20 08:14 Сейчас в теме
(1)
HTTPЗаголовки.Вставить("Content-Length", СтрДлина(ТелоЗапроса));

Где-то были темы, что этот из-за ручной установки этого заголовка возникают проблемы. Платформа сама его устанавливает.
alex_bob; +1 Ответить
4. alex_bob 246 10.09.20 08:44 Сейчас в теме
(3) СтрДлина возвращает количество символов utf, а должно быть количество байт. Без этой строки должно заработать.
6. triviumfan 94 10.09.20 09:14 Сейчас в теме
(3) Я тоже нигде его не устанавливал, просто тут какая-то шляпа.
Убрал - код состояния 500. И ответ неправильный( у них сервис часто неверные ответы шлёт, мол, бан тебе на сутки)
MSXML2.XMLHTTP работает.
5. nomad_irk 76 10.09.20 08:51 Сейчас в теме
(1)Почему с SOAP работаешь через HTTP-соединение? работай через WSОпределение.
7. triviumfan 94 10.09.20 10:07 Сейчас в теме
(5) Потому что через WSОпределение такая же ошибка как и через HTTPСоединение.
	Попытка
		СсылкаНаВебСервис   = "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 приходит верный ответ.
ЗЫ: http://service.autopiter.ru/v2/price?op=GetPriceId
8. Xershi 1496 10.09.20 11:11 Сейчас в теме
(1) а тут фишка в том что платформа закидывает доп заголовки, которые при отправке не видны, а ком нет!
Сделай отладку запроса в другом сервисе и увидишь разницу.
9. triviumfan 94 10.09.20 13:34 Сейчас в теме
(8) Но необходимые заголовки, которые описаны в документации, передаются.
Вывод - сей сервис *овно.
Решено оставить работу через MSXML2.XMLHTTP. Точка.
10. Xershi 1496 10.09.20 14:18 Сейчас в теме
(9) или вы его не умеете готовить!
11. triviumfan 94 23.09.20 11:38 Сейчас в теме
(10) Ну так попробуй его приготовь!
Ни одна описанная операция этого г**осервиса не работает (или 1с до сих пор не умеет работать с soap, передавая какую-то дополнительную хрень).
Возмём другую операцию - FindCatalog (<wsdl:operation name="FindCatalog">, doc)
Указан всего один параметр типа строка (<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(Логин, Пароль, Истина);

Показать
12. Xershi 1496 23.09.20 11:53 Сейчас в теме
(11) все мои проекты завершались успехом. Вы предлагаете решить вашу задачу?)
На что обратить внимание бесплатно я вам указал.
13. triviumfan 94 23.09.20 12:05 Сейчас в теме
(12)
бесплатно
спасибо за такой подарок
14. herfis 505 23.09.20 12:30 Сейчас в теме
(11)
или 1с до сих пор не умеет работать с soap, передавая какую-то дополнительную хрень

С soap у 1С могут быть проблемы. Он его не в полном объеме поддерживает. Во всяком случае раньше было не в полном. С простыми сервисами проблем обычно не было, а вот со сложными или хитрыми - были.
Но если у тебя через MSXML2.XMLHTTP все работает, то стопудово можно приготовить и через HTTPСоединение.
Просто поставь Fiddler и найди 20 отличий.
triviumfan; +1 Ответить
15. triviumfan 94 23.09.20 13:27 Сейчас в теме
(14)
Fiddler
Не умею им пользоваться.
Но postman-ом все ОК.
Прикрепленные файлы:
16. herfis 505 23.09.20 13:52 Сейчас в теме
(15)
Не умею им пользоваться.

Загугли. Там все просто. Это просто прокси, который умеет перехватывать твой локальный http-трафик и показывать запросы именно в том виде, в котором они от тебя уходят. Т.е. ты сможешь увидеть, чем отличается одинэсный запрос от валидного. Он специально для такого рода отладки и придуман.
17. triviumfan 94 23.09.20 14:44 Сейчас в теме
(16)
Т.е. ты сможешь увидеть, чем отличается одинэсный запрос от валидного. Он специально для такого рода отладки и придуман.

Я все равно ничего не поделаю с тем, что 1с передаёт служебные заголовки, на которые мой сервис ругается.
MSXML2.XMLHTTP ничего лишнего не передаёт.

Но если у тебя через MSXML2.XMLHTTP все работает, то стопудово можно приготовить и через HTTPСоединение.

Сомневаюсь:)
18. herfis 505 23.09.20 15:06 Сейчас в теме
(17)
Я все равно ничего не поделаю с тем, что 1с передаёт служебные заголовки, на которые мой сервис ругается.
MSXML2.XMLHTTP ничего лишнего не передаёт.

Хм... Действительно, если проблема в "неубираемых" заголовках, то со "стопудово" я погорячился.
19. triviumfan 94 23.09.20 15:37 Сейчас в теме
(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

Так вот если я передаю все - ошибка.
Если передаю первый - тоже ошибка.
А если беру последний - все оК.
Это прикол такой?!
20. triviumfan 94 23.09.20 16:02 Сейчас в теме
(19) В общем, работает исключительно так:
СтрокаКуки = HTTPОтвет.Заголовки["Set-Cookie"];
ПоследнийКуки = Сред(СтрокаКуки, _СтрНайти(СтрокаКуки, "AuthCoocie", "СКонца")); 
HTTPЗаголовки.Вставить("Cookie", ПоследнийКуки);

Но это костыль какой-то. Наверное, нужно смотреть сколько их и какие параметры имеет ... и уже на основании этого брать конкретный. Я не знаю почему у меня их несколько, может просто у меня несколько сеансов висит (постман с "кип-элайв" + 1с).
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот