【问题标题】:Android Retrofit Base64 @BodyAndroid 改造 Base64 @Body
【发布时间】:2014-05-12 07:51:31
【问题描述】:

大家好,我在 android 4.3 中有这段代码,我现在正在使用改造,但服务器向我抛出了错误消息 “输入不是有效的 Base-64 字符串,因为它包含非 base 64 字符、两个以上的填充字符或填充字符中的非法字符。”当我使用改造时

//Normal HttpClient
//Base64 String
photo = new String(b);

// Creating HTTP client
HttpClient httpClient = new DefaultHttpClient();

// Creating HTTP Post
HttpPut httpPut = new HttpPut("http://beta2.irealtor.api.iproperty.com.my.ipga.local/PhotoService/"
                    + mPropertyId + "/testWatermark"
            );

httpPut.setHeader("content-type", "application/x-www-form-urlencoded");
httpPut.setHeader("Authorization","WFdSeW8vTJ1Z3oQlBJMk53VGpaekZRY2pCd1pYSlVXU090");
httpPut.setHeader("Accept", "application/json");

httpPut.setEntity(new StringEntity(photo, "utf-8"));

HttpResponse response = httpClient.execute(httpPut);



//With retrofit
@Headers({
    "content-type:application/x-www-form-urlencoded"
})
@PUT("/PhotoService/{PROPERTYID}/{WATERMARK}") String uploadPhoto(
    @Body String photo,
    @Path("PROPERTYID") String propertyId,
    @Path("WATERMARK") String watermark);

【问题讨论】:

    标签: java android square retrofit


    【解决方案1】:

    对于一般对象类型(包括String),Retrofit 将使用其Converter 来序列化值。在这种情况下,默认使用 Gson 将 body 序列化为 JSON。

    要上传 Base64 编码的数据,您需要使用 TypedInput。这告诉 Retrofit 你将把已经序列化的原始正文和关联的Content-Type 值传递给它。

    @PUT("/PhotoService/{PROPERTYID}/{WATERMARK}")
    String uploadPhoto(
        @Body TypedInput photo,
        @Path("PROPERTYID") String propertyId,
        @Path("WATERMARK") String watermark);
    

    我将假设b 在您的上述示例中是byte[]。这里我使用了TypedInput的现有实现:TypedByteArray

    TypedInput body = new TypedByteArray("application/x-www-form-urlencoded", b);
    service.uploadPhoto(body, "...", "...");
    

    【讨论】:

    • 如果我想使用 Base64 上传多张照片,那么上面的代码怎么可能呢?
    • @JaiminThakkar 你能给 TypedInput 课吗? ,给定的链接没有失效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多