如何在改造中发送 byte[] 数组

How to send byte[] array in retrofit

如何在改造调用中发送 byte[] 数组。我只需要发送 byte[]。我在尝试发送改装电话时收到此异常。

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

有什么方法可以使用改造来拨打电话。

我只是将字节数组作为封装在对象 class 中的 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... 
}

我无法在堆栈溢出或谷歌搜索中找到通过改进调用传递字节数组的正确解决方案的资源。

谁能帮忙解决这个问题。

谢谢 迪伦

为此,您可以使用 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
        }
    }); 

"application/octet-stream" - 而不是这个 MIME-TYPE,您可能想使用您的数据格式类型。您可以在此处找到详细信息: 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);
}

改造2:

@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
    }
});