установите messagettl сообщения в очередь Azure с помощью python

#python-3.x #python-requests #azure-queues

#python-3.x #python-запросы #azure-очереди

Вопрос:

Я пытаюсь отправить сообщение в службу очередей Azure с помощью python3, выполнив запрос POST и указав messagettl , на -1 который указывает, что срок действия сообщения не истекает. В документе https://docs.microsoft.com/en-us/rest/api/storageservices/put-message Я должен указать Authorization ключ и Date который указывает время, в которое был инициирован ответ (оба параметра обязательны), а тело должно быть XML, вот что я сделал:

 url = "https://MyStorageAccountName.queue.core.windows.net/MyQueueName?messagettl=-1"
xml = """<?xml version='1.0' encoding='utf-8'?>
<QueueMessage>  
<MessageText>First message</MessageText>  
</QueueMessage> """

headers = {'Content-Type': 'application/xml',
'Authorization' : 'SharedKey MyStorageAccountName:MyKey1....==',
'Date' : str(datetime.utcnow())}

print(requests.post(url, data=xml, headers=headers).text)
 

И ответ — ошибка:

 <?xml version="1.0" encoding="UTF-8"?>
<Error>
   <Code>AuthenticationFailed</Code>
   <Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:44d1fd4c-c003-001d-215...000
Time:2020-11-20T15:39:10.9730253Z</Message>
   <AuthenticationErrorDetail>The Date header in the request is incorrect.</AuthenticationErrorDetail>
</Error>
 

какую часть головоломки мне не хватает?

Обновить:

В заголовках я исправил проблему, заменив str(datetime.utcnow()) на format_date_time(mktime(datetime.now().timetuple())) и исправил связанную ошибку даты, но у меня новая ошибка, и я не знаю, как подписать мой ключ:

 <?xml version="1.0" encoding="UTF-8"?>
<Error>
   <Code>AuthenticationFailed</Code>
   <Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:359305a5-a003-0034...
Time:2020-11-20T15:59:12.4611176Z</Message>
   <AuthenticationErrorDetail>The MAC signature found in the HTTP request 'HACSNj/4PwH...MyKey...YJQ==' is not the same as any computed signature. Server used following string to sign: 'POST

application/xml
Fri, 20 Nov 2020 15:59:09 GMT
/MystorageAccount/MyQueueName'.</AuthenticationErrorDetail>
</Error>
 

Ответ №1:

Я думаю, что использовать python SDK для этого намного проще, просто попробуйте приведенный ниже код:

 from azure.storage.queue import QueueClient

connectionString = "<storage account connection string>"
queueName = "<queue name>"

queueClient = QueueClient.from_connection_string(connectionString, queueName)

queueClient.send_message(content = 'hello sdk', time_to_live=-1)
 

Результат:

введите описание изображения здесь

Для получения информации о клиентском sdk очереди python просто обратитесь к этому документу .

Комментарии:

1. Я не знаю, как я не видел этого в документе, но спасибо @Stanley, ты спас меня!