Имя: Пароль:
1C
1С v8
Post запрос не получается
0 Gector
 
02.02.21
21:34
Всем здравствуйте. Нужна помощь в POST запросе.
Отправляю запрос с POSTMAN все проходит, по API создается заказ, вот скрин запроса  https://yadi.sk/i/ar9Ypv3nULnKBw
Всего 3 параметра в POST запросе

В 1с не получается реализовать, код ответа 200 приходит, но заказ не создается

В ответе приходит
"Customer email cannot be empty"
"Product names cannot be empty"

Много чего пробовал, прежде чем сюда написать

Платформа 8.3.16

Вот мой код

&НаСервере
Процедура Команда1НаСервере()

    ПараметрыAPI = Новый Структура;
    ПараметрыAPI.Вставить("rpsKey", КлючAPI);
    ПараметрыAPI.Вставить("customer_email", "test@mail.ru");
    ПараметрыAPI.Вставить("product_names", "BP1C");
    
    
    HTTPСоединение = Новый HTTPСоединение("uchi.justclick.ru", , , , , , Новый ЗащищенноеСоединениеOpenSSL);
    
    // POST
    HTTPЗапрос = Новый HTTPЗапрос("/api/createorder");
    //
    HTTPЗапрос.Заголовки.Вставить("Content-type", "application/x-www-form-urlencoded");
    
    
        
    HTTPЗапрос.УстановитьТелоИзСтроки(ПараметрыAPI,КодировкаТекста.UTF8);
    
    //HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод("POST",HTTPЗапрос);
    
    
    Если HTTPОтвет.КодСостояния <> 200 Тогда
        РезультатМетода = "Ошибка выполнения http запроса. Код состояния - "
                        + HTTPОтвет.КодСостояния;
    
    КонецЕсли;
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку());

    //
    Структура = ПрочитатьJSON(ЧтениеJSON);
    
    //
    ЧтениеJSON.Закрыть();
КонецПроцедуры
1 Asmody
 
02.02.21
21:38
Давно УстановитьТелоИзСтроки() понимает структуру на входе?
2 Ёпрст
 
гуру
02.02.21
21:45
(0) зачем делать отправить для обработки и потом следом пост? Ну и параметры..тупо воткни в метод хттпзапрос, тупо строкой ?вася=федя&....
3 Asmody
 
02.02.21
21:46
(2) там закомментарено. Много чего пробовал же!
4 Gector
 
02.02.21
21:59
(1) сорри поправил код, в торопях вставлял

&НаСервере
Процедура Команда1НаСервере()
    ПараметрыAPI = Новый Структура;
    ПараметрыAPI.Вставить("rpsKey", КлючAPI);
    ПараметрыAPI.Вставить("customer_email", "test@mail.ru");
    ПараметрыAPI.Вставить("product_names", "BP1C");
    
    МассивПараметров = Новый Массив;
    Для Каждого Пара Из ПараметрыAPI Цикл
        МассивПараметров.Добавить(Пара.Ключ + "=" + Пара.Значение);    
    КонецЦикла;
    
    //
    СтрокаПараметров = СтрСоединить(МассивПараметров, "&");

    
    HTTPСоединение = Новый HTTPСоединение("uchi.justclick.ru", , , , , , Новый ЗащищенноеСоединениеOpenSSL);
    
    // POST
    HTTPЗапрос = Новый HTTPЗапрос("/api/createorder");
    //
    HTTPЗапрос.Заголовки.Вставить("Content-type", "application/x-www-form-urlencoded");
    
    
    
    HTTPЗапрос.УстановитьТелоИзСтроки("&" + СтрокаПараметров,КодировкаТекста.UTF8);
    
    //HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод("POST",HTTPЗапрос);
    
    
    Если HTTPОтвет.КодСостояния <> 200 Тогда
        РезультатМетода = "Ошибка выполнения http запроса. Код состояния - "
                        + HTTPОтвет.КодСостояния;
    
    КонецЕсли;
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку());

    //
    Структура = ПрочитатьJSON(ЧтениеJSON);
    
    //
    ЧтениеJSON.Закрыть();
КонецПроцедуры    

Теперь код состояния 307 возвращает
5 Gector
 
02.02.21
22:01
(2) я закомментировал ОтправитьДляОбработки
6 Gector
 
02.02.21
22:10
Коды ошибок API тут описаны https://help.justclick.ru/archives/511
307 нет ошибки
7 Gector
 
02.02.21
22:11
(2) напиши как по твоему будет работать, попробую
8 Asmody
 
02.02.21
22:16
(4) зачем строку параметров начал с амперсанда?
в том же постмане есть raw-режим. ну собери ты там параметры, посмотри в "сыром" виде как должна выглядеть строка. чего велосипед-то изобретать?
9 Ёпрст
 
гуру
02.02.21
23:08
(7) ну, тело из сьроки не нужно тебе
10 Ёпрст
 
гуру
02.02.21
23:09
(3) с телефона камменты на другой строке окпзыааются..перенос строк однако)
11 acht
 
03.02.21
00:36
(6) HTTP код перенаправления  307 Temporary Redirect означает, что запрошенный ресурс был временно перемещен в URL-адрес, указанный в заголовке Location.

Если для тебя это китайская грамота, то лучше отдай задачу кому-нибудь другому. "Напиши как по твоему" не поможет.
12 Сергиус
 
03.02.21
00:57
(0)ЗАчем структуру 1с пихать в тело? Там либо обычная строка вида параметр=значение и & разделитель, либо json/xml какой-ть.
13 Сергиус
 
03.02.21
01:00
+(12) функция УстановитьТелоИзСтроки - параметр ИспользоватьBOM
14 Gector
 
03.02.21
14:10
(12) посмотри внимательно 4 пост, потом структура в строку переводится
15 Gector
 
03.02.21
14:24
(9) как это не нужно, у меня POST запрос, а не GET
16 Gector
 
03.02.21
14:25
(13) ИспользоватьBOM пробовал, использовать и не использовать, не  помогло

HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаПараметров,КодировкаТекста.UTF8,ИспользованиеByteOrderMark.Использовать);
17 Ёпрст
 
гуру
03.02.21
14:28
(9) и че ?
18 Gector
 
03.02.21
14:29
(17) ну вообщем пробовал, не помог твой совет
19 Ёпрст
 
гуру
03.02.21
14:29
(15) И че что пост ?
У тя нет "тела" в этом запросе. Ты не должен тыды передавать ничего.
20 Ёпрст
 
гуру
03.02.21
14:30
Показывай, как проюовал. И покажи, как твой запрос в постмане выглядит, ну или где ты там проверяешь
21 Gector
 
03.02.21
14:32
22 acht
 
03.02.21
14:33
(21) "Headers (7)" ну это так, к слову
23 Ёпрст
 
гуру
03.02.21
14:34
у тя еще и urlencoded.. тут кодированную строку надо пихать тогда
24 Ёпрст
 
гуру
03.02.21
14:34
и да, покажи, что в заголовках
25 Ёпрст
 
гуру
03.02.21
14:34
в постмане
26 Gector
 
03.02.21
14:38
27 Ёпрст
 
гуру
03.02.21
14:50
Ну , у меня пока так:

код состояния 200 и ответ такой..


{"status":false,"result":[{"message":"Customer email cannot be empty","name":"create_order[customer_email]"},{"message":"Product names cannot be empty","name":"create_order[product_names]"}]}

ща, отвлекают тут
28 Gector
 
03.02.21
14:54
(27) да, такое я тоже получал
29 Ёпрст
 
гуру
03.02.21
15:52
У тя хотя бы простой запрос  HTTPЗапрос = Новый HTTPЗапрос("api/getgoods"); работает ?
30 Ёпрст
 
гуру
03.02.21
15:53
вот тут
HTTPЗапрос.УстановитьТелоИзСтроки("&" + СтрокаПараметров,КодировкаТекста.UTF8);
выкинь &
31 Gector
 
03.02.21
16:07
(29) Да у меня получилось getgoods, но только через COMОбъект

        WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
        WinHttp.Option(2,"ANSI");
        WinHttp.Open("POST","https://uchi.justclick.ru/api/getgoods",0);
        WinHttp.SetRequestHeader("Accept-Language", "ru");
        WinHttp.SetRequestHeader("Accept-Charset","ANSI");
        WinHttp.setRequestHeader("Content-Language", "ru");
        WinHttp.setRequestHeader("Content-Charset", "ANSI");
        WinHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=ANSI");
               
        СтрокаЗапроса="rpsKey="+КлючApi;
        
        WinHttp.Send(СтрокаЗапроса);
        ТекстОтвета = WinHttp.ResponseText();
32 Ёпрст
 
гуру
03.02.21
16:27
ну а так, ?

    HTTPСоединение = Новый HTTPСоединение("uchi.justclick.ru",443, , , , , Новый ЗащищенноеСоединениеOpenSSL);
    HTTPЗапрос = Новый HTTPЗапрос("/api/GetGoods");
    HTTPЗапрос.Заголовки.Вставить("Content-type", "application/x-www-form-urlencoded");
    HTTPЗапрос.Заголовки.Вставить("Accept-Language", "ru");
    HTTPЗапрос.Заголовки.Вставить("Accept-Charset","ANSI");
    HTTPЗапрос.Заголовки.Вставить("Content-Language", "ru");
    HTTPЗапрос.Заголовки.Вставить("Content-Charset", "ANSI");
    СтрокаПараметров = "rpsKey="+КлючApi;// ну или СтрокаПараметров  = КодироватьСтроку("rpsKey="+КлючApi,СпособКодированияСтроки.КодировкаURL);
    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаПараметров ,КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    Сообщить(HTTPОтвет.ПолучитьТелоКакСтроку());
33 acht
 
03.02.21
16:32
Параметры-то кодировкой прикройте. Там же у вас собаки водятся.
34 Gector
 
03.02.21
16:45
(32) работает
35 Gector
 
03.02.21
17:04
(32) GetGoods работает,  createorder не проходит
     HTTPСоединение = Новый HTTPСоединение("uchi.justclick.ru",443, , , , , Новый ЗащищенноеСоединениеOpenSSL);
    HTTPЗапрос = Новый HTTPЗапрос("/api/CreateOrder");
    HTTPЗапрос.Заголовки.Вставить("Content-type", "application/x-www-form-urlencoded");
    HTTPЗапрос.Заголовки.Вставить("Accept-Language", "ru");
    HTTPЗапрос.Заголовки.Вставить("Accept-Charset","ANSI");
    HTTPЗапрос.Заголовки.Вставить("Content-Language", "ru");
    HTTPЗапрос.Заголовки.Вставить("Content-Charset", "ANSI");

СтрокаПараметров = КодироватьСтроку("rpsKey="+КлючApi,СпособКодированияСтроки.КодировкаURL)+"&"+КодироватьСтроку("customer_email=test@yandex.ru",СпособКодированияСтроки.КодировкаURL)+"&"+КодироватьСтроку("product_names=BP1C", СпособКодированияСтроки.КодировкаURL);
    

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

ответ {"error_code":1,"error_text":"Not transferred hash","hash":"644639af72db5155a9f7902dc4f84304"}
36 Gector
 
03.02.21
17:16
как хеш прицепить?
37 acht
 
03.02.21
17:19
(35) Если по феншую, то "строку параметров" надо лепить как

КодироватьСтроку(...) + "=" + КодироватьСтроку(...) + "&" + ...
38 acht
 
03.02.21
17:20
(36) > хеш
А это к поставщику АПИ
39 Gector
 
03.02.21
17:52
(37) сделал по феншую, теперь получаю ответ {"error_code":600,"error_text":"Wrong email: ''","hash":"e8f743c26e3ab8eb31b572bb664059e7"}
40 Gector
 
03.02.21
17:54
вот как лепил по феншую строкупараметров

СтрокаПараметров = КодироватьСтрокуПараметра("rpsKey",КлючApi)+"&"+ КодироватьСтрокуПараметра("customer_email","test@mail.ru")+"&"+КодироватьСтрокуПараметра("product_names","BP1C");

Функция КодироватьСтрокуПараметра(Параметр, Значение)
    Возврат КодироватьСтроку(Параметр, СпособКодированияСтроки.КодировкаURL) + "=" + КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL);
КонецФункции
41 DAFA
 
03.02.21
18:23
проверь что возвращает РезультатМетода = "Ошибка выполнения http запроса. Код состояния - "
                        + HTTPОтвет.КодСостояния;

600 быть не должно .
42 Gector
 
03.02.21
18:30
(41) код состояния 200, но заказ не создается
43 Gector
 
03.02.21
19:13
Код сейчас выглядит так:

Процедура КнопкаВыполнитьНажатие(Кнопка)

     HTTPСоединение = Новый HTTPСоединение("uchi.justclick.ru",443, , , , , Новый ЗащищенноеСоединениеOpenSSL);
    HTTPЗапрос = Новый HTTPЗапрос("/api/CreateOrder");
    HTTPЗапрос.Заголовки.Вставить("Content-type", "application/x-www-form-urlencoded");
    HTTPЗапрос.Заголовки.Вставить("Accept-Language", "ru");
    HTTPЗапрос.Заголовки.Вставить("Accept-Charset","ANSI");
    HTTPЗапрос.Заголовки.Вставить("Content-Language", "ru");
    HTTPЗапрос.Заголовки.Вставить("Content-Charset", "ANSI");
    СтрокаПараметров = КодироватьСтрокуПараметра("rpsKey",КлючApi)+"&"+ КодироватьСтрокуПараметра("customer_email","test@mail.ru")+"&"+КодироватьСтрокуПараметра("product_names","BP1C");
    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаПараметров,КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    Сообщить(HTTPОтвет.ПолучитьТелоКакСтроку());
    
КонецПроцедуры

Функция КодироватьСтрокуПараметра(Параметр, Значение)
    Возврат КодироватьСтроку(Параметр, СпособКодированияСтроки.КодировкаURL) + "=" + КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL);
КонецФункции

Получаю HTTPОтвет.КодСостояния=200  HTTPОтвет.ПолучитьТелоКакСтроку() = {"error_code":600,"error_text":"Wrong email: ''","hash":"e8f743c26e3ab8eb31b572bb664059e7"}

Заказ не создается.
44 Гений 1С
 
гуру
03.02.21
19:49
(43) а что в СтрокаПараметров счас?
45 Гений 1С
 
гуру
03.02.21
19:50
он у тебя email видит как пустой, по человечески же отвечает
46 Gector
 
03.02.21
20:07
(45) я ему по чеовечески отправляю емайл, а он говорит пустой.
47 Гений 1С
 
гуру
03.02.21
20:14
(46) строку параметров дай, бл
48 Ёпрст
 
гуру
03.02.21
20:27
(43) ё..

так пробуй:
СтрокаПараметров = КодироватьСтроку("rpsKey=КлючApi&email=.....&Вася=Федя",СпособКодированияСтроки.КодировкаURL);
49 Fram
 
03.02.21
20:27
Тут кто то ссылку на обёртку на гитхабе выкладывал. Там вроде для урленкодед тоже методы были. Чтобы самому не париться вот так.
50 Ёпрст
 
гуру
03.02.21
20:28
Ну или пробуй параметры json-ом передать, мот там их сервис умеет json, раз ответ в json-e приходит
51 Fram
 
03.02.21
20:32
(50) +1 99% что умеет
52 Ёпрст
 
гуру
03.02.21
20:46
Тип того:


ПараметрыAPI = Новый Структура;
    ПараметрыAPI.Вставить("rpsKey", "вася");
    ПараметрыAPI.Вставить("customer_email", "test@mail.ru");
    ПараметрыAPI.Вставить("product_names", "BP1C");
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписьJSON.ЗаписатьНачалоМассива();
    ЗаписатьJSON(ЗаписьJSON,ПараметрыAPI);
    ЗаписьJSON.ЗаписатьКонецМассива();
    СтрокаJSON = КодироватьСтроку(ЗаписьJSON.Закрыть(),СпособКодированияСтроки.КодировкаURL);

    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON,КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
53 Fram
 
03.02.21
20:54
(52) имхо, для json кодироватьстроку это уже лишнее
54 Ёпрст
 
гуру
03.02.21
21:02
(53) ну.. у него же в заголовках стоит что передача кодированной строки
55 Fram
 
03.02.21
21:45
(54) заголовок тоже на json надо поменять, если json засылать
56 Gector
 
04.02.21
14:45
(52) попробовал, в ответ приходит {"error_code":2,"error_text":"No transmitted data","hash":"f95109a0ca4b2ec82b41adc4dd5b90c6"}
Код состояния 200
Пробовал и просто json, не кодировал, и в заголовке указывал application/json, ответ одинаковый, видимо не понимают они json на входе

     HTTPСоединение = Новый HTTPСоединение("uchi.justclick.ru",443, , , , , Новый ЗащищенноеСоединениеOpenSSL);
    HTTPЗапрос = Новый HTTPЗапрос("/api/CreateOrder");
    HTTPЗапрос.Заголовки.Вставить("Content-type","application/json"); //"application/x-www-form-urlencoded");
    HTTPЗапрос.Заголовки.Вставить("Accept-Language", "ru");
    HTTPЗапрос.Заголовки.Вставить("Accept-Charset","ANSI");
    HTTPЗапрос.Заголовки.Вставить("Content-Language", "ru");
    HTTPЗапрос.Заголовки.Вставить("Content-Charset", "ANSI");
    
     ПараметрыAPI = Новый Структура;
    ПараметрыAPI.Вставить("rpsKey", КлючApi);
    ПараметрыAPI.Вставить("customer_email", "test@mail.ru");
    ПараметрыAPI.Вставить("product_names", "BP1C");
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписьJSON.ЗаписатьНачалоМассива();
    ЗаписатьJSON(ЗаписьJSON,ПараметрыAPI);
    ЗаписьJSON.ЗаписатьКонецМассива();
    СтрокаJSON = ЗаписьJSON.Закрыть();//КодироватьСтроку(ЗаписьJSON.Закрыть(),СпособКодированияСтроки.КодировкаURL);

    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON,КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
    Сообщить(HTTPОтвет.ПолучитьТелоКакСтроку());
57 Garykom
 
гуру
04.02.21
14:51
(56) "ANSI"
58 Gector
 
04.02.21
14:57
(47) держи rpsKey=8074da4206bf4f587cec7&customer_email=test%40mail.ru&product_names=BP1C
59 Gector
 
04.02.21
15:04
(57) что ANSI?
60 Ёпрст
 
гуру
04.02.21
15:10
(59) ты передаешь utf8 а в заголовках указываешь анси
61 Gector
 
04.02.21
15:27
(60) поменял на utf-8, не помогло, с json и без него попробовал
62 Gector
 
04.02.21
15:27
HTTPЗапрос.Заголовки.Вставить("Accept-Charset","utf-8");
    HTTPЗапрос.Заголовки.Вставить("Content-Language", "ru");
    HTTPЗапрос.Заголовки.Вставить("Content-Charset", "utf-8");
63 Garykom
 
гуру
04.02.21
15:44
(61) Если у тебя в POSTMAN все работает то я не понимаю проблемы повторить на 1С.
64 Gector
 
04.02.21
15:45
(63) ну вот не работает в 1С, скажи что не так, если видишь
65 Garykom
 
гуру
04.02.21
15:47
(64) Потому что кто то тупой.

У тебя в постмане "x-www-form-urlencoded" и в теле параметры.
Какого хрена ты в заголовки суешь в 1С?
66 Garykom
 
гуру
04.02.21
15:49
(65)+ Короче изучи сначала теорию а потом легко и просто сделай. А не методом тыка. Тут такое очень плохо работает, задолбаешься над 5 минутной задачкой 5 дней сидеть.
67 Garykom
 
гуру
04.02.21
15:49
(65)+ Это про код из (0)
68 Garykom
 
гуру
04.02.21
15:49
А дальше нахрена то в json стал сувать что еще странней.
69 Garykom
 
гуру
04.02.21
15:50
"При x-www-form-urlencoded надо передавать данные в виде variable=val&variable2=val"
70 Gector
 
04.02.21
15:51
(69) ты посмотри ветку, прежде чем писать, пробовали так
71 Garykom
 
гуру
04.02.21
15:54
72 Garykom
 
гуру
04.02.21
15:56
У тебя не rest api а по сути эмуляция методов/вызовов из браузера одностраничника на js
И там куча редиректов на другие пути, для браузера/js это фигня штатная как и для Постмана

А вот для тех кто не понимает что ответ бывает не только 200 но и 201, 202 и т.д. и это все ПРАВИЛЬНЫЕ ОТВЕТЫ! Очень тяжко.
73 Gector
 
04.02.21
16:50
(72) в заголовке в Location приходит вот такая "/api/createOrderZapier?products=%5B%7B%22product_name%22%3A%22BP1C%22%7D%5D&eventName=api%20-%20createorder"

Тоесть мне надо еще один запрос послать. Верно?
74 Garykom
 
гуру
04.02.21
16:51
(73) угадал
75 Garykom
 
гуру
04.02.21
16:52
(74)+ причем вполне возможно что хватит простого GET по указанному URL
76 Gector
 
04.02.21
16:58
бинго
послал и заказ создался
    Если HTTPОтвет.КодСостояния = 307 Тогда
        HTTPСоединение = Новый HTTPСоединение("uchi.justclick.ru", , , , , , Новый ЗащищенноеСоединениеOpenSSL);
        HTTPЗапрос = Новый HTTPЗапрос(HTTPОтвет.Заголовки["Location"]);
        //
        HTTPЗапрос.Заголовки.Вставить("Content-type", "application/x-www-form-urlencoded");
        HTTPЗапрос.Заголовки.Вставить("User-Agent", "PostmanRuntime/7.26.10");
        HTTPЗапрос.Заголовки.Вставить("Accept", "*/*");
        HTTPЗапрос.Заголовки.Вставить("Accept-Encoding", "gzip, deflate, br");
        HTTPЗапрос.Заголовки.Вставить("Connection", "keep-alive");
        HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаПараметров,КодировкаТекста.UTF8,ИспользованиеByteOrderMark.НеИспользовать);
        
        HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);    
        
    КонецЕсли;
77 Gector
 
04.02.21
16:58
(75) Егор спасибо