CompositeToken в новом Microsoft.Azure.Cosmos SDK - PullRequest
0 голосов
/ 27 сентября 2019

Я выполняю миграцию из Microsoft.Azure.DocumentDB.Core SDK в новый Microsoft.Azure.Cosmos SDK (версия 3.2).

Старый SDK возвращает ContinuationToken в свойстве ResponseContinuation и выглядит следующим образомthis:

+RID:knNRALdSjOBBAQAAAAAAAA==#RT:1#TRC:10#RTD:fUTWI3DNPK3FpLhdCXlVBTMxMjouMTouMjlVMjg7MTQ7MTkvMTE6ODgyOFsA#ISV:2#IEO:65536#FPC:AgEAAAAKAAyBIwBA3L8PAAQ=

Новый SDK возвращает его в свойстве ContinuationToken в виде строки JSON, представляющей "CompositeToken" объект, и выглядит так:

[{"compositeToken":{"token":"+RID:xS0oAMD5rWYLAAAAAAAAAA==#RT:1#TRC:2#RTD:fUTWI3DNPK3FpLhdCXlVBTMxMjouMTouMzhVMTE7NTc7NDUvNjc2NDozNFsA#ISV:2#IEO:65551#FPC:AQkAAAAAAAAADQAAAAAAAAA=","range":{"min":"","max":"FF"}},"orderByItems":[{"item":"2019-09-27T00:46:34.5653923Z"}],"rid":"xS0oAMD5rWYLAAAAAAAAAA==","skipCount":0,"filter":null}]

Когда я вытаскиваю только токен:

+RID:xS0oAMD5rWYLAAAAAAAAAA==#RT:1#TRC:2#RTD:fUTWI3DNPK3FpLhdCXlVBTMxMjouMTouMzhVMTE7NTc7NDUvNjc2NDozNFsA#ISV:2#IEO:65551#FPC:AQkAAAAAAAAADQAAAAAAAAA=

я получаю следующую ошибку:

Недопустимый JSON в токене продолжения + RID: xS0oAMD5rWYLAAAAAAAAA == # RT: 1 # TRC:2 # RTD: z9path31ttPskBzzyJFdBTQ0NDQ0AA == # ISV: 2 # IEO: 65551 # FPC: AQkAAAAAAAAADQAAAAAAAAA = для контекста OrderBy ~, исключение: при анализе значения обнаружен неожиданный символ: +.Путь '', строка 0, позиция 0.

Но если я передам весь составной токен, это сработает.Я немного сбит с толку, так как оба SDK являются всего лишь варперами для использования сервиса CosmosDB. Так в чем же разница?Я хотел бы просто использовать более короткий объект токена, если смогу, так как он намного меньше и им легче управлять, если он представлен в виде API.Новый CompositeToken кодируется Swagger и добавляет символ / перед каждой кавычкой примерно так:

[{/"compositeToken/":{/"token":/"+RID:xS0oAMD5rWYLAAAAAAAAAA==#RT:1#TRC:2#RTD:fUTWI3DNPK3FpLhdCXlVBTMxMjouMTouMzhVMTE7NTc7NDUvNjc2NDozNFsA#ISV:2#IEO:65551#FPC:AQkAAAAAAAAADQAAAAAAAAA=/",/"range/":{/"min/":/"/",/"max/":/"FF/"}},/"orderByItems/":[{/"item/":/"2019-09-27T00:46:34.5653923Z/"}],/"rid/":/"xS0oAMD5rWYLAAAAAAAAAA==/",/"skipCount/":0,/"filter/":null}]

Это означает, что я должен правильно декодировать строку, чтобы использовать ее, которая выглядит как дополнительный бурдонна потребителей API.Я что-то пропустил?Кажется, что нет большого количества документации о том, что этот CompositeToken делает с новым SDK и почему у нас есть это изменение.

EDIT

Я обнаружил, что если ядобавьте .Replace ("\" "," '") к возвращенному ContinuationToken в новом SDK. Теперь у меня есть версия токена, которую мои потребители API могут использовать для передачи на следующую страницу, так какодинарные кавычки не будут автоматически кодироваться. Однако я не уверен, что это самый чистый способ справиться с этим, и хотел бы получить некоторые мнения. Ни один из примеров в проекте GitHub не касается этого. Мне также было интересно, какие дополнительные свойства такиепоскольку «range» и «orderByItems» используются в составном токене, поскольку он не задокументирован явно.

EDIT 2

Оказывается, что замена двойных кавычек на одинарныекавычки работают, когда я использую Swagger UI, но не когда я использую Почтальон. Очень странно. Тот же самый точный вызов, который работает в Swagger (с использованием единой кавычки составного токена), даетмне следующая ошибка при использовании Почтальона:

Код статуса ответа не указывает на успех: 400 Подстатус: 0 Причина: (Неверный JSON в маркере продолжения [{'ComboToken': {'token': 'RID: xS0oAMD5rWYLAAAAAAAAAA == for OrderBy ~ Context, исключение: неопределенная строка.Ожидаемый разделитель: '.Путь '[0] .compositeToken.token', строка 1, позиция 58.).

РЕДАКТИРОВАТЬ 3

Вот как выглядит необработанное продолжение продолжение, когдаон возвращается как SwaggerUI, так и почтальоном.Как видите, строка содержит двойные кавычки, поэтому потребитель получает результаты с дополнительными обратными слешами, добавленными в строку, чтобы избежать двойных кавычек.Очевидно, что просто передача его обратно как есть приводит к недопустимой ошибке JSON, которая требует, чтобы ее исправили либо пользователь, либо служба.

SwaggerUI

Postman

Есть ли лучшая практика для управления этим?Также думал о том, чтобы извлечь только свойство «токен» и передать его обратно пользователю (поскольку это то, что использовалось в предыдущем SDK), а затем внедрить его обратно в строку CompositeToken при возврате, поскольку оно выглядит так, как будто остальные свойстваCompositeToken никогда не изменится (возможно, это то, что сделал предыдущий SDK?) - но я обеспокоен тем, что в будущем этот формат может сломаться.

РЕДАКТИРОВАТЬ 4

Для справки вот как выглядело продолжение в предыдущем SDK:

PreviousSDK

EDIT 5

Я выяснил, почему токен, в котором двойные кавычки были заменены одинарными, не работал в Почтальоне.Кажется, существует известная ошибка, при которой Postman удаляет любые символы после первого хеш-символа в строковых параметрах: https://github.com/postmanlabs/postman-app-support/issues/6023, поскольку в токене есть несколько «#», это всегда будет обрезать ввод при передаче через Postman какстрока запроса.Прекрасно работает при попадании в тело.

...