Имя: Пароль:
1C
1С v8
Помогите с POST запросом
0 bodri
 
14.02.18
08:24
Доброго времени суток.
Прошу сильно не пинать, т.к. с эти работаю впервые.
Необходимо отправить заявку на сайт, пример рабочего запроса:
pharmcenter.kz/External1CDirectory/UploadOrders?skey=(ХэшМД5)&order_xml=<?xml version="1.0" encoding="utf-8"?>
<root>
<d id="149">
  <i id="48" count="20" expired="01.10.2020" price="913,48"></i>
</d>
</root>

я отправляю так:

    
    КолСтрок = 0;
    
    #Область XML
        ИмяФайлаЗапроса = ПолучитьИмяВременногоФайла();
        Запись = Новый ЗаписьXML;
        ПараметрыЗаписи = Новый ПараметрыЗаписиXML("utf-8");
        Запись.ОткрытьФайл(ИмяФайлаЗапроса,ПараметрыЗаписи);
        Запись.ЗаписатьОбъявлениеXML();
        
        #Область root
            Запись.ЗаписатьНачалоЭлемента("root");
            #Область Контрагент
                Запись.ЗаписатьНачалоЭлемента("d");
                Запись.ЗаписатьАтрибут("id",Контрагент.ID_pharmcenter_kz);
                #Область Товары
                    Для Каждого Стр из Таблица Цикл
                        
                        Если ПустаяСтрока(Стр.ID_Товара) Тогда
                            Продолжить;
                        КонецЕсли;
                        
                        КолСтрок = КолСтрок + 1;
                        
                        Запись.ЗаписатьНачалоЭлемента("i");
                        
                        Запись.ЗаписатьАтрибут("id",Стр.ID_Товара);
                        Запись.ЗаписатьАтрибут("count",Формат(Стр.Количество,"ЧДЦ=; ЧГ=0"));
                        Запись.ЗаписатьАтрибут("expired",Формат(Стр.СрокГодности,"ДФ=dd.MM.yyyy"));
                        Запись.ЗаписатьАтрибут("price",Формат(Стр.Цена,"ЧДЦ=2; ЧН=0; ЧГ=0"));
                    
                        Запись.ЗаписатьКонецЭлемента();
                        
                    КонецЦикла;
                #КонецОбласти //Товары
                Запись.ЗаписатьКонецЭлемента();
            #КонецОбласти //Контрагент
            Запись.ЗаписатьКонецЭлемента();
        #КонецОбласти //root
        Запись.Закрыть();
    #КонецОбласти //XML
    
    Если КолСтрок = 0 тогда
        Возврат;
    КонецЕсли;
    
    Текст = Новый ТекстовыйДокумент;
    Текст.Прочитать(ИмяФайлаЗапроса);
    ТекТекст = Текст.ПолучитьТекст();
    ТекТекст = СтрЗаменить(ТекТекст,"""/>","""></i>");
    Текст.Очистить();
    Текст.УстановитьТекст(ТекТекст);
    Текст.Записать(ИмяФайлаЗапроса);
    
    Сервер = "pharmcenter.kz";
    
    HTTPСоединение = Новый HTTPСоединение(Сервер);
    
    Если ПустаяСтрока(ПереданныйХеш) Тогда
        Хеш = Новый ХешированиеДанных(ХешФункция.MD5);
        Хеш.Добавить("" + СокрЛП(Пользователь) + "+" + СокрЛП(Пароль));
        ХешТекст = СтрЗаменить(НРег(Хеш.ХешСумма)," ","");
    Иначе
        ХешТекст = ПереданныйХеш;
    КонецЕсли;
    
    ТекстЗапроса = "/External1CDirectory/UploadOrders?skey=" + ХешТекст + "&order_xml=";
    
    HTTPЗапрос = Новый HTTPЗапрос(ТекстЗапроса);
    HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаЗапроса);
    Ответ = Новый Структура;
    
    Ответ.Вставить("Запрос",ТекстЗапроса);
    
    Попытка
        ОтветHTTP = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
        Ответ.Вставить("Ответ",ОтветHTTP.ПолучитьТелоКакСтроку());
    Исключение
        Ответ.Вставить("Ответ",ОписаниеОшибки());
        Ответ.Вставить("Ошибка");
    КонецПопытки;

Возвращает ошибку сервера: error_order_xml_empty (Дословно, ошибка заявки xml пуст), в связи с чем зародился вопрос:
Как можно проверить какой текст отправляется?
1 sitex
 
naïve
14.02.18
08:33
Проверьте какое тело (body) отправляете в  ИмяФайлаЗапроса.
2 bodri
 
14.02.18
08:40
проверил, вот содержание файла:
<?xml version="1.0" encoding="utf-8"?>
<root>
    <d id="149">
        <i id="48" count="20" expired="01.10.2020" price="913,48"></i>
</root>
3 bodri
 
14.02.18
08:41
(2) много вырезал

<?xml version="1.0" encoding="utf-8"?>
<root>
    <d id="149">
        <i id="48" count="20" expired="01.10.2020" price="913,48"></i>
    </d>
</root>
4 sitex
 
naïve
14.02.18
08:42
(3) также укажи заголовки "Content-Type" ,"Content-Lenght"
5 ASV
 
14.02.18
08:43
Ресурс="pharmcenter.kz/External1CDirectory/UploadOrders"
Тело="skey=(ХэшМД5)&order_xml=<?xml version=1.0 encoding=utf-8?>
<root> <d id=149>  <i id=48 count=20 expired=01.10.2020 price=913,48></i> </d></root>"

Заголовки = Новый Соответствие;    
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded;");    
Запрос = Новый HTTPЗапрос(Ресурс, Заголовки);
Запрос.УстановитьТелоИзСтроки(Тело);
Результат = Соединение.ОтправитьДляОбработки(Запрос);
6 ASV
 
14.02.18
08:46
(5)
Сервер = "pharmcenter.kz";
Ресурс="/External1CDirectory/UploadOrders"
7 Сияющий в темноте
 
14.02.18
08:48
А где в 0 POST запрос?
Я пока вижу попытку все в GET зафигачить
в параметрах адреса указывается имя файла,а сам файл кладется в тело,разделенный границами,которые добавляются в заголовки
8 Redkiy
 
14.02.18
08:49
В чем смысл сохранять хмл в файл? С коде не видно что ты потом этот мусор удаляешь.

Так не проще?
ТекстXML = Запись.Закрыть();
9 bodri
 
14.02.18
08:50
(7) (8) делал по СП

HTTPСоединение (HTTPConnection)
ОтправитьДляОбработки (Post)
Синтаксис:

ОтправитьДляОбработки(<HTTPЗапрос>, <ИмяВыходногоФайла>)
Параметры:

<HTTPЗапрос> (обязательный)

Тип: HTTPЗапрос.
HTTP-запрос.
<ИмяВыходногоФайла> (необязательный)

Тип: Строка.
Имя выходного файла, в который записываются полученные с сервера данные.
Если не указан или содержит пустую строку, то тело ответа может быть получено из объекта HTTPОтвет.
Возвращаемое значение:

Тип: HTTPОтвет.

Описание:

Отправляет данные на указанный адрес для обработки при помощи HTTP-запроса POST.

Доступность:

Тонкий клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Пример:

// инициализируем объект для записи XML
ИмяФайлаЗапроса = ПолучитьИмяВременногоФайла();
ОбъектЗапись = Новый ЗаписьXML;
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("windows-1251", , Ложь);
ОбъектЗапись.ОткрытьФайл(ИмяФайлаЗапроса, ПараметрыЗаписиXML);
ОбъектЗапись.ЗаписатьОбъявлениеXML();

// выводим корневой элемент Request
ОбъектЗапись.ЗаписатьНачалоЭлемента("Request");

// выводим элемент ClientInfo
ОбъектЗапись.ЗаписатьНачалоЭлемента("ClientInfo");
ОбъектЗапись.ЗаписатьАтрибут("email", АдресОтправителя);
ОбъектЗапись.ЗаписатьКонецЭлемента();

Если ИмяФайлаСертификата <> Неопределено Тогда

    // кодируем в Base64 сертификат
    ДвДанные.Прочитать(ИмяФайлаСертификата);
    ФайлСертификатаBase64 = ДвДанные.ПолучитьСтрокуBase64();
    
    // выводим элемент Certificate
    ОбъектЗапись.ЗаписатьНачалоЭлемента("Certificate");
    ОбъектЗапись.ЗаписатьТекст(ФайлСертификатаBase64);
    ОбъектЗапись.ЗаписатьКонецЭлемента();
    
КонецЕсли;

Если ИмяФайлаЗашифрованногоКонтейнера <> Неопределено Тогда

    // кодируем в Base64 зашифрованный контейнер
    ДвДанные.Прочитать(ИмяФайлаЗашифрованногоКонтейнера);
    ФайлЗашифрованногоКонтейнераBase64 = ДвДанные.ПолучитьСтрокуBase64();
    
    // выводим элемент Data
    ОбъектЗапись.ЗаписатьНачалоЭлемента("Data");
    ОбъектЗапись.ЗаписатьТекст(ФайлЗашифрованногоКонтейнераBase64);
    ОбъектЗапись.ЗаписатьКонецЭлемента();
    
КонецЕсли;

// записываем конец для корневого элемента
ОбъектЗапись.ЗаписатьКонецЭлемента();

ОбъектЗапись.Закрыть();

АдресСервераОнлайнПроверки = "onlinefc.taxcom.ru";
РесурсНаСервере = "/online_fc/online_fc.dll" + ?(ПолучитьСертификат, "?IncludeCertificate", "");

// устанавливаем соединение с сервером
Попытка
    Соединение = Новый HTTPСоединение(АдресСервераОнлайнПроверки, , , , Прокси);
Исключение
    Сообщить("Не удалось установить соединение с сервером онлайн-проверки:"
        + Символы.ПС + ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
    Возврат;
КонецПопытки;

// посылаем запрос
Попытка
    HTTPЗапрос = Новый HTTPЗапрос(РесурсНаСервере);
    HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаЗапроса);
    Результат  = Соединение.ОтправитьДляОбработки(Запрос);
    Соединение = Неопределено;
    Если Результат.КодСостояния > 299 Тогда
       Сообщить("Код состояния " + Результат.КодСостояния + ". Проверка не выполнена");
    КонецЕсли;
Исключение
    Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
КонецПопытки;
10 VS-1976
 
14.02.18
09:10
Поставь себе Fiddler и проверяй сервис.
11 bodri
 
14.02.18
09:15
поправил немного:

    
    НачалоТекста = "&order_xml=";
    
    Текст = Новый ТекстовыйДокумент;
    Текст.Прочитать(ИмяФайлаЗапроса);
    ТекТекст = Текст.ПолучитьТекст();
    ТекТекст = СтрЗаменить(ТекТекст,"""/>","""></i>");
    Текст.Очистить();
    Текст.УстановитьТекст(НачалоТекста + ТекТекст);
    Текст.Записать(ИмяФайлаЗапроса);
    
    Сервер = "pharmcenter.kz";
    
    HTTPСоединение = Новый HTTPСоединение(Сервер);
    
    Если ПустаяСтрока(ПереданныйХеш) Тогда
        Хеш = Новый ХешированиеДанных(ХешФункция.MD5);
        Хеш.Добавить("" + СокрЛП(Пользователь) + "+" + СокрЛП(Пароль));
        ХешТекст = СтрЗаменить(НРег(Хеш.ХешСумма)," ","");
    Иначе
        ХешТекст = ПереданныйХеш;
    КонецЕсли;
    
    ТекстЗапроса = "/External1CDirectory/UploadOrders?skey=" + ХешТекст;
    
    Заголовки = Новый Соответствие;    
    Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded;");
    HTTPЗапрос = Новый HTTPЗапрос(ТекстЗапроса,Заголовки);
    HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаЗапроса);

Результат "ОК"
заявка появилась на сайте
12 bodri
 
14.02.18
09:16
(10) дело не в проверке сервиса, а в том, что и как именно отправляет 1С
13 VS-1976
 
14.02.18
09:20
(12) Я имел ввиду подкидываешь сформированную строку и смотришь что не так.
14 VS-1976
 
14.02.18
09:20
(13) точнее сформированный запрос
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn