Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

HTTP сервис - код на стороне сайта

HTTP сервис - код на стороне сайта
Я
   OnePrg
 
24.09.20 - 10:42
Дайте пожалуйста примеры использования HTTP сервисов на стороне сайта.

Например, есть кнопка, по которой вызывается HTTP сервис (GET запрос), а ниже результат из 1С (POST запрос).
   Юрий Лазаренко
 
1 - 24.09.20 - 10:47
(0) Тебе нужен пример кода 1С, или кода сайта?
   AlexTim03
 
2 - 24.09.20 - 10:47
НЕ в качестве рекламы, но вот неплохая статья про все это:
http://курсы-по-1с.рф/articles/2017-09-07-exchange-with-internet-services/
   OnePrg
 
3 - 24.09.20 - 10:48
(1) сайта
   Юрий Лазаренко
 
4 - 24.09.20 - 10:51
(3) Какой сценарий действий на сайте? Это может быть тупо <form>, которая передает в 1С значения своих полей в виде параметров, при нажатии на submit вся страница перезагружается и ее новый текст должен быть сформирован 1Ской. Или это может быть просто http-запрос в 1С, которая возвращает результат в виде строки или JSON, и потом javascript должен что-то сделать с этим результатом. В зависимости от сценария алгоритмы могут очень сильно различаться.
   MyNick
 
5 - 24.09.20 - 10:56
(3) Я использую axios - компонент для js, который умеет работать с сервисами. Оч. простая штука
https://ru.vuejs.org/v2/cookbook/using-axios-to-consume-apis.html
   OnePrg
 
6 - 24.09.20 - 10:56
(4) <form>, которая передает в 1С значения своих полей в виде параметров, 1С возвращает результат в виде строки или JSON, и потом javascript должен что-то сделать с этим результатом.
   MyNick
 
7 - 24.09.20 - 11:00
(6) На кнопку на сайте вешаешь OnClick, которая вызывает что-то подобное к твоей 1С, возвращающей джейсон
axios
  .get('https://api.coindesk.com/v1/bpi/currentprice.json')
  .then(response => (this.info = response.data.bpi));

В response получаешь ответ от 1С и "что-то делаешь с этим результатом"
   Юрий Лазаренко
 
8 - 24.09.20 - 11:13
(6) Вот так попробуй:

<form id="formElem">
  <input type="text" name="name" value="John">
  <input type="text" name="surname" value="Smith">
  <input type="submit">
</form>

<script>
  formElem.onsubmit = async (e) => {
    e.preventDefault();

    let response = await fetch('/article/formdata/post/user', {
      method: 'POST',
      body: new FormData(formElem)
    });

    let result = await response.json();

    alert(result.message);
  };
</script>
   Kesim
 
9 - 24.09.20 - 11:54
(0) постман не предлагать?
   OnePrg
 
10 - 25.09.20 - 10:09
Всем спасибо. Пошёл изучать.
   polosov
 
11 - 25.09.20 - 10:10
(0) Совсем недавно вышла книга https://online.1c.ru/books/book/29582119/
Бегом покупать.
   Юрий Лазаренко
 
12 - 25.09.20 - 10:22
(11) Не подойдет книга, ТСу необходимо помочь собрать код, который будет выполняться на сайте, а не в 1С.
   OnePrg
 
13 - 25.09.20 - 15:37
(8) код в модуль вставил, input'ы и кнопка появились

прописал URL вызова HS

let response = await fetch('http://localhost/BAS/hs/My/Test', {
            method: 'POST',
            body: new FormData(formElem)

но при нажатии на кнопку точка останова не срабатывает, а когда в браузере напрямую вызываю http://localhost/BAS/hs/My/Test - срабатывает
   OnePrg
 
14 - 25.09.20 - 15:56
Если без параметров, то точка останова срабатывает

let response = await fetch('http://localhost/BAS/hs/My/Test');
   OnePrg
 
15 - 25.09.20 - 17:53
Решил вот так

let formData = new FormData(formElem);
let response = await fetch('http://localhost/BAS/hs/My/Test?name='+formData.get('name')+'&surname='+formData.get('surname'));
   Юрий Лазаренко
 
16 - 25.09.20 - 20:04
(14) Где точка останова срабатывает? В браузере или в 1С? В (13) у тебя был POST запрос, а в браузере напрямую и в (15) GET. Может в этом дело?
   Юрий Лазаренко
 
17 - 25.09.20 - 20:06
В (15) FormData лишняя, если ты потом GET-запрос собираешь из formData.get('name') и formData.get('surname'), можно было данные взять непосредственно из элементов формы. Хотя в принципе и так норм.
   OnePrg
 
18 - 29.09.20 - 20:53
<form id="formElem">

    <input type="text" name="pers_acc" >
    <input type="submit">
</form>

<script>
    formElem.onsubmit = async (e) => {
        e.preventDefault();
        
        let formData = new FormData(formElem);
        let response = await fetch('http://localhost/BAS/hs/My/Test?name='+formData.get('pers_acc'));

        let result = await response.json();

        alert(result.tel);
    };
</script>


Функция TestGET(Запрос)
    Ответ = Новый HTTPСервисОтвет(200);
    
    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку();
    Запись.ЗаписатьКонецОбъекта();
    Запись.ЗаписатьИмяСвойства("tel");
    Запись.ЗаписатьЗначение("050555555");
    Запись.ЗаписатьКонецОбъекта();
    Результат = Запись.Закрыть();
    Ответ.УстановитьТелоИзСтроки(Результат);
    Ответ.Заголовки("Content-type","application/json");

    Возврат Ответ;
КонецФункции



alert(result.tel) не срабатывает. Что не так?
   Юрий Лазаренко
 
19 - 29.09.20 - 20:55
(18) 1. Точка останова в 1С срабатывает?
2. В консоли браузера какие-то сообщения есть? Предположу, что там будет что-то с отвалом http-запроса из-за CORS.
   OnePrg
 
20 - 29.09.20 - 21:09
   OnePrg
 
21 - 29.09.20 - 21:16
   Василий Алибабаевич
 
22 - 29.09.20 - 21:19
(18)
"
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
Запись.ЗаписатьКонецОбъекта();
"

А не пробовали начинать запись объекта инструкцией ЗаписатьНачалоОбъекта()?
   Василий Алибабаевич
 
23 - 29.09.20 - 21:22
+ (22) Да и ошибка в 106 строке (метод SUBMIT) говорит, что серверная часть несколько впадает в ступор от того что от нее хотят.
   OnePrg
 
24 - 29.09.20 - 21:24
(22) да, уже заметил, изменил, но результат тот же

Функция TestGET(Запрос)
    Ответ = Новый HTTPСервисОтвет(200);
    
    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку();
    Запись.ЗаписатьНачалоОбъекта();
    Запись.ЗаписатьИмяСвойства("tel");
    Запись.ЗаписатьЗначение("050555555");
    Запись.ЗаписатьКонецОбъекта();
    Результат = Запись.Закрыть();
    Ответ.УстановитьТелоИзСтроки(Результат);
    Ответ.Заголовки("Content-type","application/json");

    Возврат Ответ;
КонецФункции
   OnePrg
 
25 - 29.09.20 - 21:25
(23) 106 это GET - с ним тоже нужно разобраться но потом, сейчас меня устраивает, что сайт передаёт данные 1С, сейчас не могу передать данные из 1С на сайт
   Юрий Лазаренко
 
26 - 29.09.20 - 21:28
(21) Ошибка 500 говорит о том, что на сервере произошло что-то непредвиденное. У тебя происходит исключение в 1С.
заменить строку
let result = await response.json();
на
let result = await response;

а строку
alert(result.tel);
на
alert(result);

Есть вероятность, что там будет текст ошибки 1С.

А тк понятно, почему до alert не доходит - код останавливается на строке
let result = await response.json();
так как response не является валидным json-ом.
   Юрий Лазаренко
 
27 - 29.09.20 - 21:28
+(26) * "заменить строку" читать как "Попробуй заменить строку"
   OnePrg
 
28 - 29.09.20 - 21:29
   Юрий Лазаренко
 
29 - 29.09.20 - 21:31
(28) Что-то в каких-то непонятных местах ошибки показывает. Обнови кэш браузера (один раз надо обновить страницу кнопками Ctrl+F5, желательно делать так каждый раз при изменении JS и CSS). И покажи еще, пишет ли что-то красным цветом на закладке console.
   OnePrg
 
30 - 29.09.20 - 21:36
 
 Рекламное место пустует
   Юрий Лазаренко
 
31 - 29.09.20 - 21:39
(3) А если в браузере набрать http://localhost/BAS/hs/My/Test?name=123? Что пишет?
   Василий Алибабаевич
 
32 - 29.09.20 - 21:39
(30) Все та же ошибка 500. Отлаживать код на стороне 1С.
   OnePrg
 
33 - 29.09.20 - 21:39
   Юрий Лазаренко
 
34 - 29.09.20 - 21:40
+(31) Что-то же он возвращает, не зря пишет, что там Unexpected token H
   OnePrg
 
35 - 29.09.20 - 21:40
(31) {HTTPСервис.My.Модуль(13)}: Метод объекта не обнаружен (Заголовки)
   Юрий Лазаренко
 
36 - 29.09.20 - 21:41
(35) Ну вот тебе и место ошибки, и описание. Как только это устранишь, все заработает.
   OnePrg
 
37 - 29.09.20 - 21:43
Всем спасибо. Заработало.

<form id="formElem">

    <input type="text" name="pers_acc" >
    <input type="submit">
</form>

<script>
    formElem.onsubmit = async (e) => {
        e.preventDefault();
        
        let formData = new FormData(formElem);
        let response = await fetch('http://localhost/BAS/hs/My/Test?name='+formData.get('pers_acc'));

        let result = await response.json();

        alert(result.tel);
    };
</script>


Функция TestGET(Запрос)
    Ответ = Новый HTTPСервисОтвет(200);
    
    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку();
    Запись.ЗаписатьНачалоОбъекта();
    Запись.ЗаписатьИмяСвойства("tel");
    Запись.ЗаписатьЗначение("050555555");
    Запись.ЗаписатьКонецОбъекта();
    Результат = Запись.Закрыть();
    Ответ.УстановитьТелоИзСтроки(Результат);
    Ответ.Заголовки.Вставить("Content-type","application/json");

    Возврат Ответ;
КонецФункции
   Юрий Лазаренко
 
38 - 29.09.20 - 21:44
+(36) Ответ.Заголовки.Встпавить(), а не Ответ.Заголовки()
   Юрий Лазаренко
 
39 - 29.09.20 - 21:44
А, уже. Ну лан )


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.