Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Помогите с POST запросом

Помогите с POST запросом
Я
   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 пуст), в связи с чем зародился вопрос:
Как можно проверить какой текст отправляется?
 
 
   sitex
 
1 - 14.02.18 - 08:33
Проверьте какое тело (body) отправляете в  ИмяФайлаЗапроса.
   bodri
 
2 - 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>
   bodri
 
3 - 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>
   sitex
 
4 - 14.02.18 - 08:42
(3) также укажи заголовки "Content-Type" ,"Content-Lenght"
   ASV
 
5 - 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Запрос(Ресурс, Заголовки);
Запрос.УстановитьТелоИзСтроки(Тело);
Результат = Соединение.ОтправитьДляОбработки(Запрос);
   ASV
 
6 - 14.02.18 - 08:46
(5)
Сервер = "pharmcenter.kz";
Ресурс="/External1CDirectory/UploadOrders"
   Сияющий в темноте
 
7 - 14.02.18 - 08:48
А где в 0 POST запрос?
Я пока вижу попытку все в GET зафигачить
в параметрах адреса указывается имя файла,а сам файл кладется в тело,разделенный границами,которые добавляются в заголовки
   Redkiy
 
8 - 14.02.18 - 08:49
В чем смысл сохранять хмл в файл? С коде не видно что ты потом этот мусор удаляешь.

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

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует