Имя: Пароль:
1C
 
Паразитный символ ? при отправке POST запроса
0 bvb
 
21.08.19
12:01
Отправляю POST запрос с помощью функции
Функция ВыполнитьPOSTЗапрос(ИмяСервера, Порт, Команда, СсылкаНаРесурс)
    HTTP = Новый HTTPСоединение(ИмяСервера,Порт,,,,60);

    ФайлЗапроса = ПолучитьИмяВременногоФайла();
    ТекстовыйФайл = Новый ТекстовыйДокумент;
    ТекстовыйФайл.УстановитьТекст(СокрЛП(Команда));
    ТекстовыйФайл.Записать(ФайлЗапроса, КодировкаТекста.UTF8);
    ФайлРезультата = ПолучитьИмяВременногоФайла();
    ЗаголовокHTTP = Новый Соответствие();
    
    //ЗаголовокHTTP.Вставить("Accept-Language", "ru");
    //ЗаголовокHTTP.Вставить("Accept-Charset", "utf-8");
    //ЗаголовокHTTP.Вставить("Content-Language", "ru");
    //ЗаголовокHTTP.Вставить("Content-Charset", "utf-8");
    //ЗаголовокHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded");
    //ЗаголовокHTTP.Вставить("Content-Type", "application/xml");
    ЗаголовокHTTP.Вставить("Content-Type", "application/json; charset=utf-8");

    HTTP.ОтправитьДляОбработки(ФайлЗапроса, СсылкаНаРесурс, ФайлРезультата, ЗаголовокHTTP);
    Ответ = Новый ТекстовыйДокумент();
    Ответ.Прочитать(ФайлРезультата, КодировкаТекста.UTF8);
    ТекстОтвета = Ответ.ПолучитьТекст();
    УдалитьФайлы(ФайлЗапроса);
    УдалитьФайлы(ФайлРезультата);
    
    Возврат ТекстОтвета;
КонецФункции

В на стороне приемника в начале текста возникает паразитный символ ?  
Ну и прилетает :
<result><code>0</code><message>error ORA-31011: сбой разбора XML</message></result>
1 Cyberhawk
 
21.08.19
12:04
Это тебе карма такая за использование файликов
2 Вафель
 
21.08.19
12:07
это бом, а не паразитный символ
3 bvb
 
21.08.19
12:07
(1) Знаю
Я тоже против вариант но без файликов вообще возвращает Ошибку 500

Функция ВыполнитьPOSTЗапрос(ИмяСервера, Порт, СтрокаОтправки, СсылкаНаРесурс) Экспорт
    
    
    HTTP = Новый HTTPСоединение(ИмяСервера,Порт,,,,60);
        
    ЗаголовокЗапросаHTTP = Новый Соответствие();
    ЗаголовокЗапросаHTTP.Вставить("Content-Length",СтрДлина(СтрокаОтправки));
    //ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded");
    //ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/json; charset=utf-8");
    ЗаголовокЗапросаHTTP.Вставить("Content-Type", "text/plain;charset=UTF-8");
    
    
    
    //HTTPЗапрос = Новый HTTPЗапрос(СсылкаНаРесурс,ЗаголовокЗапросаHTTP);
    HTTPЗапрос = Новый HTTPЗапрос;
    HTTPЗапрос.АдресРесурса = СсылкаНаРесурс;
    HTTPЗапрос.Заголовки = ЗаголовокЗапросаHTTP;
    
    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаОтправки);
    
    Возврат HTTP.ОтправитьДляОбработки(HTTPЗапрос).ПолучитьТелоКакСтроку();
    
    
КонецФункции
4 Cyberhawk
 
21.08.19
12:10
Запомни на будущее простое правило: Content-Length никогда вообще не устанавливай в коде.
5 palsergeich
 
21.08.19
12:21
ЗаголовокЗапросаHTTP.Вставить("Content-Length",СтрДлина(СтрокаОтправки));
Не надо этого делать, платформа сама вставляет этот заголовок. Я тебе могу даже сказать где ты ошибся)
Если символов 1000 то эта штука СтрДлина(СтрокаОтправки) вернёт 1 000, и из-за неразрывного пробела все сломается)
Ещё раз повторю, этот заголовок ставится сам м его не надо устанавливать
6 bvb
 
21.08.19
12:33
Вот вариант :

1. без использования временных файлов
2. без Content-Length
3. Content-Type как Advancer Rest Client (где все ОК)

Все равно : <result><code>0</code><message>error ORA-31011: сбой разбора XML</message></result>

Функция ВыполнитьPOSTЗапрос(ИмяСервера, Порт, СтрокаОтправки, СсылкаНаРесурс) Экспорт
    
    
    HTTP = Новый HTTPСоединение(ИмяСервера,Порт,,,,60);
        
    ЗаголовокЗапросаHTTP = Новый Соответствие();
    ЗаголовокЗапросаHTTP.Вставить("Content-Length",СтрДлина(СтрокаОтправки));
    //ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded");
    //ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/json; charset=utf-8");
    ЗаголовокЗапросаHTTP.Вставить("Content-Type", "text/plain;charset=UTF-8");
    
    
    
    //HTTPЗапрос = Новый HTTPЗапрос(СсылкаНаРесурс,ЗаголовокЗапросаHTTP);
    HTTPЗапрос = Новый HTTPЗапрос;
    HTTPЗапрос.АдресРесурса = СсылкаНаРесурс;
    HTTPЗапрос.Заголовки = ЗаголовокЗапросаHTTP;
    
    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаОтправки);
    
    Возврат HTTP.ОтправитьДляОбработки(HTTPЗапрос).ПолучитьТелоКакСтроку();
        
КонецФункции

ЧТО ОН ТВАРЬ ЕЩЕ ХОЧЕТ ?
7 bvb
 
21.08.19
12:34
Подозреваю что куда то еще нужно впердолить  HTTP/1.1
8 Вафель
 
21.08.19
12:53
говоришь "без", а в коде есть
9 bvb
 
21.08.19
12:57
(8) НЕ нет. Не то скопипастил.
Вот самый лайтовый вариант

Функция ВыполнитьPOSTЗапрос(ИмяСервера, Порт, СтрокаОтправки, СсылкаНаРесурс) Экспорт
        
    HTTP = Новый HTTPСоединение(ИмяСервера,Порт,,,,60);
        
    ЗаголовокЗапросаHTTP = Новый Соответствие();
    ЗаголовокЗапросаHTTP.Вставить("Content-Type"  , "application/xml");
        
    HTTPЗапрос = Новый HTTPЗапрос(СсылкаНаРесурс,ЗаголовокЗапросаHTTP);
    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаОтправки);
    
    Возврат HTTP.ОтправитьДляОбработки(HTTPЗапрос).ПолучитьТелоКакСтроку();
        
КонецФункции
10 Cyberhawk
 
21.08.19
12:58
Покажи скрин ARC где все работает, включая URI
11 Cyberhawk
 
21.08.19
12:58
А также отладчик с точкой останова до отправки ПОСТ-запроса с видными значениями всех параметров метода
12 trad
 
21.08.19
13:00
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаОтправки,,ИспользованиеByteOrderMark.НеИспользовать);
13 bvb
 
21.08.19
13:03
14 Cyberhawk
 
21.08.19
13:05
(13) Ну так может у тебя действительно текст ХМЛ гуано в 1С
15 bvb
 
21.08.19
13:09
(12) ЕСТЬ !!!!
<result><code>1</code><message>OK; Load NOMENKLATURA complete.  Loaded 1 items.</message></result>

Спасибо огромное
16 Вафель
 
21.08.19
13:11
А я же говорил )))
17 bvb
 
21.08.19
13:16
(16) Там похоже вебовец что то еще со своей стороны подшаминаивал.
Но по сути проблема была в Content-Length
18 bvb
 
21.08.19
13:19
Окончательный вариант функции если кому нужен будет :

Функция ВыполнитьPOSTЗапрос(ИмяСервера, Порт, СтрокаОтправки, СсылкаНаРесурс) Экспорт
        
    HTTP = Новый HTTPСоединение(ИмяСервера,Порт,,,,60);
        
    ЗаголовокЗапросаHTTP = Новый Соответствие();
    ЗаголовокЗапросаHTTP.Вставить("Content-Type"  , "application/xml");
        
    HTTPЗапрос = Новый HTTPЗапрос(СсылкаНаРесурс,ЗаголовокЗапросаHTTP);
    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаОтправки,,ИспользованиеByteOrderMark.НеИспользовать);
    
    Возврат HTTP.ОтправитьДляОбработки(HTTPЗапрос).ПолучитьТелоКакСтроку();
        
КонецФункции
19 Cyberhawk
 
21.08.19
13:20
(17) Так без третьего параметра "ИспользованиеByteOrderMark.НеИспользовать" тоже работает?
20 Garykom
 
гуру
21.08.19
13:25
(12) BOM это классика, в целом есть куча тонкостей в http но они все решаемые обычно
21 bvb
 
21.08.19
14:32
(19) нет
22 bvb
 
21.08.19
15:25
И таки да :
Всем большое спасибо в помощи по новой для меня теме
23 Вафель
 
21.08.19
15:27
(17) тебе говорят бом, а ты почему то контент-ленгф
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший