Первые шаги AIP Wilberries

1. SnakePlisskin 3 03.06.24 11:25 Сейчас в теме
Доброго дня!
Делаю первые шаги по работе с WB, ранее не имел такого опыта. Для начала хотел получить список номенклатуры который имеется на WB.

	HTTPЗапрос = Новый HTTPЗапрос();
	HTTPЗапрос.АдресРесурса = "api/v2/get/cards/list";
	HTTPЗапрос.Заголовки.Вставить("Authorization", адWildberriesКлючДляРаботыСAPI);
	HTTPСоединение = Новый HTTPСоединение("suppliers-api.wildberries.ru",,,,,5,Новый ЗащищенноеСоединениеOpenSSL());
	СервераОтвет = HTTPСоединение.Получить(HTTPЗапрос);
	ОтветSRV = СервераОтвет.ПолучитьТелоКакСтроку();
	КодSRV = СервераОтвет.КодСостояния;
Показать


Собственно в этой строке (HTTPЗапрос.АдресРесурса = "api/v2/get/cards/list";) использовал различные вариации на все ответ 404.

Как правильно получить список номенклатуры ?
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. maks_20 169 03.06.24 11:36 Сейчас в теме
А токен рабочий точно?
5. SnakePlisskin 3 03.06.24 11:44 Сейчас в теме
(2) рабочий, делал расшифровку на сайте WB. Правда только на чтение сделан.
6. maks_20 169 03.06.24 11:53 Сейчас в теме
(5) Судя по описанию https://openapi.wildberries.ru/content/api/ru/#tag/Prosmotr/paths/~1content~1v2~1get~1cards~1list/post
запрос должен быть к /content/v2/get/cards/list и в него нужно дополнительно передать параметры
в виде json строки:
{
"settings": {
"cursor": {
"limit": 100
},
"filter": {
"withPhoto": -1
}
}
}
8. SnakePlisskin 3 03.06.24 13:25 Сейчас в теме
(6)а как это правильно сделать, передавал просто строкой, не работает, делал вот так :
	Запись = Новый ЗаписьJSON;
	Запись.УстановитьСтроку();
	Запись.ЗаписатьЗначение("{ ""settings"": { ""cursor"": { ""limit"": 100 }, ""filter"": { ""withPhoto"": -1 } } }");
	СтрокаJSON = Запись.Закрыть();	
	HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON);


тоже не работает
9. user620512 03.06.24 13:59 Сейчас в теме
(8) а ты результат смотрел что у тебя в СтрокаJSON получилось?
Если в таком виде то просто передавай как строку

СтрокаJSON = "{ ""settings"": { ""cursor"": { ""limit"": 100 }, ""filter"": { ""withPhoto"": -1 } } }";
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON);


Если хочешь использовать ЗаписьJSON то написать можно вот так

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
	
Курсор = Новый Структура;
Курсор.Вставить("limit", 100);
	
Фильтр = Новый Структура;
Фильтр.Вставить("withPhoto", -1);
	
Стр = Новый Структура;
Стр.Вставить("cursor", Курсор);
Стр.Вставить("filter", Фильтр); 
	
СтруктураИтоговая = Новый Структура; 
СтруктураИтоговая.Вставить("settings", Стр);
	
ЗаписатьJSON(ЗаписьJSON, СтруктураИтоговая);
СтрокаJSON = ЗаписьJSON.Закрыть()
Показать
10. SnakePlisskin 3 03.06.24 15:09 Сейчас в теме
(9)
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();

Курсор = Новый Структура;
Курсор.Вставить("limit", 100);

Фильтр = Новый Структура;
Фильтр.Вставить("withPhoto", -1);

Стр = Новый Структура;
Стр.Вставить("cursor", Курсор);
Стр.Вставить("filter", Фильтр);

СтруктураИтоговая = Новый Структура;
СтруктураИтоговая.Вставить("settings", Стр);

ЗаписатьJSON(ЗаписьJSON, СтруктураИтоговая);
СтрокаJSON = ЗаписьJSON.Закрыть()
Показать


Попробовал обоими способами, ошибка одна и та же 405
12. user620512 04.06.24 11:49 Сейчас в теме
(10) Судя по описанию надо использовать POST, а не GET
Поэтому попробуй не "HTTPСоединение.Получить" а "HTTPСоединение.ОтправитьДляОбработки"
14. user1619761 02.08.24 17:03 Сейчас в теме
(1)
ИмяМетода = "content/v2/get/cards/list";    
	
	Смещение = 0;
	СтрокНаЗапрос = 100; 
	
	Лимит = 100;
	
	ИспользоватьХарактеристики = ПолучитьФункциональнуюОпцию("ИспользоватьХарактеристикиНоменклатуры");
	
	ДанныеКарточек = Новый ТаблицаЗначений;
	ДопДанныеКарточек = Новый ТаблицаЗначений;
	
	ЗаполнитьСтруктуруТаблицКарточки(ДанныеКарточек, ДопДанныеКарточек, ИспользоватьХарактеристики);
	
	СтруктураЗапроса = ЗаполнитьСтруктуруПараметровЗапросаCardListОбновленная(СтрокНаЗапрос);
	
	Результат = ВыполнитьМетодAPI("POST", СтруктураЗапроса, ИмяМетода, СтруктураВозврата, ПараметрыВыполнения);

Функция ЗаполнитьСтруктуруПараметровЗапросаCardListОбновленная(СтрокНаЗапрос, БарКод = Неопределено)
	
	СтруктураЗапроса = Новый Структура;	
	СтрЗапроса = Новый Структура;
	
	Курсор = Новый Структура;
	Курсор.Вставить("limit",  СтрокНаЗапрос);
	
	СтрЗапроса.Вставить("cursor", Курсор);
	
	Фильтр = Новый Структура;
	Фильтр.Вставить("withPhoto", -1);
	//Фильтр.Вставить("textSearch", "");
	
	СтрЗапроса.Вставить("filter", Фильтр);
	
	Сорт = Новый Структура("sortColumn,ascending","updateAt",Ложь);
	
	СтрЗапроса.Вставить("settings",Сорт);
	
	СтруктураЗапроса.Вставить("settings", СтрЗапроса);
	
	Возврат СтруктураЗапроса;

	
КонецФункции

Функция ВыполнитьМетодAPI(Метод, ПараметрыЗапроса, ИмяМетода, СтруктураВозврата, ПараметрыВыполнения, 
							URL = Неопределено, ВерсияAPI = 2, ПараметрыЗаписиJSON = Неопределено, ЭтоСтатистика = ЛОжь) Экспорт
	Если НЕ ОтказатьВДействии().Ответ.Получить("available") Тогда
		СтруктураВозврата.Вставить("ОтправляемоеСообщение", "Ошибка получения данных. Свяжитесь с разработчиком расширения");
		СтруктураВозврата.Вставить("Ошибка", Истина);                                        
		Возврат НЕ СтруктураВозврата.Ошибка;
	КонецЕсли;

	URLМаркета(URL, ИмяМетода, ПараметрыВыполнения.ТестовыйРежим);
	
	Заголовки = КоннекторHTTPПереопределяемый.ПолучитьЗаголовокиПодключения("json", "json");
	
	Если ВерсияAPI = 2 тогда
		Если ПустаяСтрока(ПараметрыВыполнения.ТокенAPI) тогда
			СтруктураВозврата.Вставить("ОтправляемоеСообщение", "Не заполнен Токен учетной записи.");
			СтруктураВозврата.Вставить("Ошибка", Истина);
		Конецесли;
		Заголовки.Вставить("Authorization", ?(НЕ ЭтоСтатистика,СокрЛП(ПараметрыВыполнения.ТокенAPI),ПараметрыВыполнения.ТокенСтатистики));
	Иначе
		Если ПустаяСтрока(ПараметрыВыполнения.ТокенAPIv1) тогда
			СтруктураВозврата.Вставить("ОтправляемоеСообщение", "Не заполнен Токен учетной записи.");
			СтруктураВозврата.Вставить("Ошибка", Истина);
		Конецесли;
		Заголовки.Вставить("X-Auth-Token", СокрЛП(ПараметрыВыполнения.ТокенAPIv1));
	Конецесли;
	
	ДополнительныеПараметры = Новый Структура("Заголовки, ПараметрыВыполнения, ПараметрыЗаписиJSON", Заголовки, ПараметрыВыполнения, ПараметрыЗаписиJSON);
	
	Если ТипЗнч(ПараметрыЗапроса) = Тип("Структура") тогда
		ПараметрыЗапросаОтправляемые = Новый Соответствие;
		Если ЗначениеЗаполнено(ПараметрыЗапроса) Тогда
			Для Каждого КИЗ из ПараметрыЗапроса Цикл
				Если ТипЗнч(КИЗ.Значение) = Тип("Число") Тогда
					ПараметрыЗапросаОтправляемые.Вставить(КИЗ.Ключ, Формат(КИЗ.Значение,"ЧРД=.; ЧГ=; ЧН="));	
				Иначе			
					ПараметрыЗапросаОтправляемые.Вставить(КИЗ.Ключ, КИЗ.Значение);
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	Иначе
		ПараметрыЗапросаОтправляемые = ПараметрыЗапроса;
	КонецЕсли;
	
	Попытка
	
		Если Метод = "POST" тогда
			РезультатЧтения = КоннекторHTTP.PostJson(URL, ПараметрыЗапросаОтправляемые, ДополнительныеПараметры);
		ИначеЕсли Метод = "GET" тогда
			РезультатЧтения = КоннекторHTTP.GetJson(URL, ПараметрыЗапросаОтправляемые, ДополнительныеПараметры);
		ИначеЕсли Метод = "PUT" тогда
			РезультатЧтения = КоннекторHTTP.PutJson(URL, ПараметрыЗапросаОтправляемые, ДополнительныеПараметры);
		ИначеЕсли Метод = "DELETE" тогда
			РезультатЧтения = КоннекторHTTP.DeleteJson(URL, ПараметрыЗапросаОтправляемые, ДополнительныеПараметры);
		ИначеЕсли Метод = "PATCH" тогда
			РезультатЧтения = КоннекторHTTP.PatchJson(URL, ПараметрыЗапросаОтправляемые, ДополнительныеПараметры);
		Конецесли;
		
		СтруктураВозврата.Вставить("РезультатЧтения", РезультатЧтения);
		
		Если РезультатЧтения <> Неопределено 
			И ТипЗнч(РезультатЧтения) = Тип("Соответствие") 
			И РезультатЧтения.Получить("error") <> Неопределено тогда
			
				Если ТипЗнч(РезультатЧтения["error"]) = Тип("Булево")
				И РезультатЧтения["error"] = Истина тогда
				Если РезультатЧтения.Получить("errorText") <> Неопределено тогда
					ОтправляемоеСообщение = "Неверный код ответа на запрос "+ИмяМетода+": "+РезультатЧтения["errorText"]+". ";
				Иначе
					ОтправляемоеСообщение = "Неверный код ответа на запрос "+ИмяМетода+". ";
				Конецесли;
				Если РезультатЧтения.Получить("data") <> Неопределено
					И ТипЗнч(РезультатЧтения["data"]) = Тип("Массив") тогда
					Если РезультатЧтения["data"].Количество() > 0 тогда
						ОтправляемоеСообщение = ОтправляемоеСообщение + "Ошибки: ";
						Для каждого Error из РезультатЧтения["data"] Цикл
							ОтправляемоеСообщение = ОтправляемоеСообщение + Error + ",";
						КонецЦикла;
					Конецесли;
				Конецесли;
				ОтправляемоеСообщение = Лев(ОтправляемоеСообщение, СтрДлина(ОтправляемоеСообщение)-1);
				СтруктураВозврата.Вставить("ОтправляемоеСообщение", ОтправляемоеСообщение);
			ИначеЕсли РезультатЧтения.Получить("error") <> Неопределено
				И ТипЗнч(РезультатЧтения["error"]) = Тип("Булево")
				И РезультатЧтения["error"] = Ложь тогда
				Возврат НЕ СтруктураВозврата.Ошибка;
			ИначеЕсли РезультатЧтения.Получить("error") <> Неопределено
				И ТипЗнч(РезультатЧтения["error"]) = Тип("Соответствие") тогда
				СтруктураВозврата.Вставить("ОтправляемоеСообщение", "Неверный код ответа на запрос "+ИмяМетода+": Код="+РезультатЧтения["error"]["code"]+", "+РезультатЧтения["error"]["message"]);
			ИначеЕсли РезультатЧтения.Получить("error") <> Неопределено
				И ТипЗнч(РезультатЧтения["error"]) = Тип("Строка") тогда
				СтруктураВозврата.Вставить("ОтправляемоеСообщение", "Неверный код ответа на запрос "+ИмяМетода+": "+РезультатЧтения["error"]);
			ИначеЕсли НЕ РезультатЧтения.Получить("errors") = Неопределено тогда
				ОтправляемоеСообщение = "Неверный код ответа на запрос "+ИмяМетода+": ";
				Для каждого Error из РезультатЧтения["errors"] Цикл
					ОтправляемоеСообщение = ОтправляемоеСообщение + Error + ",";
				КонецЦикла;
				ОтправляемоеСообщение = Лев(ОтправляемоеСообщение, СтрДлина(ОтправляемоеСообщение)-1);
				СтруктураВозврата.Вставить("ОтправляемоеСообщение", ОтправляемоеСообщение);
			Иначе
				СтруктураВозврата.Вставить("ОтправляемоеСообщение", "Неверный код ответа на запрос "+ИмяМетода);
			Конецесли;
			СтруктураВозврата.Вставить("Ошибка", Истина);
			
		Конецесли;
		
	Исключение
		СтруктураВозврата.Вставить("ОтправляемоеСообщение", "Нет ответа от "+URL+": "+ОписаниеОшибки());
		СтруктураВозврата.Вставить("Ошибка", Истина);
	КонецПопытки;
	
	Возврат НЕ СтруктураВозврата.Ошибка;
	
КонецФункции

Функция GetJson(URL, ПараметрыЗапроса = Неопределено, ДополнительныеПараметры = Неопределено, Сессия = Неопределено) Экспорт

	ТекущаяСессия = ?(Сессия = Неопределено, СоздатьСессию(), Сессия);
	ЗаполнитьДополнительныеДанные(ДополнительныеПараметры, ПараметрыЗапроса, Неопределено, Неопределено);
	ПараметрыПреобразованияJSON = 
		ВыбратьЗначение(Неопределено, ДополнительныеПараметры, "ПараметрыПреобразованияJSON", Неопределено);
	Возврат КакJson(ВызватьHTTPМетод(ТекущаяСессия, "GET", URL, ДополнительныеПараметры), ПараметрыПреобразованияJSON);
	
КонецФункции

Процедура ЗаполнитьДополнительныеДанные(ДополнительныеПараметры, ПараметрыЗапроса, Данные, Json) Экспорт

	Если ДополнительныеПараметры = Неопределено Тогда
		ДополнительныеПараметры = Новый Структура();
	КонецЕсли;
	Если Не ДополнительныеПараметры.Свойство("ПараметрыЗапроса") Тогда
		ДополнительныеПараметры.Вставить("ПараметрыЗапроса", ПараметрыЗапроса);
	КонецЕсли;
	Если Не ДополнительныеПараметры.Свойство("Данные") Тогда
		ДополнительныеПараметры.Вставить("Данные", Данные);
	КонецЕсли;
	Если Не ДополнительныеПараметры.Свойство("Json") Тогда
		ДополнительныеПараметры.Вставить("Json", Json);
	КонецЕсли;

КонецПроцедуры

Функция КакJson(Ответ, ПараметрыПреобразованияJSON = Неопределено) Экспорт
	
	Возврат JsonВОбъект(РаспаковатьОтвет(Ответ), Ответ.Кодировка, ПараметрыПреобразованияJSON);
	
КонецФункции

Функция ВызватьHTTPМетод(Сессия, Метод, URL, ДополнительныеПараметры) Экспорт
	
	КодыСостоянияHTTP = КодыСостоянияHTTP();
	
	ПодготовленныйЗапрос = ПодготовитьЗапрос(Сессия, Метод, URL, ДополнительныеПараметры);
	
	НастройкиПодключения = ПолучитьНастройкиПодключения(Метод, URL, ДополнительныеПараметры);
	
	Ответ = ОтправитьЗапрос(Сессия, ПодготовленныйЗапрос, НастройкиПодключения);
	
	Перенаправление = 0;
	Пока Перенаправление < Сессия.МаксимальноеКоличествоПеренаправлений Цикл
		Если Не НастройкиПодключения.РазрешитьПеренаправление ИЛИ Не Ответ.ЭтоРедирект Тогда
			Если ДополнительныеПараметры.ПараметрыВыполнения.ПроизводитьЛогированиеОпераций тогда
				ОбщийМодульСервер.ЗаписатьДанныеВЛог(?(ПодготовленныйЗапрос.Свойство("СтрокаЗапроса"),ПодготовленныйЗапрос.СтрокаЗапроса, ""),
				КакТекст(Ответ), URL, ДополнительныеПараметры.ПараметрыВыполнения.УчетнаяЗаписьМаркетплейс);
			Конецесли;
			Возврат Ответ;
		КонецЕсли;
		
		НовыйURL = СформироватьНовыйURLПриПеренаправлении(Ответ);

		ПодготовленныйЗапрос.URL = КодироватьСтроку(НовыйURL, СпособКодированияСтроки.URLВКодировкеURL);
		НовыйHTTPЗапрос = Новый HTTPЗапрос(СобратьАдресРесурса(РазобратьURL(НовыйURL), Неопределено));
		ПереопределитьМетод(ПодготовленныйЗапрос, Ответ);
			
		Если Ответ.КодСостояния <> КодыСостоянияHTTP.ВременноеПеренаправление_307 
			И Ответ.КодСостояния <> КодыСостоянияHTTP.ПостоянноеПеренаправление_308 Тогда
			УдалитьЗаголовки(ПодготовленныйЗапрос.Заголовки, "content-length,content-type,transfer-encoding");
			НовыйHTTPЗапрос.Заголовки = ПодготовленныйЗапрос.Заголовки;
		Иначе
			ИсходныйПоток = ПодготовленныйЗапрос.HTTPЗапрос.ПолучитьТелоКакПоток();
			ИсходныйПоток.КопироватьВ(НовыйHTTPЗапрос.ПолучитьТелоКакПоток());
		КонецЕсли;
		ПодготовленныйЗапрос.HTTPЗапрос = НовыйHTTPЗапрос;
		УдалитьЗаголовки(ПодготовленныйЗапрос.Заголовки, "cookies");

		ПодготовленныйЗапрос.Cookies = ОбъединитьCookies(Сессия.Cookies, ПодготовленныйЗапрос.Cookies);
		ПодготовитьCookies(ПодготовленныйЗапрос);
		
		
		Ответ = ОтправитьЗапрос(Сессия, ПодготовленныйЗапрос, НастройкиПодключения);
		
		Перенаправление = Перенаправление + 1;
	КонецЦикла;
	
	ВызватьИсключение("СлишкомМногоПеренаправлений");
	
КонецФункции


Показать
3. user620512 03.06.24 11:38 Сейчас в теме
А так?
HTTPЗапрос.АдресРесурса = "/content/v2/get/cards/list"
4. SnakePlisskin 3 03.06.24 11:40 Сейчас в теме
(3)
/content/v2/get/cards/list

Так ошибка 405
7. user620512 03.06.24 12:01 Сейчас в теме
(4) уже лучше, верно в (6) советует, вам надо выполнить POST с json строкой, которую поместить в

HTTPЗапрос.УстановитьТелоИзСтроки(JSONстрока);
13. Xershi 1555 02.08.24 15:28 Сейчас в теме
(4) до смешного дошло, лишний слеш был=))
11. igor63 03.06.24 17:23 Сейчас в теме
https://github.com/cpr1c/tools_ui_1c
Тут нашел для себя консоль HTTP запросов. Удобный инструмент
Оставьте свое сообщение

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