2016-09-30 1 views
1

Я использую DocumentDB и хочу получить через REST-API конкретный document из одного из моих collections с предоставленным запросом.DocumentDB: Не удается получить доступ к документам в моей коллекции

Я хочу проверить вызов с помощью Почтальона. Я настроил заголовки и токен аутентификации, и все работает так, как ожидалось (например, я могу получить список всех моих collections), но я не могу прочитать documents.

Я звоню следующий URI:

POST https://xxx.azure.com/dbs/testDB/colls/offer/docs 

авторизации Токен генерируется со следующими параметрами:

verb: "POST" 
resourceType: "docs" 
resourceID: "dbs/testDB/colls/offer" 
x-ms-date: ... 
masterkey: "P8riQ...aMORA==" 

Заголовки:

x-ms-documentdb-isquery: True 
x-ms-date: ... 
authorization: generated token 
x-ms-version: 2015-08-06 
Content-Type: application/x-www-form-urlencoded 

Тело (x- www-form-urlencoded):

query: SELECT * FROM offer 
parameters: [] 

Но ответ от Почтальон всегда:

{ 
    "code": "Unauthorized", 
    "message": "The input authorization token can't serve the request. Please check that the expected payload is built as per the protocol, and check the key being used. Server used the following payload to sign: 'post\ndocs\ndbs/testDB/colls/offer\nfri, 30 sep 2016 13:47:32 gmt\n\n'\r\nActivityId: a76408d...e08cef" 
} 

Что я делаю неправильно?

ответ

0

Я нашел это немного разочаровывающим, чтобы работать, поэтому я создал сообщение в блоге, которое проведет вас через него - с помощью powershell для построения вызовов, но процесс и формат строк являются важной частью. У меня возникли проблемы с форматированием даты и строками для определения ресурсов, которые вам нужны для запроса.

Посмотрите на Managing DocumentDB with powershell - Я обнаружил, что сообщения об ошибках были достаточно важны, проверьте входы, которые вы создаете, и детали в выходном сообщении об ошибке.

+0

спасибо. Я сделал те же шаги, что и ваш блог-пост, и я могу получить все документы в определенной коллекции или во всех базах данных, но я не могу выполнить POST-запрос, чтобы получить определенный диапазон документов, потому что ответ всегда «несанкционирован» (пожалуйста, проверьте мой вопрос, я не знаю, что я делаю что-то неправильно с ResoureID и ResourceType). –

+0

Вы должны использовать GET для извлечения документов, но POST для обновления/вставки (это REST way - полагается на HTTP-глаголы для определения того, как работает функция и что она делает) –

+0

Спасибо, но я использую POST в качестве глагола и правильного идентификатора ресурса «dbs/testDB/colls/offer» (пожалуйста, проверьте мой вопрос), но он не делает –

1

Похоже, что вы неправильно использовали Rest API. Если вы пытаетесь сделать Querying Offers, POST uri должен быть как с https://{databaseaccount}.documents.azure.com/offers.

И если вы пытаетесь сделать Query Documents (что фактически может быть тем, чего вы хотите достичь). POST uri должен быть https://{databaseaccount}.documents.azure.com/dbs/{db-id}/colls/{coll-id}/docs

Пожалуйста, попробуйте следовать за https://msdn.microsoft.com/en-us/library/azure/mt670897.aspx, чтобы impelemnt API доступа запросить документы.

обновление

И пытаются генерировать маркер авторизации с:

verb: "POST" 
resourceType: "docs" 
resourceID: "dbs/{db-id}/colls/{coll-id}" 
x-ms-date: ... 
masterkey: "P8riQ...aMORA==" 

Я использовал фрагмент кода в этом ответе DocumentDB REST API with Postman outputs always "Unauthorized" error,

getAuthorizationTokenUsingMasterKey("POST", "docs", "dbs/testdb/colls/offer", headers, "{key}")); 

генерировать маркер авторизации. И работал отлично на PostMan: enter image description here

+0

Спасибо. Но в чем разница? Я могу просто заметить недостающие «документы» в конце моего идентификатора ресурса, но даже с этим он не работает:/Если я попробую ваш первый намек, так что короткий URL-адрес, я получаю сообщение об ошибке «URL-адрес запроса недействителен» –

+0

В коллекции DocumentDB указан соответствующий уровень производительности, представленный как ** Предложение **. Для получения подробной информации между предложением и документами вы можете обратиться к https://msdn.microsoft.com/en-us/library/azure/mt632095.aspx & https://msdn.microsoft.com/en-us/library/ azure/mt489082.aspx –

+0

Спасибо, но я думаю, что мой вопрос не понял. Моя коллекция - это «предложение». У меня также есть коллекции, которые называются «продуктами», «магазинами» и т. Д.Поэтому представьте себе такую ​​же описанную проблему с «resourceID: dbs/testDB/colls/products/docs» и «URL https: // xxx.documents.azure.com/dbs/testDB/colls/products/docs' –

0

Я попытался воспроизвести ваш сценарий, и я смог успешно запросить документы, используя Postman.

Для устранения неполадок, вот параметры, которые я использовал, чтобы вычислить маркер (в том числе фиктивного ключа, так что вы можете попробовать, а):

  • Auth лексем Параметры:

    verb: "POST" 
    resourceId: "dbs/testDB/colls/offer" 
    resourceType: "docs" 
    key: "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmn==" 
    keyType: "master" 
    tokenVersion: "1.0 
    date: "Thu, 06 Oct 2016 04:31:33 GMT" 
    
  • Полученный маркер:

    type%3dmaster%26ver%3d1.0%26sig%3dC373dEIadokxR4z%2bSSpmbpVYw4e7mk9Vhae%2f5nLaD%2bU%3d 
    
  • Запрос глагол и URI,

    POST https://xxx.documents.azure.com/dbs/testDB/colls/offer/docs 
    
  • Заголовки:

    authorization: type%3dmaster%26ver%3d1.0%26sig%3dC373dEIadokxR4z%2bSSpmbpVYw4e7mk9Vhae%2f5nLaD%2bU%3d 
    x-ms-date: Thu, 06 Oct 2016 04:31:33 GMT 
    x-ms-version: 2015-08-06 
    x-ms-documentdb-isquery: true 
    Content-Type: application/query+json 
    
  • тела:

    {"query":"SELECT * FROM c"} 
    

Примечание Я использовал другой Content-Type от одного, который вы используете. Я не думаю, что это то, что вызывает вашу проблему, так как вы получите ответ «Плохой запрос», если это проблема.

Подводя итог, я считаю, что проблема заключается в генераторе токенов, поскольку я использовал те же параметры, что и для создания токена, и тот же URI для запроса POST.

Я отправляю фиктивный мастер-ключ, дату и итоговый токен, чтобы вы могли использовать его для тестирования генератора токенов. Надеюсь, что эта помощь поможет сузить источник вашей проблемы.