Имя: Пароль:
1C
1С v8
v8: JSON, сериализация и GUID
0 Nicole
 
02.09.19
15:49
Есть веб-сервис. Веб-сервис на запрос присылает ответ вида {"CaseId": "ac556f2e-616d-4c07-9867-85febf0f6c06"}.
Но когда я полученный CaseID пытаюсь отправить снова в качестве параметра уже другого запроса, то получаю ошибку вида
"Ошибка десериализации запроса: Cannot deserialize the current JSON object (e.g. {\"name\":\"value\"}) into type 'System.Guid' because the type requires a JSON primitive value (e.g. string, number, boolean, null) to deserialize correctly".
Буду очень признательна, если кто-нибудь пояснит мне, как JSON работает с типом GUID.
1 Dzenn
 
гуру
02.09.19
15:54
JSON никак не работает с типом GUID. Для JSON вся информация - это либо строка, либо число, либо булево, либо NULL. В данном случае, GUID - это строка, и приведение её к какому-то другому типу (например, тип УникальныйИдентификатор в 1С) - целиком твоя забота.
2 Вафель
 
02.09.19
15:55
с вероятностью 99% - это бом
3 Nicole
 
02.09.19
16:06
(2) Попробовала разные варианты: Использовать, НеИспользовать, UTF8, UTF16 - без изменений...
4 Nicole
 
02.09.19
16:07
(1) А мне и не надо ее приводить ни к какому другому типу. Мне надо ее получить и тут же передать в следующий GET-запрос.
5 Александр Б
 
02.09.19
16:10
(0) Очевидно, что проблема где-то в коде. Тут не телепаты. Ошибку без кода найти сложно.
6 Александр Б
 
02.09.19
16:13
А вообще правильный ответ в (1)
7 Nicole
 
02.09.19
16:14
Попытка        
    HTTPСоединение = Новый HTTPСоединение("api.casebook.ru", , , , , 120, ЗащищенноеСоединение);        
Исключение
    ПредставлениеОшибки = НСтр("ru = 'При создании соединения произошла ошибка.'");                        
    Возврат ПредставлениеОшибки;
КонецПопытки;            
    
HTTPЗаголовок = ПараметрыСоединения.HTTPЗаголовок;
АдресМетода   = "/WebService.svc/web/GetCaseCommon";

ТелоЗапросаJSON = ОбъектВТекстJSON(Новый Структура("CaseId", ИдентификаторДела));
    
HTTPЗапрос = Новый HTTPЗапрос(АдресМетода, HTTPЗаголовок);    
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапросаJSON, КодировкаТекста.UTF16, ИспользованиеByteOrderMark.Использовать);            
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
8 Nicole
 
02.09.19
16:16
(1) Хорошо, что мне передать в качестве параметра запроса CaseId?
9 Мимохожий Однако
 
02.09.19
16:17
(8) "ac556f2e-616d-4c07-9867-85febf0f6c06"
10 Вафель
 
02.09.19
16:17
Что в переменной ТелоЗапросаJSON
11 Nicole
 
02.09.19
16:21
(9) Так именно это значение я и передаю.
12 Nicole
 
02.09.19
16:21
(9) Просто, безо всяких преобразований.
13 Nicole
 
02.09.19
16:25
{
  "Page": 1,
  "PageSize": 50,
  "TotalCount": 54,
  "PagesCount": 2,
  "Items": [
    {
      "CaseId": "d0080cae-f213-48a4-93f4-599c4647f5b4",
      ........

Вот, что мне приходит.  
"d0080cae-f213-48a4-93f4-599c4647f5b4" это значение параметра "CaseId" для другого запроса.

Если я формирую:
ТелоЗапросаJSON = {"CaseId": "d0080cae-f213-48a4-93f4-599c4647f5b4"}
и отправляю, то получаю вышеуказанную ошибку.
14 Александр Б
 
02.09.19
16:33
(13) Это не ошибка. Это ответ успешно обработанного запроса с сервера. Т.е. сервер принял запрос без ошибок. Проанализировал данные, и сказал, что что-то не соответствует формату запроса.
Вникайте в документацию к веб-сервису, или узнайте у его разработчика, что не так. Тут исключительно частная специфика.
15 Александр Б
 
02.09.19
16:34
(14) А может я путаю что-то. В любом случае, информации недостаточно.
16 Windyhead
 
02.09.19
16:34
(13) в (4) вы пишете что второй запрос будет GET, а в 13 говорите что формируете тело для второго запроса ТелоЗапросаJSON = {"CaseId": "d0080cae-f213-48a4-93f4-599c4647f5b4"}
это как бы для POST
Может быть проблема в этом?
17 Windyhead
 
02.09.19
16:36
Если у вас второй запрос будет GET то передавайте ему в ПАРАМЕТР , а не телом запроса
18 dmt
 
02.09.19
16:36
(0) что help по апи говорит, что ждет в качестве параметров /WebService.svc/web/GetCaseCommon?
19 Nicole
 
02.09.19
16:39
(18) CaseId
20 Nicole
 
02.09.19
16:40
(14) Я потому говорю, что это ошибка, что HTTPОтвет.КодСостояния = 400.
Если бы сервер принял запрос без ошибок, то HTTPОтвет.КодСостояния равнялся бы 200.
21 Nicole
 
02.09.19
16:41
(16) Простите, перепутала, POST конечно же.
22 Nicole
 
02.09.19
16:43
Метод GetCaseCommon
Возвращает расширенную информацию по делу общей юрисдикции.

Тестовый вызов:
https://api.casebook.ru/Test/GetCaseCommon

Входные параметры:
Название   Тип    Описание
CaseId     Guid   Идентификатор дела
23 Вафель
 
02.09.19
16:57
а какой формат json требуется?
24 Nicole
 
02.09.19
16:59
(23) То есть?
25 dmt
 
02.09.19
17:00
Т.к. это секретный апи, только совет на попробовать:

В заголовке запроса:
Content-Type = application/x-www-form-urlencoded

В теле запроса:
CaseId=d0080cae-f213-48a4-93f4-599c4647f5b4


В тестовом https://api.casebook.ru/Test/GetCaseCommon имя параметра, что интересно, не CaseId, а Request
26 Вафель
 
02.09.19
17:05
но ошибка то явно говорит, что пытается из json десериализовать
27 Nicole
 
02.09.19
17:10
(25) У них там везде написано Request.
28 Nicole
 
02.09.19
17:10
(25) А что означает Content-Type = application/x-www-form-urlencoded?
29 Nicole
 
02.09.19
17:46
(25) Знаете, теперь HTTP ответ возвращает только код состояния = 400, и все, и никакого описания ошибки...
30 Nicole
 
02.09.19
18:01
Впрочем, и ответа на запрос тоже нет. Мальчики, может, есть еще у кого-нибудь какие-нибудь идеи? Заранее просто ОГРОМНОЕ человеческое спасибо!
31 bootini
 
02.09.19
18:03
попробуй нормально json сформировать:


    ЗаписьJSONЗаказа = Новый ЗаписьJSON;
    ЗаписьJSONЗаказа.ПроверятьСтруктуру = Истина;
    ЗаписьJSONЗаказа.УстановитьСтроку(Новый ПараметрыЗаписиJSON(,Символы.Таб));

    ЗаписьJSONЗаказа.ЗаписатьНачалоОбъекта();
    
    ЗаписьJSONЗаказа.ЗаписатьИмяСвойства("CaseId");
    ЗаписьJSONЗаказа.ЗаписатьЗначение(СокрЛП(ИдентификаторДела));

    ЗаписьJSONЗаказа.ЗаписатьКонецОбъекта();
    
    СтрокаJSONЗапрос = ЗаписьJSONЗаказа.Закрыть();
32 Nicole
 
03.09.19
08:29
(31) Попробовала. Все без изменений.
33 Nicole
 
03.09.19
10:30
Up.
34 bootini
 
03.09.19
10:35
API есть? Как запрос должен выглядеть, какие заголовки устанавливать?
35 Nicole
 
03.09.19
10:40
Согласно разделу help запрос должен выглядеть так:
{
"СaseID": "d0080cae-f213-48a4-93f4-599c4647f5b4"
}

Про заголовки ничего не сказано.

Мои заголовки:
HTTPЗаголовок = Новый Соответствие();
HTTPЗаголовок.Вставить("Content-Type", "text/json; charset=utf-16");            
HTTPЗаголовок.Вставить("Accept",       "text/json; charset=utf-16");                        
С этими заголовками я получаю ответы на все другие запросы (по ИНН, ОГРН и т.п.), кроме этого.
36 rogachev
 
03.09.19
10:59
http://edu.1c-uc3.ru/cu/ru_RU/
ДубровинАА пароль  4117

заходи смотри курс про JSON
37 bootini
 
03.09.19
11:22
(35) Если так, то запрос правильный
ставь Fiddler смотри что уходит в запросе
38 3achem
 
03.09.19
11:33
(7) Покажите тело запроса
39 Nicole
 
03.09.19
11:36
(36) Спасибо, смотрю.
(38)
{
"СaseID": "d0080cae-f213-48a4-93f4-599c4647f5b4"
}
40 Nicole
 
03.09.19
11:50
(37) fiddler поставила, еще бы понять, куда смотреть...
41 3achem
 
03.09.19
11:53
(39) [] не хотите поставить?
42 Nicole
 
03.09.19
11:54
(41) Куда?
43 bootini
 
03.09.19
11:56
(40) запускаешь, выполняешь запрос из 1С, в правом окне ищешь свое соединение по адресу и запросу и ставишь на него курсор, в левом закладка inspector, подзакладка JSON, там покажет в верхнем окне какой запрос ушел на сервер, в нижнем ответ
44 Nicole
 
03.09.19
12:01
(43) Посмотрела, но там что-то странное: 0 и x0
45 ДенисЧ
 
03.09.19
12:06
(41)  3achem
))
46 ДенисЧ
 
03.09.19
12:06
?
47 Вафель
 
03.09.19
12:16
тут вопрос в том, то же на самом деле ожидает принимающая сторона
48 Nicole
 
03.09.19
12:17
(47) вот сейчас пытаюсь от них добиться... самое главное, другие методы работают, затык только с методами, где входящим параметром выступает CaseID
49 bootini
 
03.09.19
12:28
Попробовал фидлером отправить ваш запрос:

HTTP/1.1 400 BadRequest
Ошибка десериализации запроса: Incoming messages must have a body format of Raw. Is a ContentTypeMapper set on the WebHttpBinding?</

похоже там массив строк ждет
50 bootini
 
03.09.19
12:31
тогда как то так надо:

    ЗаписьJSONЗаказа = Новый ЗаписьJSON;
    ЗаписьJSONЗаказа.ПроверятьСтруктуру = Истина;
    ЗаписьJSONЗаказа.УстановитьСтроку(Новый ПараметрыЗаписиJSON(,Символы.Таб));
    

    ЗаписьJSONЗаказа.ЗаписатьНачалоОбъекта();

ЗаписьJSONЗаказа.ЗаписатьНачалоМассива();    
    ЗаписьJSONЗаказа.ЗаписатьИмяСвойства("CaseId");
    ЗаписьJSONЗаказа.ЗаписатьЗначение(СокрЛП(ИдентификаторДела));
ЗаписьJSONЗаказа.ЗаписатьКонецМассива();

    ЗаписьJSONЗаказа.ЗаписатьКонецОбъекта();

    
    СтрокаJSONЗапрос = ЗаписьJSONЗаказа.Закрыть();
51 Вафель
 
03.09.19
12:31
(49) как ты из этого понял про массив?
52 bootini
 
03.09.19
12:31
(50) Либо Объект внутри массива
53 Nicole
 
03.09.19
12:41
(49) Знаете, подобную ошибку я уже получала. Поигралась с bom, и ошибка ушла. Сейчас у меня так:

HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапросаJSON, КодировкаТекста.UTF16, ИспользованиеByteOrderMark.Использовать);
54 bootini
 
03.09.19
12:42
(51) да с массивом не то
55 bootini
 
03.09.19
12:53
Попробовал отправить с заголовками
СaseID=d0080cae-f213-48a4-93f4-599c4647f5b4

дал ответ
body><h1>Object Moved</h1>This document may be found <a HREF="https://api.casebook.ru/WebService.svc/web/GetCaseCommon">here</a></body>;, т.е. работает
56 bootini
 
03.09.19
12:53
Адрес метода поменяй
HTTPЗаголовок = ПараметрыСоединения.HTTPЗаголовок;
АдресМетода   = "/WebService.svc/web/GetCaseCommon";
на
АдресМетода   = "WebService.svc/web/GetCaseCommon";
57 Nicole
 
03.09.19
12:58
(56) Попробовала, но это ничего не дает. Те методы, которые работали, так и работают, метод, который Не работал, - нет.
58 Вафель
 
03.09.19
13:05
а какой логин пароль? чтоб потренироваться?
59 Nicole
 
03.09.19
13:15
Вопрос решен. Надо было передавать просто значение CaseID, без указания параметра.

ТелоЗапросаJSON = """d0080cae-f213-48a4-93f4-599c4647f5b4""";
60 Nicole
 
03.09.19
13:18
То есть для некоторых методов нужно указывать названия параметров, а для некоторых - отправлять значение параметра прямо в тело запроса.
61 3achem
 
03.09.19
13:19
(59) Разработчики сервиса молодцы (уволить)
62 Nicole
 
03.09.19
13:22
(61) Да нет, все это было указано в help, сейчас я это понимаю, просто внимание не акцентировано именно на этом пункте... а я еще и спец невеликий...
63 Nicole
 
03.09.19
13:23
Всем большое спасибо за обсуждение и помощь, узнала много полезного и нового.
64 bootini
 
03.09.19
13:31
мда
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший