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

Помогите с запросом JSON

Помогите с запросом JSON
Я
   KIraA
 
17.05.19 - 09:52
Вот собственно сам запрос.

Строка = Объект.Логин + Объект.Пароль;
ЛогинИПарольЗашифрованныйBase64 = СоздатьСтрокуBase64(Строка);

Заголовоки = Новый Соответствие;
Заголовоки.Вставить("POST", "https://***/app/smsgw/rest/v2/messages";);
Заголовоки.Вставить("Host", "https://***";);
Заголовоки.Вставить("Accept", "application/json, text/plain, */*");
Заголовоки.Вставить("Authorization", "Basic " + ЛогинИПарольЗашифрованныйBase64);
Заголовоки.Вставить("Content-Type", "application/json;charset=utf-8");


ТелоЗапроса = "";
ТелоЗапроса = УстановитьТело();
ИмяФайлаОтвета = "E:\Проверка.txt";

Попытка
    
    Соединение      = Новый HTTPСоединение("***", ,, , ПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси("https"), 60, Новый ЗащищенноеСоединениеOpenSSL);
    ЗапросHTTP      = Новый HTTPЗапрос;
    ЗапросHTTP.АдресРесурса = "/app/smsgw/rest/v2/messages";
    ЗапросHTTP.Заголовки    = Заголовоки;
    ЗапросHTTP.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    Соединение.ОтправитьДляОбработки(ЗапросHTTP, ИмяФайлаОтвета);
    Результат = ИмяФайлаОтвета;    
Исключение                                           
КонецПопытки;



А вот ошибка
<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>


This page contains the following errors:
error on line 6 at column 8: Opening and ending tag mismatch: hr line 0 and body
Below is a rendering of the page up to the first error.


Вопрос как найти ошибку в запросе? Вернее как прочитать ЗапросHTTP и там уже найти error on line 6 at column 8?
 
 
   Beduin
 
1 - 17.05.19 - 09:53
штука нужна, с помощью которой будешь видеть обращения эти на сервисах
   KIraA
 
2 - 17.05.19 - 09:54
а поподробнее?)
   Жан Пердежон
 
3 - 17.05.19 - 09:55
УстановитьТело()
   KIraA
 
4 - 17.05.19 - 10:05
еще варианты?
   Жан Пердежон
 
5 - 17.05.19 - 10:07
(4) серьезно? предлагаешь гадать, что у тебя спрятано в этой функции?
   KIraA
 
6 - 17.05.19 - 10:10
Да не надо гадать. Помогите правильно написать, чтоб прочитать ЗапросHTTP в виде строки.
   kennetmccormick
 
7 - 17.05.19 - 10:31
видимо не нравится что есть в  УстановитьТело()
попробуйте SoapUI или Postman-ом отправить
   KIraA
 
8 - 20.05.19 - 10:06
Есть еще идеи? Так и не получилось...

Вот функция УстановитьТело()

Функция УстановитьТело()
    
    СтруктураПараметров = Новый Структура; 
    
        
    //СтруктураПараметров.Вставить("client_message_id");  ///код

    //СтруктураПараметров.Вставить("recipient");           ///номер телефона

    //СтруктураПараметров.Вставить("message_text");      ///текс

    //СтруктураПараметров.Вставить("sender");            ///имя отправителя

    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.ПроверятьСтруктуру = Ложь;
    
    ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON;
    
    ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
    
    Для каждого стр из  Объект.Данные Цикл

    ЗаписьJSON.ЗаписатьНачалоОбъекта();
    
        
    УИДСообщения = СтрЗаменить(Прав(Строка(Новый УникальныйИдентификатор), 10), "-", "");    
    ЗаписьJSON.ЗаписатьИмяСвойства("client_message_id");
    ЗаписьJSON.ЗаписатьЗначение(УИДСообщения);
    ЗаписьJSON.ЗаписатьИмяСвойства("sender"); 
    ЗаписьJSON.ЗаписатьЗначение(Объект.ИмяОтправителя);    
    ЗаписьJSON.ЗаписатьИмяСвойства("recipient"); 
    ЗаписьJSON.ЗаписатьЗначение(Объект.НомерТелефона); 
    ЗаписьJSON.ЗаписатьИмяСвойства("message_text"); 
    ЗаписьJSON.ЗаписатьЗначение(Объект.ТекстСообщения);
    ЗаписьJSON.ЗаписатьИмяСвойства("time_bounds"); 
    ЗаписьJSON.ЗаписатьЗначение("ad99");
         
    ЗаписьJSON.ЗаписатьКонецОбъекта();
    КонецЦикла;
    
    ТелоЗапроса = ЗаписьJSON.Закрыть();
    Возврат ТелоЗапроса
КонецФункции
   МимохожийОднако
 
9 - 20.05.19 - 10:15
Мне не понятна эта строка.
Строка = Объект.Логин + Объект.Пароль;
   Garykom
 
10 - 20.05.19 - 10:20
(8) Есть даже две!
1. Нанять программиста
2. Выдать ему мануал от АПИ
   Garykom
 
11 - 20.05.19 - 10:24
В Казахстане госконторы совсем оригинальные конечно
   bootini
 
12 - 20.05.19 - 10:35
(0)
      ЧтениеJSON = Новый ЧтениеJSON();
        ЧтениеJSON.ОткрытьПоток(HTTPОтвет.ПолучитьТелоКакПоток());
        Попытка
            СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON, Ложь);
        Исключение
            ОписаниеОшибки = ОписаниеОшибки + ОписаниеОшибки();
            Возврат СтруктураОтвета;
        КонецПопытки;
   KIraA
 
13 - 20.05.19 - 10:52
(9)
Для дальнейшего перевода в строку Base64. Возвращается данные по пользователю и паролю в зашифрованном виде
Строка = Логин + Пароль; 

ЛогинИПарольЗашифрованныйBase64 = СоздатьСтрокуBase64(Строка);
   Галахад
 
14 - 20.05.19 - 11:10
(8) Похоже используется синтаксис отправки единичного сообщения для отправки массовых сообщений.
   KIraA
 
15 - 20.05.19 - 11:15
(14) Там в цикле всего один номер, поэтому сообщение единичное
   Garykom
 
16 - 20.05.19 - 11:18
/app/smsgw/rest/v2/messages"

/app/smsgw/rest/v2/messages/"
   KIraA
 
17 - 20.05.19 - 11:26
(16) не помогло. Ошибка та же
   Garykom
 
18 - 20.05.19 - 11:29
(17) Дело в том что ответ "400 Bad Request" возвращает nginx а не rest сервис за ним, дело не в json а в кривом url
   Garykom
 
19 - 20.05.19 - 11:31
(18)+ Или в кривом самом post запросе http
   Garykom
 
20 - 20.05.19 - 11:33
Content-Length почему нет?
   Garykom
 
21 - 20.05.19 - 11:35
("Accept", "application/json, text/plain, */*")

это еще что за изврат? Покажи api там скорее всего просто "application/json"
   bootini
 
22 - 20.05.19 - 11:37
(17) Ставь Fiddler и лови там запрос и ответ, там  в структуре будет описана ошибки или прочитай ответ как в (12) написано, получишь структура и на точке останова, посмотри содержимое с ошибкой.

В (12) вместо  строки ЧтениеJSON.ОткрытьПоток(HTTPОтвет.ПолучитьТелоКакПоток()); твой ЧтениеJSON.ОткрытьФайл(Результат)
   Garykom
 
23 - 20.05.19 - 11:37
(21) Хотя это же формат ответа, обычно можно опускать и не указывать
   KIraA
 
24 - 20.05.19 - 11:38
(21) эти данные предоставляет провайдер.
   KIraA
 
25 - 20.05.19 - 11:40
Все поставила Fiddler, сделала несколько сообщений, отладила все остановы!!! в https://***/app/smsgw/rest/v2/batches.

ИИИИИ!!!!!

Новая ошибка 401 HTTP/1.1 401 Unauthorized Капец
   KIraA
 
26 - 20.05.19 - 11:40
Провайдер говорит перевод логина и пароля правильное. Почему тогда нет авторизации?
   Garykom
 
27 - 20.05.19 - 11:43
json покажи
   Garykom
 
28 - 20.05.19 - 11:43
{
"client_message_id" : "236234857",
"sender" : "SMSGW",
"recipient" : "77010000000",
"message_text" : "тест"
}

Такой?
   Ёпрст
 
29 - 20.05.19 - 11:44
(8) А где начало и конец массива ?
   Garykom
 
30 - 20.05.19 - 11:45
(29) Там единичное без массива
 
 
   KIraA
 
31 - 20.05.19 - 11:45
{
"messages": [
{
"client_message_id" : "12345eed03",
"sender" : "Проверка",
"recipient" : "7хххххххх",
"message_text" : "test 2"
},
{
"client_message_id" : "4db965485b4",
"sender" : "Проверка",
"recipient" : "7хххххххх",
"message_text" : "test 3"
}
]
}
   KIraA
 
32 - 20.05.19 - 11:46
подскажите где тут скрин сохранить. я Вам фидлер скину
   Ёпрст
 
33 - 20.05.19 - 11:48
(31) круто. И где в (8) формирование массива "messages": [ ] ?
   Garykom
 
34 - 20.05.19 - 11:48
(31) Эээто же JSON не для единичного messages а для пакетного batches
   bootini
 
35 - 20.05.19 - 11:48
(25)  попробуй в base 64
Функция СтрокаВBase64(Строка)
    
    Строка = СтрЗаменить(Строка,Символ(10),"");
    Строка = СтрЗаменить(Строка,Символ(13),"");
    
    ДвоичныеДанныеДляПодписи = ПолучитьДвоичныеДанныеИзСтроки (Строка, КодировкаТекста.UTF8, Ложь);
    
    Base64 = Base64Строка(ДвоичныеДанныеДляПодписи);
    Base64 = стрзаменить(Base64,"77u/","");
    Base64 = стрЗаменить(Base64,Символ(10),"");
    Base64 = стрЗаменить(Base64,Символ(13),"");
    
    Возврат Base64;
    
КонецФункции// СтрокаВBase64()
   Garykom
 
36 - 20.05.19 - 11:49
(34)+ Должно быть ЗапросHTTP.АдресРесурса = "/app/smsgw/rest/v2/batches";
   KIraA
 
37 - 20.05.19 - 11:50
(36) я же написала что поменяла на batches

в (25) Все поставила Fiddler, сделала несколько сообщений, отладила все остановы!!! в https://***/app/smsgw/rest/v2/batches.
   Garykom
 
38 - 20.05.19 - 11:51
(37) Да понял, просто зачем так перескакивать не сделав единичное пытаться пакетное.
   KIraA
 
39 - 20.05.19 - 11:52
(35) кодирует так же буква в букву
   KIraA
 
40 - 20.05.19 - 11:53
(38) уже незнаю просто что пробывать. Вот и пошла в пакет)))
   Ёпрст
 
41 - 20.05.19 - 12:07
(0) а есть уверенность, что нужно ЗащищенноеСоединениеOpenSSL делать ?
   Garykom
 
42 - 20.05.19 - 12:08
(41) https://api.kcell.kz/app/smsgw/rest/v2
если я правильно понял
   KIraA
 
43 - 20.05.19 - 12:11
(42) да оно
   Garykom
 
44 - 20.05.19 - 12:11
Имхо я бы сделал все как в (0) только проверил что json правильный и добавил "Content-Length"
   KIraA
 
45 - 20.05.19 - 12:17
(44) это еще что за параметр?
   Garykom
 
46 - 20.05.19 - 12:17
(45) Размер файла/текста json
   Garykom
 
47 - 20.05.19 - 12:29
Попробуй со своим кодом авторизации

Процедура kcell()
    Сервер = "api.kcell.kz";
    РесурсНаСервере = "/app/smsgw/rest/v2/messages";
    ИмяФайлаЗапроса = "";
    ИмяФайлаОтвета = "c:\tmp\kcell.txt";
    
    ssl = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Выбирать),Новый СертификатыУдостоверяющихЦентровWindows());
    Соединение = Новый HTTPСоединение(Сервер,,,,,5,ssl);
    Попытка
        HTTPЗапрос = Новый HTTPЗапрос(РесурсНаСервере);
        СтрокаТелаЗапроса = "{ 
        |""client_message_id"" : ""236234857"",
        |""sender"" : ""SMSGW"",
        |""recipient"" : ""77010000000"",
        |""message_text"" : ""тест""
        |}";
        //HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаЗапроса);

        HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаТелаЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
        
        HTTPЗапрос.Заголовки.Вставить("Accept","application/json, text/plain, */*");
        HTTPЗапрос.Заголовки.Вставить("Authorization","Basic pxT3bdk4dGYXNzd29db4");
        HTTPЗапрос.Заголовки.Вставить("Content-Type","application/json;charset=utf-8");
        HTTPЗапрос.Заголовки.Вставить("Content-Length", СтрДлина(СтрокаТелаЗапроса));
        
        Результат  = Соединение.ОтправитьДляОбработки(HTTPЗапрос, ИмяФайлаОтвета);
        Соединение = Неопределено;
        Если Результат.КодСостояния > 299 Тогда
            Сообщить("Код состояния " + Результат.КодСостояния + ". Проверка не выполнена");
        КонецЕсли;
    Исключение
        Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
    КонецПопытки;
КонецПроцедуры

   KIraA
 
48 - 20.05.19 - 12:42
Переменная не определена (СпособВыбораСертификатаWindows)
    ssl = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(<<?>>СпособВыбораСертификатаWindows.Выбирать),Новый СертификатыУдостоверяющихЦентровWindows()); (Проверка: Сервер)
   Garykom
 
49 - 20.05.19 - 12:48
(48) убери лишнее
ssl = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(), Новый СертификатыУдостоверяющихЦентровWindows());
   Garykom
 
50 - 20.05.19 - 12:49
(49)+ Или перенеси на клиента
   KIraA
 
51 - 20.05.19 - 12:57
Ошибка при вызове метода контекста (ОтправитьДляОбработки)
   KIraA
 
52 - 20.05.19 - 13:01
ПолучитьПрокси("https") Это не надо ни где указать?
   Garykom
 
53 - 20.05.19 - 13:01
(52) Если у вас инет через прокси то надо
   Garykom
 
54 - 20.05.19 - 13:02
(53)+ И таймаут увеличь как у тебя в (0)
Соединение      = Новый HTTPСоединение("***", ,, , ПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси("https"), 60, Новый ЗащищенноеСоединениеOpenSSL);
   KIraA
 
55 - 20.05.19 - 13:03
Нет нет. Вот ошибка 
Код состояния 401. Проверка не выполнена


В прошлый раз файл ответа не указала
   Garykom
 
56 - 20.05.19 - 13:06
(55) У меня тоже самое ибо вот тут
HTTPЗапрос.Заголовки.Вставить("Authorization","Basic pxT3bdk4dGYXNzd29db4");

надо правильный свой хеш вставить вместо "pxT3bdk4dGYXNzd29db4" который я взял из примера их
   Garykom
 
57 - 20.05.19 - 13:11
"логин и пароль соединяются через двоеточие, кодируются в base64"
   KIraA
 
58 - 20.05.19 - 13:12
ВОТТТ блин. Не было у меня двоеточия
   KIraA
 
59 - 20.05.19 - 13:14
ОООООО СПАСИБО ВАМ добрый человек!!!!!!!!!! "Garykom"
   Garykom
 
60 - 20.05.19 - 13:17
Процедура kcell()
    Сервер = "api.kcell.kz";
    РесурсНаСервере = "/app/smsgw/rest/v2/messages";
    ИмяФайлаЗапроса = "";
    ИмяФайлаОтвета = "c:\tmp\kcell.txt";
    
    ИмяПользователя = "";
    ПарольПользователя = "";
    ДД = ПолучитьДвоичныеДанныеИзСтроки(ИмяПользователя+":"+ПарольПользователя, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    ХешАвторизации = Base64Строка(ДД);
    
    ssl = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Выбирать),Новый СертификатыУдостоверяющихЦентровWindows());
    Соединение = Новый HTTPСоединение(Сервер,,,,,5,ssl);
    Попытка
        HTTPЗапрос = Новый HTTPЗапрос(РесурсНаСервере);
        СтрокаТелаЗапроса = "{ 
        |""client_message_id"" : ""236234857"",
        |""sender"" : ""SMSGW"",
        |""recipient"" : ""77010000000"",
        |""message_text"" : ""тест""
        |}";
        //HTTPЗапрос.УстановитьИмяФайлаТела(ИмяФайлаЗапроса);

        HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаТелаЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
        
        HTTPЗапрос.Заголовки.Вставить("Accept","application/json, text/plain, */*");
        HTTPЗапрос.Заголовки.Вставить("Authorization","Basic "+ХешАвторизации);
        HTTPЗапрос.Заголовки.Вставить("Content-Type","application/json;charset=utf-8");
        HTTPЗапрос.Заголовки.Вставить("Content-Length", СтрДлина(СтрокаТелаЗапроса));
        
        Результат  = Соединение.ОтправитьДляОбработки(HTTPЗапрос, ИмяФайлаОтвета);
        Соединение = Неопределено;
        Если Результат.КодСостояния > 299 Тогда
            Сообщить("Код состояния " + Результат.КодСостояния + ". Проверка не выполнена");
        КонецЕсли;
    Исключение
        Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
    КонецПопытки;
КонецПроцедуры

   KIraA
 
61 - 20.05.19 - 13:22
АГА. Все отлично заработало!!!! Куда там плюсик Вам поставить? И номер телефона взять? (для помощи) :-)))


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