API Запрос с типом multipart/form-data

1. user1293615 18.07.22 17:21 Сейчас в теме
Доброго времени суток.

Имеется API https://cloud.bazissoft.ru/openapi
Сделано успешно несколько get и post запросов с типом application/json-patch+json

Цель поменять статус документа зная его ID

//curl -X PUT "https://cloud.bazissoft.ru/api-cutting-public/orders/127337/status"
//-H "accept: application/json"
//-H "apiKey: Ключ"
//-H "Content-Type: multipart/form-data"
//-d {"statusId":"9"}

В Swagger запрос проходит успешно.

Уперся в multipart/form-data . Ответ запроса 405.
Ниже код.
Подскажите что не так делаю!


Соединение = Новый HTTPСоединение("cloud.bazissoft.ru",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Заголовки=Новый Соответствие;
Заголовки.Вставить("apiKey","Ключ");
Заголовки.Вставить("accept","application/json");
Заголовки.Вставить("Content-Type","multipart/form-data");

СтруктураД=Новый Структура();
СтруктураД.Вставить("statusId","9");

ЗаписьJSON = Новый ЗаписьJSON;
тПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " ", Истина);
ЗаписьJSON.УстановитьСтроку(тПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON,СтруктураД,);
СтрокаJSON=ЗаписьJSON.Закрыть();


Разделитель = СтрЗаменить(Новый УникальныйИдентификатор(), "-", "");
Тело = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(Тело, , , Символы.ВК + Символы.ПС, "");
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
ЗаписьДанных.ЗаписатьСтроку(СтрокаJSON);
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--");
ЗаписьДанных.Закрыть();

ДанныеТела = Тело.ЗакрытьИПолучитьДвоичныеДанные();

Запрос = Новый HTTPЗапрос("/api-cutting-public/orders/"+IDДокумента+"/status",Заголовки);
Запрос.УстановитьТелоИзДвоичныхДанных(ДанныеТела);
Ответ=Соединение.ОтправитьДляОбработки(Запрос);
По теме из базы знаний
Найденные решения
7. user1203706 13 18.07.22 20:26 Сейчас в теме
(1) На вот, поставишь только нужный Key и нужный статус (он число, а не строка, если что, судя по api)

ЗЫ: Поправил. Так хоть возвращает что не авторизован, как и в сахаре. Втыкай свой Key в заголовок и нужный OrderId, должно работать

	ВремГраница = СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
	ТелоЗапроса = Новый ТекстовыйДокумент();
	ТелоЗапроса.РазделительСтрок = Символы.CR+Символы.LF;
	ТелоЗапроса.ДобавитьСтроку("--" + ВремГраница);
	ТелоЗапроса.ДобавитьСтроку("Content-Disposition: form-data; name=""statusId"";");
	ТелоЗапроса.ДобавитьСтроку("");
	ТелоЗапроса.ДобавитьСтроку(9);
	ТелоЗапроса.ДобавитьСтроку("--" + ВремГраница + "--");
	ТелоЗапросаСтрока = ТелоЗапроса.ПолучитьТекст();
	Заголовки=Новый Соответствие;
	Заголовки.Вставить("apiKey","test");
	Заголовки.Вставить("Content-Type","multipart/form-data; boundary=" + ВремГраница);
	HTTPЗапрос = Новый HTTPЗапрос("api-cutting-public/orders/127337/status",Заголовки);
	HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапросаСтрока, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
	Соединение = Новый HTTPСоединение("cloud.bazissoft.ru",443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
	HTTPОтвет = Соединение.Записать(HTTPЗапрос);
	Сообщить(HTTPОтвет.КодСостояния);
	Сообщить(HTTPОтвет.ПолучитьТелоКакСтроку());
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. spacecraft 18.07.22 18:12 Сейчас в теме
(1)
Ответ=Соединение.ОтправитьДляОбработки(Запрос);

ОтправитьДляОбработки это вызов POST метода. А нужен PUT. Используйте ВызватьHTTPМетод или
Соединение.Записать(Запрос).
3. user1293615 18.07.22 18:55 Сейчас в теме
5. spacecraft 18.07.22 19:32 Сейчас в теме
(3) это уже сам запрос неправильный.
Зачем json формируете? там он не принимается.
Попробуйте передавать такие же данные как и для примера curl. Т.е.

ДанныеТела = """statusId"":""9""";
9. user1293615 18.07.22 21:08 Сейчас в теме
(5)
Делал и так но все через двоичные данные.
(7) Тут взлетело.
Понимал что где то рядом но не хватало опыта
4. user1203706 13 18.07.22 19:07 Сейчас в теме
6. user1203706 13 18.07.22 19:45 Сейчас в теме
(1) boundary не указан в заголовках, раз разделитель пихаете
7. user1203706 13 18.07.22 20:26 Сейчас в теме
(1) На вот, поставишь только нужный Key и нужный статус (он число, а не строка, если что, судя по api)

ЗЫ: Поправил. Так хоть возвращает что не авторизован, как и в сахаре. Втыкай свой Key в заголовок и нужный OrderId, должно работать

	ВремГраница = СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
	ТелоЗапроса = Новый ТекстовыйДокумент();
	ТелоЗапроса.РазделительСтрок = Символы.CR+Символы.LF;
	ТелоЗапроса.ДобавитьСтроку("--" + ВремГраница);
	ТелоЗапроса.ДобавитьСтроку("Content-Disposition: form-data; name=""statusId"";");
	ТелоЗапроса.ДобавитьСтроку("");
	ТелоЗапроса.ДобавитьСтроку(9);
	ТелоЗапроса.ДобавитьСтроку("--" + ВремГраница + "--");
	ТелоЗапросаСтрока = ТелоЗапроса.ПолучитьТекст();
	Заголовки=Новый Соответствие;
	Заголовки.Вставить("apiKey","test");
	Заголовки.Вставить("Content-Type","multipart/form-data; boundary=" + ВремГраница);
	HTTPЗапрос = Новый HTTPЗапрос("api-cutting-public/orders/127337/status",Заголовки);
	HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапросаСтрока, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
	Соединение = Новый HTTPСоединение("cloud.bazissoft.ru",443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
	HTTPОтвет = Соединение.Записать(HTTPЗапрос);
	Сообщить(HTTPОтвет.КодСостояния);
	Сообщить(HTTPОтвет.ПолучитьТелоКакСтроку());
Показать
8. user1293615 18.07.22 21:03 Сейчас в теме
(7)
(7)
ВремГраница = СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
ТелоЗапроса = Новый ТекстовыйДокумент();
ТелоЗапроса.РазделительСтрок = Символы.CR+Символы.LF;
ТелоЗапроса.ДобавитьСтроку("--" + ВремГраница);
ТелоЗапроса.ДобавитьСтроку("Content-Disposition: form-data; name=""statusId"";");
ТелоЗапроса.ДобавитьСтроку("");
ТелоЗапроса.ДобавитьСтроку(9);
ТелоЗапроса.ДобавитьСтроку("--" + ВремГраница + "--");
ТелоЗапросаСтрока = ТелоЗапроса.ПолучитьТекст();
Заголовки=Новый Соответствие;
Заголовки.Вставить("apiKey","test");
Заголовки.Вставить("Content-Type","multipart/form-data; boundary=" + ВремГраница);
HTTPЗапрос = Новый HTTPЗапрос("api-cutting-public/orders/127337/status",Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапросаСтрока, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Соединение = Новый HTTPСоединение("cloud.bazissoft.ru",443,,,,,Новый ЗащищенноеСоединениеOpenSSL());
HTTPОтвет = Соединение.Записать(HTTPЗапрос);
Сообщить(HTTPОтвет.КодСостояния);
Сообщить(HTTPОтвет.ПолучитьТелоКакСтроку());
Показать

Спасибо.
Все взлетело.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот