sajjad Yosefi :
I have a HTTP post request, it takes a JSON with the following content as request body:
{
"UserName":"ApiService",
"Password":"BandarAndroid",
"AndroidId":"15df3b3a90XXXXX",
"ContentId":"704",
"frame":"1"
}
After requesting to the server, I get only one image in response(Instead of anything (like JSON)). The appropriate image is created on request and has no web address. my service Address is :
http://xyz.website.com/api/DownloadFileForAndroid
and my response header is :
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
I don't know whether to use retrofit or Picasso to get this photo,
in Picasso: I can't send the amount of JSON in the request body.
in retrofit: I can't get the photo without the url (Address to point to the photo like www.site.com/a.jpg)
Roaim :
As you requested, I am converting my previous solution (Kotlin) to Java
Example 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());
}
};
}
Example 2: Retrofit
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 class
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 model class
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;
}
}