Имя: Пароль:
1C
1С v8
Помогите написать GET-запрос для получения заказов с kaspi.kz
0 Повелитель
 
13.05.24
14:50
Из инструкции к примеру запроса:

GET
https://kaspi.kz/shop/api/v2/orders?page[number]=0&page[size]=20&filter[orders][state]=NEW
&filter[orders][creationDate][$ge]=1478736000000&filter[orders][creationDate][$le]=1479945600000
&filter[orders][status]=APPROVED_BY_BANK&filter[orders][deliveryType]=PICKUP
&filter[orders][signatureRequired]=false&include[orders]=user
Content-Type:application/vnd.api+json
X-Auth-Token: <token>

где:
page[number] - Номер страницы с результатом запроса. На одной странице может быть максимум 100 заказов. Укажите номер нужной страницы, начиная с 0

page[size] - Количество заказов, которое будет на одной странице в ответе Максимум — 100

filter[orders][state] Состояние заказа: NEW, SIGN_REQUIRED, PICKUP, DELIVERY, KASPI_DELIVERY,ARCHIVE

filter[orders][creationDate] Дата создания заказа. Указывается в миллисекундах. [$ge] начальное значение, [$le] конечное значение

filter[orders][status] Статус заказа: APPROVED_BY_BANK, ACCEPTED_BY_MERCHANT, COMPLETED, CANCELLED, CANCELLING, KASPI_DELIVERY_RETURN_REQUESTED, RETURNED

filter[orders][deliveryType] Способ доставки. Используйте, только если filter[orders][state] не равен PICKUP DELIVERY, KASPI_DELIVERY или PICKUP

filter[orders][signatureRequired] Подписание документов Используйте, если filter[orders][state] не равен SIGN_REQUIRED

include[orders] Дополнительные данные о заказе. user Информация о покупателе, который оформил заказ



//////////////////////////////////////////////////////////
МОЙ КОД:
Для простоты хочу получить последние 100 заказов, без учета статусов, состояний и прочего.

Соединение = Новый HTTPСоединение("kaspi.kz",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
	
запросGET = Новый HTTPЗапрос("shop/api/v2/orders?page[number]=0&page[size]=100&filter[orders][creationDate][$ge]=1478736000000&filter[orders][creationDate][$le]=1479945600000");
	
запросGET.Заголовки.Вставить("Content-Type", "application/vnd.api+json");
запросGET.Заголовки.Вставить("X-Auth-Token", "мой токен");
	
//запросGET.УстановитьТелоИзСтроки(ТелоЗапроса);
Ответ = Соединение.ОтправитьДляОбработки(запросGET);


Получаю ответ 400, а должен быть 200.

Подскажите как правильно составить такой GET запрос?
И мне не очень понятно, как работать с параметрами [$ge] начальное значение, [$le] конечное значение. Ни разу не сталкивался.
1 realptrm
 
13.05.24
14:58
запросGET = Новый HTTPЗапрос("/shop/api/v2/orders?page[number]=0&page[size]=100&filter[orders][creationDate][$ge]=1478736000000&filter[orders][creationDate][$le]=1479945600000");

Слеш забыл

$ge, $le ТекущаяУниверсальнаяДатаВМиллисекундах()
2 asady
 
13.05.24
14:57
Заголовки  = Новый соответствие;
Заголовки.Вставить("content-type","application/json");
Заголовки.Вставить("X-Auth-Token", "мой токен");
запросGET = Новый HTTPЗапрос("shop/api/v2/orders?page[XMLString(number)]=0&page[size]=100&filter[orders][creationDate][$ge]=1478736000000&filter[orders][creationDate][$le]=1479945600000"
,заголовки);
    

Ответ = Соединение.Получить(запросGET);
3 Повелитель
 
13.05.24
14:58
(1) Не помогло, так же ответ 400
4 asady
 
13.05.24
14:59
Новый HTTPЗапрос("shop/api/v2/orders?page[number]=0&page[size]=100&filter[orders][creationDate][$ge]=1478736000000&filter[orders][creationDate][$le]=1479945600000"
,заголовки);

xmLString -не нужен
5 asady
 
13.05.24
15:00
ты вместо GET посылаешь POST
7 Повелитель
 
13.05.24
15:07
(5) Переделал:

Заголовки  = Новый соответствие;
	Заголовки.Вставить("Content-Type","application/vnd.api+json");
	Заголовки.Вставить("X-Auth-Token", "мой токен");
	
	Соединение = Новый HTTPСоединение("kaspi.kz",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
	
	запросGET = Новый HTTPЗапрос("/shop/api/v2/orders?page[number]=0&page[size]=100&filter[orders][creationDate][$ge]=1478736000000&filter[orders][creationDate][$le]=1479945600000",Заголовки);
	Ответ = Соединение.Получить(запросGET);


Пока так же, ответ 400
8 realptrm
 
13.05.24
15:11
Попробуй
/shop/api/v2/orders?page[number]=0&page[size]=50&filter[orders][creationDate][$ge]=1715000000000&filter[orders][creationDate][$le]=1716000000000
9 Повелитель
 
13.05.24
15:14
(8) Проверил:

Заголовки  = Новый соответствие;
	Заголовки.Вставить("Content-Type","application/vnd.api+json");
	Заголовки.Вставить("X-Auth-Token", "мой токен");
	
	Соединение = Новый HTTPСоединение("kaspi.kz",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
	
	запросGET = Новый HTTPЗапрос("shop/api/v2/orders?page[number]=0&page[size]=50&filter[orders][creationDate][$ge]=1715000000000&filter[orders][creationDate][$le]=1716000000000",Заголовки);
	Ответ = Соединение.Получить(запросGET);


Пока так же, ответ 400
10 asady
 
13.05.24
15:16
(7) вот работающий пример с их сайта
GET
https://kaspi.kz/shop/api/v2/orders?page[number]=0&page[size]=20&filter[orders][state]=NEW
&filter[orders][creationDate][$ge]=1478736000000&filter[orders][creationDate][$le]=1479945600000
&filter[orders][status]=APPROVED_BY_BANK&filter[orders][deliveryType]=PICKUP
&filter[orders][signatureRequired]=false&include[orders]=user
Content-Type:application/vnd.api+json
X-Auth-Token: <token>

отправь для начала такой же - но со своим токеном - через POSTMAN например
11 Philix
 
13.05.24
15:24
(9) Шальная мысль: А в теле ответа нет причины отказа? Потому что в ответ на неавторизованный запрос я получаю достаточно развернутый ответ о необходимости авторизации. Разработчики на этом этапе слова не экономили.
12 Повелитель
 
13.05.24
15:32
(10) Вроде бы работает:
https://disk.yandex.com/i/Fw8MOpn7cpFmYg
13 Повелитель
 
13.05.24
15:33
(11) Я свой токен не выкладывал, может из-за этого
14 Повелитель
 
13.05.24
15:37
Запихал запрос целиком:

Заголовки  = Новый соответствие;
	Заголовки.Вставить("Content-Type","application/vnd.api+json");
	Заголовки.Вставить("X-Auth-Token", "мой токен");
	
	Соединение = Новый HTTPСоединение("kaspi.kz",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
	
	запросGET = Новый HTTPЗапрос("/shop/api/v2/orders?page[number]=0&page[size]=50&filter[orders][creationDate][$ge]=1715000000000&filter[orders][creationDate][$le]=1716000000000&filter[orders][status]=APPROVED_BY_BANK&filter[orders][deliveryType]=PICKUP&filter[orders][signatureRequired]=false&include[orders]=user",Заголовки);
	Ответ = Соединение.Получить(запросGET);


Ответ, так же 400.
15 realptrm
 
13.05.24
15:39
Сообщить(Ответ.ПолучитьТелоКакСтроку());
16 Повелитель
 
13.05.24
15:42
(15) {"errors":[{"status":"400","title":"Request parameters error","detail":"For input string: \"10\n\""}]}
17 realptrm
 
13.05.24
15:45
/shop/api/v2/orders?page[number]=0&page[size]=20
без фильтров попробуй
18 Повелитель
 
13.05.24
15:47
(17)
Заголовки  = Новый соответствие;
	Заголовки.Вставить("Content-Type","application/vnd.api+json");
	Заголовки.Вставить("X-Auth-Token", "мой токен");
	
	Соединение = Новый HTTPСоединение("kaspi.kz",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
	
	запросGET = Новый HTTPЗапрос("shop/api/v2/orders?page[number]=0&page[size]=20
	//|&filter[orders][creationDate][$ge]=1715000000000&filter[orders][creationDate][$le]=1716000000000
	//|&filter[orders][status]=APPROVED_BY_BANK
	//|&filter[orders][deliveryType]=PICKUP
	//|&filter[orders][signatureRequired]=false
	//|&include[orders]=user
	|",Заголовки);
	Ответ = Соединение.Получить(запросGET);

	Сообщить(Ответ.ПолучитьТелоКакСтроку());


Так же:
{"errors":[{"status":"400","title":"Request parameters error","detail":"For input string: \"20\n\""}]}
19 Повелитель
 
13.05.24
15:50
Вот тут добавил двоеточие:

Заголовки.Вставить("Content-Type:","application/vnd.api+json");
Заголовки.Вставить("X-Auth-Token:", "мой токен")

Ошибка вот такая стала:
{"message":"Full authentication is required to access this resource.", "access-denied":true, "cause":"NOT AUTHENTICATED"}

Значит до этого авторизацию проходило.
20 realptrm
 
13.05.24
15:53
21 asady
 
13.05.24
15:56
текстзапроса = "%2Fshop%2Fapi%2Fv2%2Forders%3Fpage%5Bnumber%5D%3D0%26page%5Bsize%5D%3D50%26filter%5Borders%5D%5BcreationDate%5D%5B%24ge%5D%3D1715000000000%26filter%5Borders%5D%5BcreationDate%5D%5B%24le%5D%3D1716000000000%26filter%5Borders%5D%5Bstatus%5D%3DAPPROVED_BY_BANK%26filter%5Borders%5D%5BdeliveryType%5D%3DPICKUP%26filter%5Borders%5D%5BsignatureRequired%5D%3Dfalse%26include%5Borders%5D%3Duser";
запросGET = Новый HTTPЗапрос(текстзапроса,Заголовки);
22 Повелитель
 
13.05.24
15:57
Через posmtan И без параметров статус = 200

https://disk.yandex.com/i/jC67T5scXeNEVQ

Но почему-то обязательно нужно указать GET, красным выделил, без этого не работает. Хотя слева и так тип GET выбран.

Может  и в 1с нужно где-то GET прописать?
23 Повелитель
 
13.05.24
15:58
(20) Спасибо, буду пробовать
24 asady
 
13.05.24
15:58
ТС попробуй текст запроса  с экранированием спецсимволов (21)
25 Ёпрст
 
13.05.24
15:59
(22) Получить это и есть GET
26 Повелитель
 
13.05.24
16:00
(21) Сообщить ничего не возвращает, но отладчиком ответ = 302
27 Повелитель
 
13.05.24
16:01
(24) ок
(25) понял
28 asady
 
13.05.24
16:03
(26) поиграй с кодированием/декодированием url
https://meyerweb.com/eric/tools/dencoder/
29 Philix
 
13.05.24
19:13
(18) Мэтр, разделитель строк убирайте, который |. Кавычку и точку с запятой сразу за 20. Он мешает в запросе и добавляет перевод строки (Код символа 10).
30 Волшебник
 
13.05.24
19:15
(29) Интересная мысль!
31 Philix
 
13.05.24
19:26
(30) Сам в шоке. На 20-м году разработки в 1С такие новости для себя открывать :)

Стр1 = "Строка1
|Строка2";
Сообщить(Стр1);    
Сообщить(КодСимвола(Сред(Стр1,8,1)));
32 Волшебник
 
13.05.24
19:22
(31) Мы, 1С-ники, высшее трофическое звено программистов, стали как-то забывать основы, что там ниже всё сериализуется в коды символов...
33 Ёпрст
 
13.05.24
19:44
(31) см. (14) и (16).
34 Волшебник
 
13.05.24
19:49
Там ещё бывают 4-байтовые символы... Ну это просто я зажигаю
35 Philix
 
13.05.24
19:59
(33) Мэтр, есть подозрение, что это два разных этапа отладки. В запросе в (14) нет строки 10, упомянутой в (16) и текст ошибки там скорее всего был каким-то другим, либо наш коллега слега подчистил код перед публикацией. В любом случае, автор нашел тело ответа, в котором есть сообщение об ошибке и завтра он обречен на успех :)
36 Волшебник
 
13.05.24
20:02
(35) Не совсем так... Вы ошиблись
37 Повелитель
 
14.05.24
08:27
Всем спасибо.
Помог пример из (20).

РЕШЕНИЕ НАЙДЕНО, РАБОЧИЙ КОД:

ТекДата = ТекущаяДата();
ИсхДата = Дата(1970, 1, 1);
ДатаВМил = (ТекДата - ИсхДата) * 1000;
ДатаВМилСтрока = Формат(ДатаВМил,"ЧГ=");
ДатаВмилНачало = ДатаВМил - 600 * 1000 * 100;
ДатаВМилНачалоСтрока = Формат(ДатаВмилНачало,"ЧГ=");
    
    
Заголовки  = Новый Соответствие;
Заголовки.Вставить("Content-Type","application/vnd.api+json");
Заголовки.Вставить("X-Auth-Token", "мой токен");
HTTP = Новый HTTPСоединение("kaspi.kz",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/shop/api/v2/orders?page[number]=0&page[size]=20&filter[orders][state]=NEW&filter[orders][creationDate][$ge]=" +
ДатаВМилНачалоСтрока + "&filter[orders][creationDate][$le]=" + ДатаВМилСтрока + "&filter[orders][status]=APPROVED_BY_BANK&include[orders]=user", Заголовки);
    
Результат = HTTP.Получить(Запрос);
Сообщить(Результат.КодСостояния);



Можно сказать, что верно всё было, отличия было только в параметре "&filter[orders][state]=NEW" у меня в запросе его ранее не было.

Дата в миллисекундах это конечно прикольно, первый раз такой формат вижу, очень странный. Взять и просто разницу дат на 1000 умножить, мда. Никогда бы не догадался.
38 Ёпрст
 
14.05.24
10:47
(37) вот эти 3 параметра вроде как обязательные у них при запросе заказов:
state
creationDate
status
39 novichok79
 
14.05.24
11:31
Может быть, я сейчас перегибаю, но типа это целую тему завели, чтобы выяснить как query parameters добавить в строку запроса? Серьезно типа?
Я забыл, в 1С нету же платформенных методов, чтобы красиво экранировать query parameters?


А все, вижу выше. Проблема решена.
40 ttk
 
14.05.24
11:35
(39)
Вроде нету, но можно самому быстро запилить, что б строка собиралась из соответствия например
41 novichok79
 
14.05.24
11:35
(40) был кажется какой-то коннектор или что-то такое на ИС.
42 Philix
 
14.05.24
12:20