Имя: Пароль:
1C
1С v8
1с 8 post запрос
,
0 Gera1t
 
27.12.23
13:27
Здравствуйте!
Помогите пожалуйста с post запросом
Нужно отправить post запрос
Вот мой код:

    HTTPСоединение = Новый HTTPСоединение(АдресСайта, , , , , , , );
    
    ЗапросHTTP = Новый HTTPЗапрос(АдресAPI);
    ЗапросHTTP.Заголовки.Вставить("Content-type", "application/json; charset=utf-8");    
    ЗапросHTTP.УстановитьТелоИзСтроки("action=oneSActions" + "&data=" + ФайлJSON, КодировкаТекста.UTF8);
    
    HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(ЗапросHTTP);

переменные например:
АдресСайта = example.com
АдресAPI = api/post

Код который работает:
function initScripts(){            
            document.querySelector(".click-on-me").addEventListener("click", (e) => {
            let f_data = new FormData();
            srv_url = "http://example.com/api/post";
            let json_data = {
                action: "getAllContragents",
                secret: "08e09ac9dbc8e7a6205d1c0c82fdff1e",
            }
            f_data.append("action", "oneSActions");
            f_data.append("data", JSON.stringify(json_data));            
            try {
                const response = fetch(srv_url, {
                    method: 'POST', // или 'PUT'
                    body: f_data, // данные могут быть 'строкой' или {объектом}!
                });
                response
                    .then(res => {
                        return res.json();
                    })
                    .then((res) => {
                        console.log(res);
                    })
                    
            } catch (error) {
                console.error('Ошибка:', error);
            }
            })
        }
    
Дело в том, что в ответ на мой запрос приходит ответ 500
Ответ на нижний код приходит корректный ответ

Подскажите пожалуйста что с моим кодом не так?
1 Donkey_hot
 
27.12.23
13:46
(0) АдресAPI = /api/post
2 Donkey_hot
 
27.12.23
13:49
(1) Ну и формирование тела запроса кривое какое-то.
3 Gera1t
 
27.12.23
13:51
(1)Все равно ответ 500
4 Gera1t
 
27.12.23
13:52
Меня смущает то, что я добавляю переменны стройкой, а там через FormData()
5 Donkey_hot
 
27.12.23
13:52
А ответ 500 возвращает какое-нибудь пояснение?
6 Gera1t
 
27.12.23
13:53
нет, просто 500 и все
7 Donkey_hot
 
27.12.23
13:55
(6) Попробуйте отправить просто {
                action: "getAllContragents",
                secret: "08e09ac9dbc8e7a6205d1c0c82fdff1e",
            }

Возможно, ошибка станет более информативной.
8 Gera1t
 
27.12.23
13:57
(7) То же самое

let f_data = new FormData();
f_data.append("action", "oneSActions");
f_data.append("data", JSON.stringify(json_data));

вот тут как я понял формируется тело запроса, программист js мне говорят, что от 1с запрос приходят якобы не как post а как get
9 Gera1t
 
27.12.23
13:58
может быть как то по другому отправить запрос или по другому тело запроса передать
10 Gera1t
 
27.12.23
13:59
Пробовал через postman, указал метод post, тоже ошибка, написал программистам js они говорят, что postman запросы post конвертирует в GET и поэтому не работает.
11 Donkey_hot
 
27.12.23
14:00
(8) Отправить для обработки - это POST всегда. Попробуйте передать пустую структуру: {}.
Как проверяете, что ответ пустой? ПолучитьТелоКакСтроку()?
12 Donkey_hot
 
27.12.23
14:01
(10) За Postman не скажу, но в SoapUI какой метод указал, такой и выполняется.
13 Gera1t
 
27.12.23
14:02
(8)
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(ЗапросHTTP);

HTTPОтвет.КодСостояния = 500
14 Gera1t
 
27.12.23
14:03
(8) Как я понял со стороны сайте, если что то не нравиться ответ всегда 500
15 Gera1t
 
27.12.23
14:03
(12) Попробую его скачать
16 Donkey_hot
 
27.12.23
14:04
(14) Это отлично, но зачастую (не всегда) можно получить чуть больше подробностей при помощи HTTPОтвет.ПолучитьТелоКакСтроку()
17 Gera1t
 
27.12.23
14:06
(16) пустая строка
18 Donkey_hot
 
27.12.23
14:07
(17) Это прискорбно.
19 Gera1t
 
27.12.23
14:08
Пробовал ПолучитьТелоКакПоток() тоже пусто
20 Gera1t
 
27.12.23
14:11
SoapUI тоже 500 выдает
21 Gera1t
 
27.12.23
14:11
HTTP/1.1 500 Internal Server Error
Server: nginx/1.14.1
Date: Wed, 27 Dec 2023 11:11:00 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 0
Connection: keep-alive
X-Powered-By: PHP/7.4.30
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Set-Cookie: PHPSESSID=55tabgekt8phoqr8c2a9npljuf; path=/
22 Donkey_hot
 
27.12.23
14:13
(21) Покажите скриншот тела в SoapUI (конфиденциальное можно замазать)
23 Gera1t
 
27.12.23
14:16
24 Donkey_hot
 
27.12.23
14:19
(23) Нет, ну так не пойдет... У вас тело запроса пустое. Это нижнее левое окно. Перенесите туда JSON. Параметр data, соответственно, удалить.
25 Gera1t
 
27.12.23
16:21
https://ibb.co/TBBjyQK
Вот так?
26 Gera1t
 
27.12.23
16:28
27 Donkey_hot
 
27.12.23
16:30
(25) Полагаю в теле все-таки ожидается валидный JSON. Проще всего конечно взять документацию к сервису и почитать. Но если нужны варианты:

а) {
       action: "getAllContragents",
       secret: "08e09ac9dbc8e7a6205d1c0c82fdff1e",
   }

б) {data: {
                action: "getAllContragents",
                secret: "08e09ac9dbc8e7a6205d1c0c82fdff1e",
            }
}

в) {action: "oneSActions",
    data: {
                action: "getAllContragents",
                secret: "08e09ac9dbc8e7a6205d1c0c82fdff1e",
            }
}

В случаях а) и б) избавьтесь только от параметра data (как на скриншоте), в случае в) - от обоих параметров. Если на какой-то из этих вариантов придет что-то отличное от 500, дальше будет проще.
28 Donkey_hot
 
27.12.23
16:31
(26) multipart/form-data зря выставили, не думаю, что в этом направлении наше счастье.
29 Gera1t
 
27.12.23
16:37
Получилось.
    ЗапросHTTP.Заголовки.Вставить("Content-type", "application/x-www-form-urlencoded");    

вот такой заголовок нужно
30 Gera1t
 
27.12.23
16:38
action=oneSActions&data=
{     "action": "getAllContragents",     "secret": "08e09ac9dbc8e7a6205d1c0c82fdff1e" }
вот такое тало запроса
31 Gera1t
 
27.12.23
16:39
Большое спасибо за помощь!
AdBlock убивает бесплатный контент. 1Сергей