Имя: Пароль:
1C
 
Отправка xml файла с помощью multipart/form-data
0 location
 
14.11.24
15:34
Добрый день. Подскажите пож-та, не могу понять чего не хватает 1с, чтобы отправить файл. Через Postman файл отправляется
snipped code
POST /~/upload HTTP/1.1
Host: apiv1.com
Content-Type: multipart/form-data; boundary=44078d1ff6534067a865f58aeea2de0b
Storage-Token: 5d******99dff

--44078d1ff6534067a865f58aeea2de0b
Content-Disposition: form-data; name="file"; filename="stocks.xml"
Content-Type: application/xml

<?xml version="1.0" encoding="UTF-8"?>
<items>
	<item>
		<rzcode>23</rzcode>
		<code>11</code>
		<barcode>12321</barcode>
		<cat>fff</cat>
		<brand>bbb</brand>
		<title>Name</title>
		<price/>
		<rrc/>
		<qty/>
		<available>0</available>
	</item>
</items>

--44078d1ff6534067a865f58aeea2de0b
Content-Disposition: form-data; name="path"

/
--44078d1ff6534067a865f58aeea2de0b--


сам код выглядит так

Разделитель = СтрЗаменить(Новый УникальныйИдентификатор(), "-","");
ТелоЗапроса = Новый ТекстовыйДокумент();
ТелоЗапроса.РазделительСтрок = Символы.CR+Символы.LF;
ТелоЗапроса.ДобавитьСтроку("--" + Разделитель);
ТелоЗапроса.ДобавитьСтроку("Content-Disposition: form-data; name=""file""; filename=""stocks.xml""");
ТелоЗапроса.ДобавитьСтроку("Content-Type: application/xml");
		ТелоЗапроса.ДобавитьСтроку("");
	//	ЗаписьДанных.ЗаписатьСтроку(ДвоичныеДанные);
		ТелоЗапроса.ДобавитьСтроку(СтрXML);
		ТелоЗапроса.ДобавитьСтроку("");
		ТелоЗапроса.ДобавитьСтроку("--" + Разделитель);
		ТелоЗапроса.ДобавитьСтроку("Content-Disposition: form-data; name=""path"""); 
		ТелоЗапроса.ДобавитьСтроку("");
		ТелоЗапроса.ДобавитьСтроку("/"); 
		ТелоЗапроса.ДобавитьСтроку("--"+Разделитель+"--");
		ТелоЗапроса.ДобавитьСтроку("");
		ТелоЗапросаСтрока = ТелоЗапроса.ПолучитьТекст();

		Host 		= "apiv1.com";
		GetTokenURL 	= "~/upload"; 
		
		Заголовки = Новый Соответствие;  
		Заголовки.Вставить("Storage-Token", "5d******99dff");
		Заголовки.Вставить("Content-Type","multipart/form-data; boundary =" + Разделитель);
		HTTPЗапрос = Новый HTTPЗапрос(GetTokenURL, Заголовки);
       	HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапросаСтрока);
		Соединение = Новый HTTPСоединение(Host,,,,,,Новый ЗащищенноеСоединениеOpenSSL);
		ЧтениеJSON = Новый ЧтениеJSON;
		Попытка         
			HTTPОтвет = Соединение.ОтправитьДляОбработки(HTTPЗапрос); // post запрос   
			Ответ = HTTPОтвет.ПолучитьТелоКакСтроку();
		Исключение
			ТекстОшибки = "API Хостинга|"+ОписаниеОшибки();
			ЗаписьЖурналаРегистрации("обмен остатками",УровеньЖурналаРегистрации.Ошибка,,,ТекстОшибки);        
		КонецПопытки;  



если вставлять ТелоЗапросаСтрока как Body в Postman все отлично отправляется
а с 1с выдает ошибку Not Allowed, как будто нет доступа не проходит авторизацию
1 Asmody
 
14.11.24
15:40
может
GetTokenURL     = "/~/upload";
2 Garykom
 
14.11.24
15:44
угу, вряд ли есть сервер "apiv1.com~"
3 location
 
14.11.24
15:44
(1) нет так тоже Ошибка "Not allowed"
4 Garykom
 
14.11.24
15:49
еще порядок Content-Type и Storage-Token не совпадает
5 location
 
14.11.24
15:49
(2) замените apiv1.com
XXXXxXXXxxxXxXXx.cdn.express не важно.
Токен например с такими параметрами отлично получается
    Host             = "apiv1.com";
    GetTokenURL     = "~/action/storage/auth/login/";


вот пример curl
curl -v -H 'Storage-Token: token' -F file='@/path/to/local/file.ext' -F path='/' 'https://XXXXxXXXxxxXxXXx.cdn.express/~/upload'
6 location
 
14.11.24
15:50
(4) где не совпадает
7 Garykom
 
14.11.24
15:51
Content-Type: multipart/form-data; boundary=44078d1ff6534067a865f58aeea2de0b

и
"Content-Type","multipart/form-data; boundary =" + Разделитель

пробел лишний перед =
8 Garykom
 
14.11.24
15:53
https://XXXXxXXXxxxXxXXx.cdn.express/~/upload'
обрати внимание что после express идет / перед ~
это / должно быть первым в GetTokenURL
9 Garykom
 
14.11.24
15:54
(6) хз вряд ли порядок заголовков важен
но в Postman у тебя сначала Content-Type, затем Storage-Token
в 1С наоборот
10 Garykom
 
14.11.24
15:56
поставь уже сниффер, лови и сравнивай постман/курл и 1С
11 location
 
14.11.24
15:57
(7) во ппц, спасибо. в этом и был весь прикол
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший