我有一个 HTTP post 请求,它需要一个包含以下内容的 JSON 作为请求正文:
{
"UserName":"ApiService",
"Password":"BandarAndroid",
"AndroidId":"15df3b3a90XXXXX",
"ContentId":"704",
"frame":"1"
}
向服务器请求后,我只得到一张图像作为响应(而不是任何东西(如 JSON))。 适当的图像是根据要求创建的,没有网址。 我的服务地址是:
http://xyz.website.com/api/DownloadFileForAndroid
我的响应头是:
cache-control →no-cache
content-length →29837
content-type →image/png
date →Mon, 09 Sep 2019 08:42:23 GMT
expires →-1
pragma →no-cache
server →Microsoft-IIS/8.5
x-aspnet-version →4.0.30319
x-powered-by →ASP.NET
不知道是用retrofit还是Picasso来得到这张照片,
在 Picasso 中:我无法在请求正文中发送 JSON 的数量。
在改造中:没有url我无法获取照片(地址指向照片,如www.site.com/a.jpg)
最佳答案
As you requested, I am converting my previous solution (Kotlin) to Java
例1: picasso
public void loadImageWithPicasso(ImageView imageView) {
Picasso.Builder builder = new Picasso.Builder(imageView.getContext());
RequestCreator picassoImageLoader = createPicassoLoader(
builder,
ImageRequest.DEFAULT_JSON_BODY,
"http://shop.atiafkar.ir/api/DownloadFileForAndroid"
);
picassoImageLoader.into(imageView);
}
public RequestCreator createPicassoLoader(Picasso.Builder builder, String body, String url) {
return builder.downloader(new OkHttp3Downloader(createPicassoCallFactory(body)))
.build()
.load(url);
}
private okhttp3.Call.Factory createPicassoCallFactory(String jsonBody) {
final OkHttpClient okHttpClient = new OkHttpClient.Builder()
.build();
final RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), jsonBody);
return new okhttp3.Call.Factory() {
@Override
public okhttp3.Call newCall(Request request) {
Request.Builder builder = request.newBuilder();
builder.post(requestBody);
builder.addHeader("Content-Type", "application/json");
return okHttpClient.newCall(builder.build());
}
};
}
示例 2:改造
public void loadImageWithRetrofit(ImageView imageView) {
final RetrofitImageLoader imageLoader = new RetrofitImageLoader(imageView);
RemoteApi api = RemoteApi.Factory.create();
api.getImage(ImageRequest.DEFAULT_BODY).enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
ResponseBody body = response.body();
if (response.isSuccessful() && body != null) {
imageLoader.execute(body.byteStream());
} else {
Log.d(TAG, "Retrofit onResponse(): CODE = [" + response.code() + "], MESSAGE = [" + response.message() + "]");
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.d(TAG, "Retrofit onFailure(): t = [" + t + "]");
}
});
}
RetrofitImageLoader 类
public class RetrofitImageLoader extends AsyncTask<InputStream, Integer, Bitmap> {
private ImageView imageView;
private RetrofitImageLoader(ImageView imageView) {
this.imageView = imageView;
}
@Override
protected Bitmap doInBackground(InputStream... inputStreams) {
return BitmapFactory.decodeStream(inputStreams[0]);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
imageView.setImageBitmap(bitmap);
}
}
RemoteApi 接口(interface)
public interface RemoteApi {
@Streaming // Important
@POST("/api/DownloadFileForAndroid")
Call<ResponseBody> getImage(@Body ImageRequest body);
class Factory {
private static RemoteApi mInstance;
public static RemoteApi create() {
if (mInstance == null) {
mInstance = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("http://shop.atiafkar.ir")
.build()
.create(RemoteApi.class);
}
return mInstance;
}
}
}
ImageRequest 模型类
public class ImageRequest{
public static final ImageRequest DEFAULT_BODY;
public static final String DEFAULT_JSON_BODY;
static {
DEFAULT_BODY = new ImageRequest();
DEFAULT_BODY.setAndroidId("15df3b3a90dc5688");
DEFAULT_BODY.setContentId("704");
DEFAULT_BODY.setFrame("1");
DEFAULT_BODY.setPassword("BandarAndroid");
DEFAULT_BODY.setUserName("ApiService");
DEFAULT_JSON_BODY = new Gson().toJson(DEFAULT_BODY, ImageRequest.class);
}
@SerializedName("UserName")
private String userName;
@SerializedName("ContentId")
private String contentId;
@SerializedName("AndroidId")
private String androidId;
@SerializedName("Password")
private String password;
@SerializedName("frame")
private String frame;
public void setUserName(String userName){
this.userName = userName;
}
public void setContentId(String contentId){
this.contentId = contentId;
}
public void setAndroidId(String androidId){
this.androidId = androidId;
}
public void setPassword(String password){
this.password = password;
}
public void setFrame(String frame){
this.frame = frame;
}
}
关于java - 如何通过 HTTP POST 方法使用 Retrofit 或 Picasso 下载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57850008/