大家好,我在 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);
最佳答案
对于一般对象类型(包括 String
),Retrofit 将使用其 Converter
来序列化值。在这种情况下,默认使用 Gson 将主体序列化为 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, "...", "...");
关于java - Android 改造 Base64 @Body,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22787585/