helpf.pro
Регистрация

v8: JSON и 1с8.3 Неверный формат данных в запросе.

dabuldakov
02.11.2016 07:37Прочитано: 6535

Добрый день! Помогите разобраться. Никак не могу понять из-за чего сервер не принимает запрос.

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

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

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

data = { "auth_key": "910c29400ebfed8c3baab93",  "method": "getStoragesList" } [/pre] Мой код:  

+ Code

Данные = Новый Структура("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.ТекущееЗначение);  КонецЕсли;  КонецЦикла;  [/pre]

Возвращает: 200 - что соединение удалось с сервером, а вот по поводу форматов "Неверный формат данных в запросе.". Проверял строку в веб сервисе без "data=" все ок. Пробывал разные кодировки, разные параметры JSON с символами и без. Заранее спасибо!)

Yandex
Возможно, вас также заинтересует
Реклама на портале
dabuldakov
02.11.2016 07:43Ответ № 1

Мой код:

Код 1C v 8.3
 Данные = Новый Структура("auth_key, method", "111333", "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, "windows-1251", ИспользованиеByteOrderMark.НеИспользовать);

Результат2 = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
РезультатОтвет2 = Результат2.ПолучитьТелоКакСтроку(КодировкаТекста.ANSI);

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(РезультатОтвет2);

Пока ЧтениеJSON.Прочитать() Цикл
ТипJSON = ЧтениеJSON.ТипТекущегоЗначения;
Если ТипJSON = ТипЗначенияJSON.Строка ИЛИ ТипJSON = ТипЗначенияJSON.Число Тогда
Сообщить(ЧтениеJSON.ТекущееЗначение);
КонецЕсли;
КонецЦикла;


andrey_71_
22.11.2016 16:27Ответ № 2
Код 1C v 8.3
 
СтруктураURI = СтруктураURI("http://адрессервера:порт/адресресурса");
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
Попытка
Соединение = Новый HTTPСоединение (СтруктураURI.Хост, СтруктураURI.Порт);
Исключение
Сообщить("Не удалось установить соединение с сервером");
Сообщить (ОписаниеОшибки());
КонецПопытки;
ФайлОтправки = Новый Файл(Объект.КаталогФайлов + "\Akt_robit.xml");
Если ФайлОтправки.Существует() Тогда
РазмерФайлаОтправки = ФайлОтправки.Размер();
Иначе
Предупреждение("Файл не найден!");
КонецЕсли;
Строка64 = Base64Строка(Новый ДвоичныеДанные(Объект.КаталогФайлов + "\Akt_robit.xml"));
Массив64 = Преобразовать64(Строка64, );
СтруктураЗапроса = Новый Структура;
СтруктураЗапроса.Вставить("KeyGroup","34554355");
СтруктураЗапроса.Вставить("ID","1");
СтруктураЗапроса.Вставить("Data",Строка64);
Запрос = Документоборот_IFIN.СформироватьСтрокуJSON(СтруктураЗапроса);
ЗапросPOST = Запрос;
ЗаголовкиHTTP = Новый Соответствие;
ЗаголовкиHTTP.Вставить("Content-Type","application/json");
ЗапросНН = Новый HTTPЗапрос(СтруктураURI.ПутьНаСервере,ЗаголовкиHTTP);
ЗапросНН.УстановитьТелоИзСтроки(Запрос);
Попытка
НТТРОтвет_ = Соединение.ОтправитьДляОбработки(ЗапросНН, Объект.ВыходнойФайл);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;

Рабочий вариант кода передачи файла для обработки

и к нему процедуры и функции:

Код 1C v 8.3
 

 Функция СтруктураURI(Знач СтрокаURI) Экспорт

СтрокаURI = СокрЛП(СтрокаURI);

// схема
Схема = "";
Позиция = Найти(СтрокаURI, "://");
Если Позиция > 0 Тогда
Схема = НРег(Лев(СтрокаURI, Позиция - 1));
СтрокаURI = Сред(СтрокаURI, Позиция + 3);
КонецЕсли;


// строка соединения и путь на сервере
СтрокаСоединения = СтрокаURI;
ПутьНаСервере = "";
Позиция = Найти(СтрокаСоединения, "/");
Если Позиция > 0 Тогда
ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1);
СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1);
КонецЕсли;

// информация пользователя и имя сервера
СтрокаАвторизации = "";
ИмяСервера = СтрокаСоединения;
Позиция = Найти(СтрокаСоединения, "@");
Если Позиция > 0 Тогда
СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1);
ИмяСервера = Сред(СтрокаСоединения, Позиция + 1);
КонецЕсли;

// логин и пароль
Логин = СтрокаАвторизации;
Пароль = "";
Позиция = Найти(СтрокаАвторизации, ":");
Если Позиция > 0 Тогда
Логин = Лев(СтрокаАвторизации, Позиция - 1);
Пароль = Сред(СтрокаАвторизации, Позиция + 1);
КонецЕсли;

// хост и порт
Хост = ИмяСервера;
Порт = "";
Позиция = Найти(ИмяСервера, ":");
Если Позиция > 0 Тогда
Хост = Лев(ИмяСервера, Позиция - 1);
Порт = Сред(ИмяСервера, Позиция + 1);
КонецЕсли;

Результат = Новый Структура;
Результат.Вставить("Схема", Схема);
Результат.Вставить("Логин", Логин);
Результат.Вставить("Пароль", Пароль);
Результат.Вставить("ИмяСервера", ИмяСервера);
Результат.Вставить("Хост", Хост);
Результат.Вставить("Порт", ?(Порт <> "", Число(Порт), Неопределено));
Результат.Вставить("ПутьНаСервере", ПутьНаСервере);

Возврат Результат;

КонецФункции


Функция УстановитьСоединение (АдресСервера, Порт = Неопределено, Пользователь="", Пароль="", Защищенное = Ложь) Экспорт
Если Порт = Неопределено Тогда 
Если Защищенное Тогда
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
Попытка
Соединение = Новый HTTPСоединение (АдресСервера,,Пользователь,Пароль,,,ЗащищенноеСоединение);
Исключение
Сообщить ("Не удалось установить соединение с сервером");
Сообщить (ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки
Иначе
Попытка
Соединение = Новый HTTPСоединение (АдресСервера);
Исключение
Сообщить ("Не удалось установить соединение с сервером");
Сообщить (ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки
КонецЕсли;
иначе
Если Защищенное Тогда
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
Попытка
Соединение = Новый HTTPСоединение (АдресСервера,Порт,Пользователь,Пароль,,,ЗащищенноеСоединение);
Исключение
Сообщить ("Не удалось установить соединение с сервером");
Сообщить (ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки
Иначе
Попытка
Соединение = Новый HTTPСоединение (АдресСервера, Порт);
Исключение
Сообщить ("Не удалось установить соединение с сервером");
Сообщить (ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки
КонецЕсли;
КонецЕсли;
Возврат Соединение;
КонецФункции


// Для работы с JSON
#Область ФункцииПреобразования
 Функция ПреобразоватьвСистему(Число10,система) Экспорт
Если система > 36 или система < 2 тогда
Сообщить("Выбранная система исчисления не поддерживается");
Возврат -1;
КонецЕсли;

СтрокаЗначений = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
СтрокаСистема = "";
Пока Число10 > 0 цикл
РезДеления = Число10/система;
ЧислоСистема = цел(РезДеления);
остатокОтДеления = Число10 - система*(ЧислоСистема);
СтрокаСистема = сред(СтрокаЗначений,остатокОтДеления+1,1)+ СтрокаСистема;
Число10 = ?(ЧислоСистема=0,0,РезДеления); 
КонецЦикла;

Нечётное = стрДлина(СтрокаСистема) - цел(стрДлина(СтрокаСистема)/2)*2;
Если Нечётное тогда
СтрокаСистема = "0"+СтрокаСистема;
КонецЕсли;

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


&НаКлиенте
Функция URLEncode(стр) Экспорт
Длина=СтрДлина(Стр);
Итог="";
Для Н=1 По Длина Цикл
Знак=Сред(Стр,Н,1);
Код=КодСимвола(Знак);

если ((Знак>="a")и(Знак<="z")) или
((Знак>="A")и(Знак<="Z")) или
((Знак>="0")и(Знак<="9")) тогда
Итог=Итог+Знак;
Иначе
Если (Код>=КодСимвола("А"))И(Код<=КодСимвола("п")) Тогда
Итог=Итог+"%"+ПреобразоватьвСистему(208,16)+"%"+ПреобразоватьвСистему(144+Код-КодСимвола("А"),16);
ИначеЕсли (Код>=КодСимвола("р"))И(Код<=КодСимвола("я")) Тогда
Итог=Итог+"%"+ПреобразоватьвСистему(209,16)+"%"+ПреобразоватьвСистему(128+Код-КодСимвола("р"),16);
ИначеЕсли (Знак="ё") Тогда
Итог=Итог+"%"+ПреобразоватьвСистему(209,16)+"%"+ПреобразоватьвСистему(145,16);
ИначеЕсли (Знак="Ё") Тогда
Итог=Итог+"%"+ПреобразоватьвСистему(208,16)+"%"+ПреобразоватьвСистему(129,16);
Иначе
Итог=Итог+"%"+ПреобразоватьвСистему(Код,16);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Итог;
КонецФункции


&НаКлиенте
Функция СформироватьСтрокуJSONИзМассива(Объект)
СтрокаJSON = "[";

Для каждого Элемент Из Объект Цикл
Если ТипЗнч(Элемент) = Тип("Строка") Тогда
СтрокаJSON = СтрокаJSON + """" + Элемент + """";
ИначеЕсли ТипЗнч(Элемент) = Тип("Число") Тогда
СтрокаJSON = СтрокаJSON + СтрЗаменить(Строка(Элемент), Символы.НПП, "");
ИначеЕсли ТипЗнч(Элемент) = Тип("Булево") Тогда
СтрокаJSON = СтрокаJSON + Формат(Элемент, "БЛ=false; БИ=true");
ИначеЕсли ТипЗнч(Элемент) = Тип("Дата") Тогда
СтрокаJSON = СтрокаJSON + Формат(Элемент - Дата(1970,1,1,1,0,0), "ЧГ=0");
ИначеЕсли ТипЗнч(Элемент) = Тип("Массив") Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON(Элемент);
ИначеЕсли ТипЗнч(Элемент) = Тип("Структура") Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON(Элемент);
ИначеЕсли ТипЗнч(Элемент) = Тип("ТаблицаЗначений") Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON(Элемент);
Иначе
СтрокаJSON = СтрокаJSON + """" + URLEncode(Строка(Элемент)) + """";
КонецЕсли;

СтрокаJSON = СтрокаJSON + ",";
КонецЦикла;

Если Прав(СтрокаJSON, 1) = "," Тогда
СтрокаJSON = Лев(СтрокаJSON, СтрДлина(СтрокаJSON)-1);
КонецЕсли;

Возврат СтрокаJSON + "]";
КонецФункции


&НаКлиенте
Функция СформироватьСтрокуJSONИзСтруктуры(Объект)
СтрокаJSON = "[" +Символы.ПС;
СтрокаJSON = СтрокаJSON + " {"+Символы.ПС;

Для каждого Элемент Из Объект Цикл
Если Элемент.Значение = "" Тогда
Продолжить;
КонецЕсли;

СтрокаJSON = СтрокаJSON + "  "+ """" + Элемент.Ключ + """" + ":";

Если ТипЗнч(Элемент.Значение) = Тип("Строка") Тогда
СтрокаJSON = СтрокаJSON +"""" + Элемент.Значение + """";
ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("Число") Тогда
СтрокаJSON = СтрокаJSON + СтрЗаменить(Строка(Элемент.Значение), Символы.НПП, "");
ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("Булево") Тогда
СтрокаJSON = СтрокаJSON + Формат(Элемент.Значение, "БЛ=false; БИ=true");
ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("Дата") Тогда
СтрокаJSON = СтрокаJSON + Формат(Элемент.Значение - Дата(1970,1,1,1,0,0), "ЧГ=0");
ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("Массив") Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON(Элемент.Значение);
ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("Структура") Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON(Элемент.Значение);
// +++ Добавляем двоичные данные
ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("ДвоичныеДанные") Тогда
СтрокаJSON = СтрокаJSON + "["+СтрЗаменить(Элемент.Значение," ",",")+"]";
//---
ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("ТаблицаЗначений") Тогда
СтрокаJSON = СтрокаJSON + СформироватьСтрокуJSON(Элемент.Значение);
Иначе
СтрокаJSON = СтрокаJSON + """" + URLEncode(Строка(Элемент.Значение)) + """";
КонецЕсли;

Если Не Элемент.Ключ = "Data" Тогда
СтрокаJSON = СтрокаJSON + ","+Символы.ПС;
Иначе 
СтрокаJSON = СтрокаJSON + Символы.ПС;
КонецЕсли;
КонецЦикла;

Если Прав(СтрокаJSON, 1) = "," Тогда
СтрокаJSON = Лев(СтрокаJSON, СтрДлина(СтрокаJSON)-1);
КонецЕсли;

СтрокаJSON = СтрокаJSON + " }"+Символы.ПС;  
Возврат СтрокаJSON + "]";
КонецФункции


&НаКлиенте
Функция СформироватьСтрокуJSON(Объект) Экспорт
СтрокаJSON = "";

Если ТипЗнч(Объект) = Тип("Массив") Тогда
СтрокаJSON = СформироватьСтрокуJSONИзМассива(Объект);
ИначеЕсли ТипЗнч(Объект) = Тип("Структура") Тогда
СтрокаJSON = СформироватьСтрокуJSONИзСтруктуры(Объект);
ИначеЕсли ТипЗнч(Объект) = Тип("ТаблицаЗначений") Тогда
СоставСтруктуры = "";
Для каждого Колонка Из Объект.Колонки Цикл
СоставСтруктуры = СоставСтруктуры + ?(ЗначениеЗаполнено(СоставСтруктуры), ",", "") + Колонка.Имя;
КонецЦикла;

МассивСтрок = Новый Массив;
Для каждого Строка Из Объект Цикл
СтруктураКолонок = Новый Структура(СоставСтруктуры);
ЗаполнитьЗначенияСвойств(СтруктураКолонок, Строка);
МассивСтрок.Добавить(СтруктураКолонок);
КонецЦикла;

СтрокаJSON = СформироватьСтрокуJSONИзМассива(МассивСтрок);
КонецЕсли;

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


&НаКлиенте
Процедура ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, ТипДанных)
ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
НомерЗначения = 0;

Пока ТекстJSON <> "" Цикл
ПервыйСимвол = Лев(ТекстJSON, 1);
Если ПервыйСимвол = "{" Тогда
Значение = Новый Структура;
ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Структура");

Если ТипДанных = "Структура" Тогда
Результат.Вставить("Значение" + ?(НомерЗначения = 0, "", НомерЗначения), Значение);
НомерЗначения = НомерЗначения + 1;
ИначеЕсли ТипДанных = "Массив" Тогда
Результат.Добавить(Значение);
КонецЕсли;
ИначеЕсли ПервыйСимвол = "[" Тогда
Значение = Новый Массив;
ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Массив");

Если ТипДанных = "Структура" Тогда
Результат.Вставить("Значение" + ?(НомерЗначения = 0, "", НомерЗначения), Значение);
НомерЗначения = НомерЗначения + 1;
Иначе
Результат.Добавить(Значение);
КонецЕсли;
ИначеЕсли ПервыйСимвол = "}" И ТипДанных = "Структура" Тогда
ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
Если Лев(ТекстJSON, 1) = "," Тогда
ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
КонецЕсли;

Возврат;
ИначеЕсли ПервыйСимвол = "]" И ТипДанных = "Массив" Тогда
ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
Если Лев(ТекстJSON, 1) = "," Тогда
ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
КонецЕсли;

Возврат;
Иначе
Если ТипДанных = "Структура" Тогда

Поз = Найти(ТекстJSON, ":");
Если Поз = 0 Тогда
Прервать;
КонецЕсли;

ИмяЗначения = СокрЛП(Лев(ТекстJSON, Поз-1));

ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз+1));

Если Лев(ТекстJSON, 1) = "{" Тогда
Значение = Новый Структура;
ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Структура");
ИначеЕсли Лев(ТекстJSON, 1) = "[" Тогда
Значение = Новый Массив;
ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Массив");
Иначе
Поз = 0;
Для Сч = 1 По СтрДлина(ТекстJSON) Цикл
Символ = Сред(ТекстJSON, Сч, 1);
Если Символ = "," ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
Поз = Сч;
Прервать;
КонецЕсли;
КонецЦикла;

Если Поз = 0 Тогда
Значение = ТекстJSON;
ТекстJSON = "";
Иначе
Значение = Лев(ТекстJSON, Поз-1);
ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = ",", 1, 0)));
КонецЕсли;

Значение = СокрЛП(Значение);
КонецЕсли;

Результат.Вставить(ИмяЗначения, Значение);
ИначеЕсли ТипДанных = "Массив" Тогда
Поз = 0;
Для Сч = 1 По СтрДлина(ТекстJSON) Цикл
Символ = Сред(ТекстJSON, Сч, 1);
Если Символ = "," ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
Поз = Сч;
Прервать;
КонецЕсли;
КонецЦикла;

Если Поз = 0 Тогда
Значение = ТекстJSON;
ТекстJSON = "";
Иначе
Значение = Лев(ТекстJSON, Поз-1);
ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = ",", 1, 0)));
КонецЕсли;

Значение = СокрЛП(Значение);

Результат.Добавить(Значение);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры


&НаКлиенте
Функция ЗаполнитьСтруктуруИзОтветаJSON(Знач ТекстJSON) Экспорт
Результат = Новый Структура;

ТекстJSON = СтрЗаменить(ТекстJSON, "\""", """");
ТекстJSON = СтрЗаменить(ТекстJSON, """", "");
Если Лев(ТекстJSON, 1) = "{" Тогда
ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, "Структура");
ИначеЕсли Лев(ТекстJSON, 1) = "[" Тогда
МассивДанных = Новый Массив;
ЗаполнитьДанныеИзОтветаJSON(МассивДанных, ТекстJSON, "Массив");

Результат.Вставить("Значение", МассивДанных);
КонецЕсли;

Возврат Результат;
КонецФункции   
#КонецОбласти
Подсказка: Для быстрого поиска ответов - используйте 'Поиск'
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.