Имя: Пароль:
1C
1С v8
1С + Wildberries + API Выгрузка остатков (/api/v3/stocks/)
0 bormanius
 
27.03.23
09:44
Добрый день.

Переделываю запросы по выгрузке остатков на АПИ 3 и не работает, прошу помощи:
Описание АПИ на вайлберриес:
https://openapi.wildberries.ru/#tag/Marketplace-Ostatki/paths/~1api~1v2~1warehouses/get


Текст модуля 1С:

Заголовки=новый Соответствие();
Заголовки.Вставить("Authorization",Токен);
Заголовки.Вставить("Content-Type","application/json");
Заголовки.Вставить("Accept","application/json");
	
SSL_Соединение=Новый ЗащищенноеСоединениеOpenSSL();
HttpСоединение=новый HttpСоединение("suppliers-api.wildberries.ru",443,,,,,SSL_Соединение);
	
Сервис="/api/v3/stocks/"+ИДскладаОЗОН_Строка+"";		  
	
МассивОстатков = Новый Массив;
Для Каждого Стр Из Остатки Цикл
   СтруктураОстаткаТовара = Новый Структура("sku, amount", СокрЛП(Стр.ВБ_Штрихкод), Стр.КВыгрузке);
   МассивОстатков.Добавить(СтруктураОстаткаТовара);
КонецЦикла;	

	
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("stocks", МассивОстатков);

ТелоЗапроса = Ozon_ОбщегоНазначенияВызовСервера.ПреобразоватьДанныеВJSON(ПараметрыЗапроса);
	
//Основной запрос
ИмяФайла = ПолучитьИмяВременногоФайла("json");

HTTPЗапрос=новый HttpЗапрос(сервис,заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(Ozon_ОбщегоНазначенияКлиентСервер.ПерекодироватьСтроку(ТелоЗапроса), КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
HttpОтвет=HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос,ИмяФайла);


На выходе получаю ошибку:
Ошибка выполнения запроса, код ошибки 400
   Код ошибки: IncorrectRequest
   Описание ошибки: Переданы некорректные данные

В чем может быть ошибка?
1 Волшебник
 
27.03.23
09:45
Запрос в Wildberries, а в тексте модуля Ozon
2 bormanius
 
27.03.23
09:47
Если вопрос про эту процедуру:
ТелоЗапроса = Ozon_ОбщегоНазначенияВызовСервера.ПреобразоватьДанныеВJSON(ПараметрыЗапроса);

То это просто преобразование в JSON:
// Функция - Преобразовать данные в JSON
Функция ПреобразоватьДанныеВJSON(Данные) Экспорт
    Результат = "";
    Попытка
        ЗаписьJSON = Новый ЗаписьJSON;
        ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " ", Истина);
        НастройкиСериализации = Новый НастройкиСериализацииJSON;
        НастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO;
        НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата;
        ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
        ЗаписатьJSON(ЗаписьJSON, Данные, НастройкиСериализации);
        Результат = ЗаписьJSON.Закрыть();
    Исключение
        Комментарий = "Не удалось записать JSON: " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
        Ozon_ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Комментарий);
    КонецПопытки;
    Возврат Результат;
КонецФункции
3 Builder
 
27.03.23
09:52
Попробуй
HTTPОтвет = Соединение.ВызватьHTTPМетод("PUT", HTTPЗапрос);
4 Builder
 
27.03.23
09:53
У WB появились PUT запросы, за этим надо следить.
5 Builder
 
27.03.23
09:55
И код успешного ответа в этом запросе 204, а не 200, как обычно :)
6 bormanius
 
27.03.23
10:09
Переписал все, без лишних процедур и переделал на запрос PUT вышло так:

    Заголовки=новый Соответствие();
    Заголовки.Вставить("Authorization",Токен);
    Заголовки.Вставить("Content-Type","application/json");
    Заголовки.Вставить("Accept","application/json");
    
    SSL_Соединение=Новый ЗащищенноеСоединениеOpenSSL();
    HttpСоединение=новый HttpСоединение("suppliers-api.wildberries.ru",443,,,,,SSL_Соединение);
    
    Сервис="/api/v3/stocks/99916662816000";          
    
        ТекстЗапроса = "{""stocks"":[{""sku"":""9991365149650"",""amount"":50}]}";
    
    ИмяФайла = ПолучитьИмяВременногоФайла("json");
    HTTPЗапрос=новый HttpЗапрос(сервис,заголовки);
    HTTPЗапрос.УстановитьТелоИзСтроки(ТекстЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод("PUT", HTTPЗапрос, ИмяФайла);
    
    Если HTTPОтвет.КодСостояния = 204 Тогда
        Сообщить ("Все удалось "+ HTTPОтвет.КодСостояния );        
    Иначе     
        Сообщить ("Ошибка выполнения запроса, код ошибки "+ HTTPОтвет.КодСостояния );        
        ЧтениеДжейсон = Новый ЧтениеJSON;
        ЧтениеДжейсон.ОткрытьФайл(ИмяФайла);
        ДанныеОтвета = ПрочитатьJSON(ЧтениеДжейсон);
        Сообщить("   Код ошибки: "+ ДанныеОтвета.code);
        Сообщить("   Описание ошибки: "+ ДанныеОтвета.message);
    КонецЕсли;

Теперь ошибка:
Ошибка выполнения запроса, код ошибки 404
   Код ошибки: NotFound
   Описание ошибки: Не найдено

Куда еще можно копать?
7 Builder
 
27.03.23
10:14
(6) Нахрена ты json в файл пихаешь?

Вот кусок рабочего кода:

    Соединение = Новый HTTPСоединение(Сервер,,,,,,Новый ЗащищенноеСоединениеOpenSSL);

    HTTPЗапрос = Новый HTTPЗапрос("PUT");
    HTTPЗапрос.АдресРесурса = URLЗапроса;
    HTTPЗапрос.Заголовки.Вставить("accept", "application/json");
    HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
    HTTPЗапрос.Заголовки.Вставить("Authorization", Токен);
    HTTPЗапрос.УстановитьТелоИзСтроки(ИтоговыйЗапрос, КодировкаТекста.UTF8,
    ИспользованиеByteOrderMark.НеИспользовать);
    
    HTTPОтвет = Соединение.ВызватьHTTPМетод("PUT", HTTPЗапрос);
8 Builder
 
27.03.23
10:19
(6) Адрес и код склада правильно задан?
Судя по ошибке 404 похоже что-то с адресом не то.
9 bormanius
 
27.03.23
10:29
Сервер = "suppliers-api.wildberries.ru";
    ИтоговыйЗапрос = "{""stocks"":[{""sku"":""9991365149650"",""amount"":50}]}";
    URLЗапроса = "/api/v3/stocks/99916662816000";
    Соединение = Новый HTTPСоединение(Сервер,,,,,,Новый ЗащищенноеСоединениеOpenSSL);

    HTTPЗапрос = Новый HTTPЗапрос("PUT");
    HTTPЗапрос.АдресРесурса = URLЗапроса;
    HTTPЗапрос.Заголовки.Вставить("accept", "application/json");
    HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
    HTTPЗапрос.Заголовки.Вставить("Authorization", Токен);
    HTTPЗапрос.УстановитьТелоИзСтроки(ИтоговыйЗапрос, КодировкаТекста.UTF8,
    ИспользованиеByteOrderMark.НеИспользовать);
    
    HTTPОтвет = Соединение.ВызватьHTTPМетод("PUT", HTTPЗапрос);

Переписал обработку - та же ошибка.
Наверное я с адресом что-то не так ввожу.
Сейчас адрес
URLЗапроса = "/api/v3/stocks/99916662816000";
Это "/api/v3/stocks/" + код склада.
Может как-то неправильно использую?
10 Builder
 
27.03.23
10:34
(9) Чет не очень похоже на код склада, у нас он пятизначный....
Проверь у себя.
11 Builder
 
27.03.23
10:38
(9) Запроси список складов через /api/v2/warehouses и посмотри там код.
12 Builder
 
27.03.23
10:41
+ к (9) Или в личном кабинете - ID склада.
13 bormanius
 
27.03.23
11:19
(12) Спасибо. Сейчас нет доступа к полному личному кабинету WB - буду ждать, когда появится.
Попробовал получить список складов через запрос, вышла ошибка 301.

    ЗаголовокHTTP = Новый Соответствие();
    ЗаголовокHTTP.Вставить("accept",         "application/json");
    ЗаголовокHTTP.Вставить("Authorization",    Токен);
  
    URLЗапроса = "/api/v2/warehouses/";
    
    HTTPЗапрос  = Новый HTTPЗапрос(URLЗапроса, ЗаголовокHTTP);    
    Соединение = Новый HTTPСоединение(Сервер,,,,,,Новый ЗащищенноеСоединениеOpenSSL);
    HTTPОтвет = Соединение.Получить(HTTPЗапрос);
    Если HTTPОтвет.КодСостояния = 200 Тогда ///Успешно получен ответ
        ДанныеОбработки = HTTPОтвет.ПолучитьТелоКакСтроку();
    КонецЕсли;
14 Builder
 
27.03.23
11:24
(13)  косую убери в конце
URLЗапроса = "/api/v2/warehouses";
15 bormanius
 
27.03.23
11:46
(14) СПАСИБО ОГРОМНОЕ.

Получилось и код склада получить и остатки обновить.