Имя: Пароль:
1C
1С v8
Помогите с запросом JSON
,
0 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?
1 Beduin
 
17.05.19
09:53
штука нужна, с помощью которой будешь видеть обращения эти на сервисах
2 KIraA
 
17.05.19
09:54
а поподробнее?)
3 Жан Пердежон
 
17.05.19
09:55
УстановитьТело()
4 KIraA
 
17.05.19
10:05
еще варианты?
5 Жан Пердежон
 
17.05.19
10:07
(4) серьезно? предлагаешь гадать, что у тебя спрятано в этой функции?
6 KIraA
 
17.05.19
10:10
Да не надо гадать. Помогите правильно написать, чтоб прочитать ЗапросHTTP в виде строки.
7 kennetmccormick
 
17.05.19
10:31
видимо не нравится что есть в  УстановитьТело()
попробуйте SoapUI или Postman-ом отправить
8 KIraA
 
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
Мне не понятна эта строка.
Строка = Объект.Логин + Объект.Пароль;
10 Garykom
 
гуру
20.05.19
10:20
(8) Есть даже две!
1. Нанять программиста
2. Выдать ему мануал от АПИ
11 Garykom
 
гуру
20.05.19
10:24
В Казахстане госконторы совсем оригинальные конечно
12 bootini
 
20.05.19
10:35
(0)
      ЧтениеJSON = Новый ЧтениеJSON();
        ЧтениеJSON.ОткрытьПоток(HTTPОтвет.ПолучитьТелоКакПоток());
        Попытка
            СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON, Ложь);
        Исключение
            ОписаниеОшибки = ОписаниеОшибки + ОписаниеОшибки();
            Возврат СтруктураОтвета;
        КонецПопытки;
13 KIraA
 
20.05.19
10:52
(9)
Для дальнейшего перевода в строку Base64. Возвращается данные по пользователю и паролю в зашифрованном виде
Строка = Логин + Пароль;

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

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

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

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

ИИИИИ!!!!!

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

Такой?
29 Ёпрст
 
20.05.19
11:44
(8) А где начало и конец массива ?
30 Garykom
 
гуру
20.05.19
11:45
(29) Там единичное без массива
31 KIraA
 
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"
}
]
}
32 KIraA
 
20.05.19
11:46
подскажите где тут скрин сохранить. я Вам фидлер скину
33 Ёпрст
 
20.05.19
11:48
(31) круто. И где в (8) формирование массива "messages": [ ] ?
34 Garykom
 
гуру
20.05.19
11:48
(31) Эээто же JSON не для единичного messages а для пакетного batches
35 bootini
 
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()
36 Garykom
 
гуру
20.05.19
11:49
(34)+ Должно быть ЗапросHTTP.АдресРесурса = "/app/smsgw/rest/v2/batches";
37 KIraA
 
20.05.19
11:50
(36) я же написала что поменяла на batches

в (25) Все поставила Fiddler, сделала несколько сообщений, отладила все остановы!!! в https://***/app/smsgw/rest/v2/batches.
38 Garykom
 
гуру
20.05.19
11:51
(37) Да понял, просто зачем так перескакивать не сделав единичное пытаться пакетное.
39 KIraA
 
20.05.19
11:52
(35) кодирует так же буква в букву
40 KIraA
 
20.05.19
11:53
(38) уже незнаю просто что пробывать. Вот и пошла в пакет)))
41 Ёпрст
 
20.05.19
12:07
(0) а есть уверенность, что нужно ЗащищенноеСоединениеOpenSSL делать ?
42 Garykom
 
гуру
20.05.19
12:08
(41) https://api.kcell.kz/app/smsgw/rest/v2
если я правильно понял
43 KIraA
 
20.05.19
12:11
(42) да оно
44 Garykom
 
гуру
20.05.19
12:11
Имхо я бы сделал все как в (0) только проверил что json правильный и добавил "Content-Length"
45 KIraA
 
20.05.19
12:17
(44) это еще что за параметр?
46 Garykom
 
гуру
20.05.19
12:17
(45) Размер файла/текста json
47 Garykom
 
гуру
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 Тогда
            Сообщить("Код состояния " + Результат.КодСостояния + ". Проверка не выполнена");
        КонецЕсли;
    Исключение
        Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
    КонецПопытки;
КонецПроцедуры
48 KIraA
 
20.05.19
12:42
Переменная не определена (СпособВыбораСертификатаWindows)
    ssl = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(<<?>>СпособВыбораСертификатаWindows.Выбирать),Новый СертификатыУдостоверяющихЦентровWindows()); (Проверка: Сервер)
49 Garykom
 
гуру
20.05.19
12:48
(48) убери лишнее

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

Соединение      = Новый HTTPСоединение("***", ,, , ПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси("https"), 60, Новый ЗащищенноеСоединениеOpenSSL);
55 KIraA
 
20.05.19
13:03
Нет нет. Вот ошибка
Код состояния 401. Проверка не выполнена


В прошлый раз файл ответа не указала
56 Garykom
 
гуру
20.05.19
13:06
(55) У меня тоже самое ибо вот тут

HTTPЗапрос.Заголовки.Вставить("Authorization","Basic pxT3bdk4dGYXNzd29db4");

надо правильный свой хеш вставить вместо "pxT3bdk4dGYXNzd29db4" который я взял из примера их
57 Garykom
 
гуру
20.05.19
13:11
"логин и пароль соединяются через двоеточие, кодируются в base64"
58 KIraA
 
20.05.19
13:12
ВОТТТ блин. Не было у меня двоеточия
59 KIraA
 
20.05.19
13:14
ОООООО СПАСИБО ВАМ добрый человек!!!!!!!!!! "Garykom"
60 Garykom
 
гуру
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 Тогда
            Сообщить("Код состояния " + Результат.КодСостояния + ". Проверка не выполнена");
        КонецЕсли;
    Исключение
        Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
    КонецПопытки;
КонецПроцедуры
61 KIraA
 
20.05.19
13:22
АГА. Все отлично заработало!!!! Куда там плюсик Вам поставить? И номер телефона взять? (для помощи) :-)))
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.