【问题标题】:How to send byte[] array in retrofit如何在改造中发送字节 [] 数组
【发布时间】:2015-09-28 07:33:15
【问题描述】:

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

retrofit.RetrofitError:retrofit.converter.ConversionException: com.google.gson.JsonSyntaxException:java.lang.IllegalStateException: 应为字符串,但在第 1 行第 2 列是 BEGIN_OBJECT

我可以通过什么方式使用改造来拨打电话。

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

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

谁能帮忙解决这个问题。

谢谢 迪伦

【问题讨论】:

    标签: java spring retrofit


    【解决方案1】:

    为此,您可以使用TypedByteArray

    您的改造服务将如下所示:

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

    【讨论】:

    • 非常好用。感谢包含的优秀代码 sn-p。我还发现我需要一个需要返回字节 [] 的改造。那会怎样?谢谢
    • @Ajay 你必须在 Retrofit 2 中使用 ResponseBody
    • 这个“TypedInput”和“TypedByteArray”是什么,?
    【解决方案2】:

    对于改造 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
        }
    }); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 2022-01-15
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多