|
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
|
||||
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
|
мда
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |