Имя: Пароль:
1C
1С v8
JSON и 1с8.3 "Неправильный формат данных в запросе"
0 dabuldakov
 
02.11.16
06:36
Добрый день! Помогите разобраться. Никак не могу понять из-за чего сервер не принимает запрос.

Такие условия:

Внимание! При отправке запроса в формате JSON перед {} необходимо добавить “data=”. Названия и значения параметров должны быть заключены в двойные кавычки, как в примере выше.

Пример запроса из ТЗ:

data = {
"auth_key": "910c29400ebfed8c3baab93",
    "method": "getStoragesList"
}

Мой код:


Данные = Новый Структура("auth_key, method", "910c29400ebfed8c3baab935f", "getStoragesList");
        ЗаписьJSON = Новый ЗаписьJSON;
        
        //ЗаписьJSON.ПроверятьСтруктуру = Ложь;
        
        ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, "");    
        ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
        ЗаписатьJSON(ЗаписьJSON, Данные);
        
        
        СтрокаJSON = ЗаписьJSON.Закрыть();
        СтрокаJSON = "data=" + СтрокаJSON;
        
        ssl = Новый ЗащищенноеСоединениеOpenSSL();
        HTTPСоединение = Новый HTTPСоединение("api2.test.su/?json",,,,,5,ssl);
        
        HTTPЗапрос = Новый HTTPЗапрос();
        HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.ANSI, ИспользованиеByteOrderMark.НеИспользовать);
        
        Результат2 = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
        РезультатОтвет2 = Результат2.ПолучитьТелоКакСтроку(КодировкаТекста.ANSI);
        
        ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку(РезультатОтвет2);
        
        Пока ЧтениеJSON.Прочитать() Цикл
            ТипJSON = ЧтениеJSON.ТипТекущегоЗначения;
            Если ТипJSON = ТипЗначенияJSON.Строка ИЛИ ТипJSON = ТипЗначенияJSON.Число Тогда
            Сообщить(ЧтениеJSON.ТекущееЗначение);
            КонецЕсли;
        КонецЦикла;

Возвращает: 200 - что соединение удалось с сервером, а вот формат запроса не верный. Проверял строку в веб сервисе без "data=" все ок. Пробывал разные кодировки, разные параметры JSON с символами и без.
1 dabuldakov
 
02.11.16
06:57
"Неверный формат данных в запросе." Конкретный текст ответа сервера.
2 zva
 
02.11.16
07:20
"Названия и значения параметров должны быть заключены в двойные кавычки, как в примере выше." - Это не есть формат Json.
Метод ЗаписатьJSON() не будет значения с типом число, массив и т.д. заключать в кавычки, нужно все руками собирать...
3 DrZombi
 
гуру
02.11.16
07:49
(0) 1С криво считывает JSON формат, который был сгенерирован не 1С. :)
4 dabuldakov
 
02.11.16
08:01
1) Вот что получается на выходе Метод ЗаписатьJSON()

"data={"auth_key":"123abc","method":"getStoragesList"}"

2) Вот что я собрал с Символ(34) "data={"auth_key":"123abc","method":"getStoragesList"}"
5 zva
 
02.11.16
08:54
(4) Если впереди непонятный символ, то скорей всего BOM
Можно попробовать HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, "CESU-8");
6 dabuldakov
 
02.11.16
09:40
(5) Пробывал, сейчас еще раз попробывал. Тоже самое.
7 Сниф
 
02.11.16
10:05
СтрокаJSON = "data={auth_key:123abc,method:getStoragesList}" ;

А если так? Без внутренних кавычек.
8 dabuldakov
 
02.11.16
11:50
(7) Попробовал, тоже самое.
Независимо от того, куда вы едете — это в гору и против ветра!