9
votes

By default, boto encodes messages with Base64 before the messages are sent to SQS. Example code:

conn = boto.connect_sqs('access_key_id', 'secret_key') 
q = conn.get_queue('myqueue')
m = Message()
m.set_body('hello!')
q.write(m)

By replacing Message() with RawMessage(), I can send raw messages to the queue without encoding. But how do I read messages from the queue without decoding? If I use the following code:

rs = q.get_messages(1)
if rs:
    m = rs[0]
    print m.get_body()

m.get_body() automatically returns the decoded result. Is there a way to retrieve raw messages?

Thanks!

3

3 Answers

14
votes

In case you are interested to just read the messages off SQS queue and the producer was someone else, you may start seeing garbage character when call get_messages(). See https://github.com/boto/boto/issues/831

Solution in this case again, is to

from boto.sqs.message import RawMessage
q.set_message_class(RawMessage)
7
votes

Actually Message class inherits from RawMessage, so it has all of it's methods. One of these methods is:

get_body_encoded()

This method is really a semi-private method used by the Queue.write method when writing the contents of the message to SQS. You probably shouldn’t need to call this method in the normal course of events.

4
votes

The constructor of boto.sqs.queue.Queue has a message_class argument, which you could set to RawMessage. On the other hand, I don't see why it could ever make sense to not encode that data before transmitting it.