Задать вопрос
@AlexGabal
Профессионал по разработке 1С

Не доходит post запрос, сформированный через 1c, до сервера?

Добрый день!
Стоит задача по передаче на web ресурс файла через 1с методом post запроса. Код описан ниже. При отправке запроса сервер не возвращает ответ, хотя при проверке через postman все работало. Есть подозрение, что проблема кроется в попытке привязке файла к телу запроса. Просмотрел пол интернета, и у всех описано что все работает. Подскажите пожалуйста, что могло пойти не так?
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
	ИмяФайлаДляЗагрузки = "C:\Users\GAA\Documents\Price.xls";
	ИмяфайлаЗагрузки = "Price.xls";
	ИмяфайлаОтправки = КаталогВременныхФайлов() + "post.txt";
	ДопустимыйРазмерФайлаВБайтах = 2097152;
	Содержимоефайла = "";
	
	//****************//        
	//Подготовка Файла//
	//****************//
	
	КодироватьФайл = Ложь; 
	//Определяем массив для процедуры ОбъединитьФайлы 
	МассивФайловДляОбъединения = Новый Массив(); 

	//Формируем начальный фрагмент файла POST-запроса 
	ИмяФайлаОтправкиНачало = ПолучитьИмяВременногоФайла("txt"); 
	ФайлОтправкиНачало = Новый ЗаписьТекста(ИмяФайлаОтправкиНачало, КодировкаТекста.ANSI, Символы.ПС, Ложь); 
	//Определяем раздел двоичных данных 
	ФайлОтправкиНачало.ЗаписатьСтроку("--" + Boundary); 
	//Указываем имя файла для передачи 
	//На сервере оно появится в массиве $_FILES['datafile']['name'] 
	ФайлОтправкиНачало.ЗаписатьСтроку("Content-Disposition: form-data; name=""datafile""; filename=""" + ИмяфайлаЗагрузки + """"); 
	//Указываем тип передаваемых данных. 
	//С таким же успехом в Content-Type можно указать application/x-octet-stream или application/x-zip-compressed 
	ФайлОтправкиНачало.ЗаписатьСтроку("Content-Type: application/x-octet-stream"); 
	ФайлОтправкиНачало.ЗаписатьСтроку("");
	ФайлОтправкиНачало.ЗаписатьСтроку("--" + Boundary); 
	ФайлОтправкиНачало.ЗаписатьСтроку("");

	ФайлОтправкиНачало.Закрыть(); 

	МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиНачало); 

	//Копируем файл для загрузки во временный и добавляем в массив файлов для объединения 
	ИмяФайлаДляЗагрузкиВременный = ПолучитьИмяВременногоФайла("tmp"); 
	КопироватьФайл(ИмяФайлаДляЗагрузки, ИмяФайлаДляЗагрузкиВременный); 
	МассивФайловДляОбъединения.Добавить(ИмяФайлаДляЗагрузкиВременный); 

	//Формируем конечный фрагмент файла POST-запроса 
	ИмяФайлаОтправкиКонец = ПолучитьИмяВременногоФайла("txt"); 
	ФайлОтправкиКонец = Новый ЗаписьТекста(ИмяФайлаОтправкиКонец, КодировкаТекста.ANSI, Символы.ПС, Ложь); 

	//Завершение раздела двоичных данных 
	ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary); 

	//Определяем раздел для каких либо других POST-данных, например содержимого полей виртуальной HTML-формы. 

	//Соответствует полю HTML-формы input type="submit" name="submit" value="Submit" / 
	ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary); 
	ФайлОтправкиКонец.ЗаписатьСтроку("Content-disposition: form-data; name=""submit""" + Символы.ПС); 
	ФайлОтправкиКонец.ЗаписатьСтроку("1"); 
	ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary); 

	//Соответствует полю HTML-формы input type="checkbox" name="decode" value="decode" / 
	ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary); 
	ФайлОтправкиКонец.ЗаписатьСтроку("Content-disposition: form-data; name=""decode""" + Символы.ПС); 
	ФайлОтправкиКонец.ЗаписатьСтроку(?(КодироватьФайл, "1", "0")); 
	ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary); 

	//Соответствует полю HTML-формы input type="text" name="some_field" value="Some text" / 
	ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary); 
	ФайлОтправкиКонец.ЗаписатьСтроку("Content-disposition: form-data; name=""message""" + Символы.ПС); 
	ФайлОтправкиКонец.ЗаписатьСтроку("Передача файла из базы данных 1С Предприятия"); 
	//Завершение сообщения для сервера 
	ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary + "--"); 
	ФайлОтправкиКонец.Закрыть(); 

	МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиКонец); 
	
		//ИмяФайлаОтправки = ИмяФайлаОтправкиКонец;
		

	//Теперь сформированные фрагменты сообщения для сервера объединяем в один файл POST-запроса 
	ОбъединитьФайлы(МассивФайловДляОбъединения, ИмяфайлаОтправки); 

	
	ИмяФайлаОтвета = "";//КаталогВременныхФайлов() + "answer.tmp";

	
	//***********//
	//POST запрос//
	//***********//
	
	ЗаголовокHTTP = Новый Соответствие(); 
   //Обязательные поля заголовка      
   //Укажем формат данных Content-Type 
    ЗаголовокHTTP.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary); 

    //Укажем длину POST-запроса Content-Length 
	ФайлОтправки = Новый Файл(ИмяфайлаОтправки); 
	РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер()); 
	ЗаголовокHTTP.Вставить("Content-Length", РазмерФайлаОтправки);
    //При необходимости зададим Referer, например таким образом 
    СтрокаСоединения = СтрокаСоединенияИнформационнойБазы(); 
    СерверИсточник = НСтр(СтрокаСоединения, "Srvr") + НСтр(СтрокаСоединения, "Ref"); 
    ЗаголовокHTTP.Вставить(СерверИсточник); 
		//******************************//
	//Формирование HTTP - соединения//
	//******************************//
	
	СерверПриемник = "192.168.2.30"; //Естественно, следует указать свой адрес. 
	//Порт = ""; //Это общепринятый порт. Возможно, для вашего сервера применяется другой. Конкретное значение уточните у хостера. 

    //ИспользоватьПрокси - какая-то логическая переменная, может быть значение флажка на форме или переключатель 

        НТТР = Новый HTTPСоединение( "localhost", 80); 

	
	//***************//
	//Отправка данных//
	//***************//
		
	АдресСкрипта = "index.php"; //Естественно, следует указать имя своего скрипта. 
    Попытка 
		//НТТР.ОтправитьДляОбработки(ИмяФайлаОтправки,"index.php", ИмяФайлаОтвета, ЗаголовокHTTP);
		НТТР.ОтправитьДляОбработки(ИмяФайлаОтправки, ИмяФайлаОтвета); 
    Исключение 
        //Пример обработки ошибки соединения. 
            Сообщить("Неудачная попытка соединения: " + ОписаниеОшибки()); 
    Возврат; 
	КонецПопытки;
	
	Сообщить("Отправка файла на сервер успешна.");
	
    //Удаляем файлы POST-запроса и фрагменты сообщения. Больше они не нужны 
    УдалитьФайлы(ИмяФайлаОтправки); 
	
ФайлОтвета = Новый Файл(ИмяФайлаОтвета); 
    Если ФайлОтвета.Существует() Тогда 
        ТекстОтвета = Новый ТекстовыйДокумент(); 
        ТекстОтвета.Прочитать(ИмяФайлаОтвета); 
        Если ТекстОтвета.КоличествоСтрок() > 0 Тогда 
            ОтветСервера = ТекстОтвета.ПолучитьТекст(); 
            #Если Клиент Тогда 
                Сообщить(ОтветСервера); 
            #КонецЕсли 
        Иначе 
            #Если Клиент Тогда 
                Сообщить("Отправка файла на сервер: Получен пустой ответ сервера."); 
            #Иначе 
                ЗаписьЖурналаРегистрации("HTTPСоединение", УровеньЖурналаРегистрации.Ошибка, , , "Получен пустой ответ сервера."); 
            #КонецЕсли 
        КонецЕсли; 

        //Удалим файл ответа. Больше он нам не нужен. 
        УдалитьФайлы(ИмяФайлаОтвета); 
    Иначе 
        #Если Клиент Тогда 
            Сообщить("Отправка файла на сервер: Ответ сервера не получен."); 
        #Иначе 
            ЗаписьЖурналаРегистрации("HTTPСоединение", УровеньЖурналаРегистрации.Ошибка, , , "Ответ сервера не получен."); 
        #КонецЕсли 
КонецЕсли;

Не доходит до сервера
  • Вопрос задан
  • 1053 просмотра
Подписаться 1 Средний 6 комментариев
Решения вопроса 1
@Dementor
программист, архитектор, аналитик
Вы отправляете на localhost - понятно, что никакие сервера ничего не получают.

Если вы выложили без купюр огромную простынь и только в одной строчке подправили адрес сервера, то:
1) или в адресе сервера опечатка
2) у вас фаервол, который блокирует исходящие
3) на стороне сервера фаервол, который блокирует все входящие кроме "белого списка".
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы