如何在Retrofit中发送byte[]数组

9
你如何在Retrofit调用中发送byte[]数组?我只需要发送byte[]。当我一直试图发送一个retrofit调用时,我得到了这个异常。
retrofit.RetrofitError: retrofit.converter.ConversionException: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2
我应该如何使用Retrofit发起调用?
我只是将字节数组作为ByteMessage封装在对象类中进行传递。
public class ByteMessage {
    
    private byte[] byteArray;
    
    byte[] getByteArray() {
        return byteArray;
    }

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

}

@POST("/send")
sendBytes(ByteMesssage msg);

服务器端:

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

我在Stack Overflow或Google搜索中无法找到有关通过retrofit调用传递字节数组的正确解决方案的资源。

请问是否有人可以帮忙解决这个问题。

谢谢, Dhiren

2个回答

11

对于retrofit2:

@POST("/send")
void upload(@Body RequestBody bytes, Callback<String> cb);

用法:

byte[] params = ...
RequestBody body = RequestBody.create(MediaType.parse("application/octet-stream"), params);
remoteService.upload(body, new Callback<String>() {
    @Override
    public void success(String s, Response response) {
        //Success Handling
    }

    @Override
    public void failure(RetrofitError retrofitError) {
        //Error Handling
    }
}); 

10

你可以使用 TypedByteArray 来达到这个目的。

你的 Retrofit 服务将如下所示:

@POST("/send")
void upload(@Body TypedInput bytes, Callback<String> cb);

您的客户端代码:

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

        @Override
        public void failure(RetrofitError retrofitError) {
            //Error Handling
        }
    }); 

"应用程序/八位字节流" - 不建议使用这种MIME类型,您可能希望使用与您的数据格式相对应的类型。更多详细信息可以在此处找到: http://www.freeformatter.com/mime-types-list.html

如果需要的话,以下是Spring MVC控制器代码:

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

非常好,会起作用。感谢您提供的优秀代码片段。我还发现我需要一个返回byte[]的适配器。那应该怎么做?谢谢。 - user2358826
1
@Ajay,你必须在Retrofit 2中使用ResponseBody。 - Nilesh
这个 "TypedInput" 和 "TypedByteArray" 是什么? - charitha amarasinghe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接