diff --git a/sdk/servicebus/azure-servicebus/CHANGELOG.md b/sdk/servicebus/azure-servicebus/CHANGELOG.md index e85ed6c56cd8..db151cf33129 100644 --- a/sdk/servicebus/azure-servicebus/CHANGELOG.md +++ b/sdk/servicebus/azure-servicebus/CHANGELOG.md @@ -2,6 +2,9 @@ ## 7.0.2 (Unreleased) +**New Features** + +* Added a `body_as_str` method on `ServiceBusMessage` and `ServiceBusReceivedMessage` which returns the content of the message as a string. ## 7.0.1 (2021-01-12) diff --git a/sdk/servicebus/azure-servicebus/azure/servicebus/_common/message.py b/sdk/servicebus/azure-servicebus/azure/servicebus/_common/message.py index 8b41a9495157..9c1464d3e925 100644 --- a/sdk/servicebus/azure-servicebus/azure/servicebus/_common/message.py +++ b/sdk/servicebus/azure-servicebus/azure/servicebus/_common/message.py @@ -9,7 +9,7 @@ import uuid import logging import copy -from typing import Optional, List, Union, Iterable, TYPE_CHECKING, Any +from typing import Optional, List, Union, Iterable, TYPE_CHECKING, Any, cast import six @@ -321,6 +321,28 @@ def body(self): """ return self.message.get_data() + def body_as_str(self, encoding="UTF-8"): + # type: (str) -> str + """The content of the message as a string, if the data is of a compatible type. + + :param encoding: The encoding to use for decoding message. + Default is 'UTF-8' + :rtype: str + """ + data = self.body + try: + return "".join(b.decode(encoding) for b in cast(Iterable[bytes], data)) + except TypeError: + return six.text_type(data) + except: # pylint: disable=bare-except + pass + try: + return cast(bytes, data).decode(encoding) + except Exception as e: + raise TypeError( + "Message data is not compatible with string type: {}".format(e) + ) + @property def content_type(self): # type: () -> Optional[str] diff --git a/sdk/servicebus/azure-servicebus/tests/test_queues.py b/sdk/servicebus/azure-servicebus/tests/test_queues.py index 5229dd26c0f2..50b38a9983aa 100644 --- a/sdk/servicebus/azure-servicebus/tests/test_queues.py +++ b/sdk/servicebus/azure-servicebus/tests/test_queues.py @@ -1913,6 +1913,8 @@ def test_queue_send_twice(self, servicebus_namespace_connection_string, serviceb with sb_client.get_queue_sender(servicebus_queue.name) as sender: message = ServiceBusMessage("ServiceBusMessage") message2 = ServiceBusMessage("Message2") + assert message.body_as_str() == "ServiceBusMessage" + assert message2.body_as_str() == "Message2" # first test batch message resending. batch_message = sender.create_message_batch() batch_message._from_list([message, message2]) # pylint: disable=protected-access @@ -1930,6 +1932,7 @@ def test_queue_send_twice(self, servicebus_namespace_connection_string, serviceb with sb_client.get_queue_receiver(servicebus_queue.name, max_wait_time=5) as receiver: for message in receiver: messages.append(message) + assert message.body_as_str() in ["ServiceBusMessage", "Message2"] assert len(messages) == 2