如何通过HTTP POST请求使用Retrofit或Picasso下载图片?
解决方案:用Retrofit实现带JSON请求体的POST图片下载
你的需求刚好适合用Retrofit来实现——它既能处理带JSON请求体的POST请求,又能直接接收服务器返回的二进制图片数据。下面是具体的实现步骤:
1. 定义Retrofit接口
首先创建一个Retrofit服务接口,指定POST请求地址,并用@Body传递你的JSON请求体,返回类型用ResponseBody来接收二进制数据:
// Kotlin示例 interface ImageDownloadService { @POST("api/DownloadFileForAndroid") fun downloadImage(@Body request: ImageRequest): Call<ResponseBody> } // Java示例 public interface ImageDownloadService { @POST("api/DownloadFileForAndroid") Call<ResponseBody> downloadImage(@Body ImageRequest request); }
2. 创建请求体对应的POJO类
把你需要的JSON字段封装成一个实体类,方便Retrofit自动序列化:
// Kotlin示例 data class ImageRequest( val UserName: String, val Password: String, val AndroidId: String, val ContentId: String, val frame: String ) // Java示例 public class ImageRequest { private String UserName; private String Password; private String AndroidId; private String ContentId; private String frame; // 构造方法 public ImageRequest(String userName, String password, String androidId, String contentId, String frame) { UserName = userName; Password = password; AndroidId = androidId; ContentId = contentId; this.frame = frame; } // 省略getter和setter方法 }
3. 发起请求并处理图片响应
接下来初始化Retrofit,发起请求,在回调中处理返回的二进制数据,转换成Bitmap或者直接保存到本地:
// Kotlin示例 val retrofit = Retrofit.Builder() .baseUrl("http://xyz.website.com/") .addConverterFactory(GsonConverterFactory.create()) .build() val service = retrofit.create(ImageDownloadService::class.java) val request = ImageRequest( UserName = "ApiService", Password = "BandarAndroid", AndroidId = "15df3b3a90XXXXX", ContentId = "704", frame = "1" ) service.downloadImage(request).enqueue(object : Callback<ResponseBody> { override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) { if (response.isSuccessful) { val inputStream = response.body()?.byteStream() val bitmap = BitmapFactory.decodeStream(inputStream) // 将bitmap设置到ImageView显示 yourImageView.setImageBitmap(bitmap) // 如果需要保存到本地,可通过文件输出流处理 } else { // 请求失败的逻辑处理 } } override fun onFailure(call: Call<ResponseBody>, t: Throwable) { // 网络错误的逻辑处理 } })
为什么不推荐Picasso?
Picasso的核心定位是从固定URL直接加载图片,虽然可以通过自定义RequestHandler扩展功能,但要实现带JSON请求体的POST请求会非常繁琐——需要自己手动处理HTTP请求、序列化请求体等流程,反而不如Retrofit来得直接、简洁。
内容的提问来源于stack exchange,提问作者sajjad Yosefi
相关产品推荐
相关产品推荐

