You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:37:26