How to send byte[] array in retrofit

Tags: , ,

How do you send byte[] array in retrofit call. I just need to send over byte[]. I get this exception when I have been trying to send a retrofit call.

retrofit.RetrofitError: retrofit.converter.ConversionException: java.lang.IllegalStateException:  Expected a string but was BEGIN_OBJECT at line 1 column 2

What is the way I can make the call using retrofit.

I was simply passing byte array as a ByteMessage encapsulated in the object class.

public class ByteMessage {
    private byte[] byteArray;
    byte[] getByteArray() {
        return byteArray;

    setByteArray(byte[] bytes){
        byteArray = bytes;

sendBytes(ByteMesssage msg);

Server side:

sendBytes(ByteMessage msg) {
    byte[] byteArray = msg.getByte();

I could not find resources on the stack overflow or googling for a proper solution passing byte arrays through retrofit call.

Can anyone please help with this.

Thanks Dhiren


For this purpose you can use TypedByteArray

Your Retrofit service will look like this:

void upload(@Body TypedInput bytes, Callback<String> cb);

Your client code:

    byte[] byteArray = ...
    TypedInput typedBytes = new TypedByteArray("application/octet-stream",  byteArray);
    remoteService.upload(typedBytes, new Callback<String>() {
        public void success(String s, Response response) {
            //Success Handling

        public void failure(RetrofitError retrofitError) {
            //Error Handling

“application/octet-stream” – instead this MIME-TYPE, you maybe want to use your data format type. Detail information you can find here:

And Spring MVC controller (if you need one):

@RequestMapping(value = "/send", method = RequestMethod.POST)
public ResponseEntity<String> receive(@RequestBody byte[] data) {
    //handle data
    return new ResponseEntity<>(HttpStatus.CREATED);

Source: stackoverflow