记录第一次使用retrofit,如有不对,请多多指教。
注意:Retrofit 中的baseurl必须以“/”结尾,否则出现错误。
1.下载支持retrofit的jar包
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.1.7'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.6.0'
2.定义请求接口
package request.http.com.httprequest.api;
import java.util.Map;
import okhttp3.RequestBody;
import request.http.com.httprequest.bean.goodsBean;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.HeaderMap;
import retrofit2.http.Headers;
import retrofit2.http.POST;
public interface RequestApi {
//Headers:固定请求头
@Headers({
"Content-Type: application/json;charset=UTF-8",
"Accept: application/json",
})
// HeaderMap: 动态请求头
@POST("接口地址") //Post请求发送数据
Call getGroupGoods(@Body RequestBody info , @HeaderMap Map headerParams );
}
3.我这里是https请求所以添加了证书信任类
package request.http.com.httprequest.common;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
public class TrustAllCerts implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
public static SSLSocketFactory createSSLSocketFactory() {
SSLSocketFactory factory = null;
try {
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, new TrustManager[]{new TrustAllCerts()}, new SecureRandom());
factory = context.getSocketFactory();
} catch (Exception e) {
}
return factory;
}
public static class TrustAllHostnameVerifier implements HostnameVerifier {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
}
4.我这里封装了请求
package request.http.com.httprequest.common;
import com.google.gson.Gson;
import java.util.HashMap;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import request.http.com.httprequest.api.RequestApi;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
public class retrofitCommon {
public RequestApi retrofitRequestPost(String url){
//证书处理
OkHttpClient.Builder mBuilder = new OkHttpClient.Builder();
mBuilder.sslSocketFactory(TrustAllCerts.createSSLSocketFactory());
mBuilder.hostnameVerifier(new TrustAllCerts.TrustAllHostnameVerifier());
OkHttpClient client = mBuilder.build();
// Retrofit
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create()) //添加Gson转换器
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())//添加Rx转换器
.baseUrl(url) //baseurl
.client(client)
.build();
RequestApi requestApi = retrofit.create(RequestApi.class);
return requestApi;
}
//请求体
public RequestBody getRequestBody(String param, String entity){
Gson gson = new Gson();
HashMap map = new HashMap<>();
map.put(param, entity);
String strEntity = gson.toJson(map);
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), strEntity);
return body;
}
//动态请求头
public HashMap getRequestParam(String param1, String param2){
HashMap hashMap = new HashMap<>();
hashMap.put("Authorization", param1);
hashMap.put("AppKey", param2);
return hashMap;
}
}
5.根据接口返回数据定义bean
package request.http.com.httprequest.bean;
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class goodsBean implements Serializable {
private goodsSuitBean goodsSuit;
private ArrayList DataList;
private TokenInfoBean TokenInfo;
private String LanguageTypeId;
private String Message;
private String Status;
public goodsBean() {
}
public goodsSuitBean getGoodsSuit() {
return goodsSuit;
}
public void setGoodsSuit(goodsSuitBean goodsSuit) {
this.goodsSuit = goodsSuit;
}
public ArrayList getDataList() {
return DataList;
}
public void setDataList(ArrayList dataList) {
this.DataList = dataList;
}
public TokenInfoBean getTokenInfo() {
return TokenInfo;
}
public void setTokenInfo(TokenInfoBean tokenInfo) {
TokenInfo = tokenInfo;
}
public String getLanguageTypeId() {
return LanguageTypeId;
}
public void setLanguageTypeId(String languageTypeId) {
LanguageTypeId = languageTypeId;
}
public String getMessage() {
return Message;
}
public void setMessage(String message) {
Message = message;
}
public String getStatus() {
return Status;
}
public void setStatus(String status) {
Status = status;
}
@Override
public String toString() {
return "goodsBean{" +
"goodsSuit=" + goodsSuit +
", dataList=" + DataList +
", TokenInfo=" + TokenInfo +
", LanguageTypeId='" + LanguageTypeId + '\'' +
", Message='" + Message + '\'' +
", Status='" + Status + '\'' +
'}';
}
}
package request.http.com.httprequest.bean;
import android.graphics.Bitmap;
import android.widget.ImageView;
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;
public class singleBean implements Serializable {
private String shop_id;
private String goods_code;
private String goods_name;
private double goods_price;
private double goods_tax;
private String goods_image;
private double goods_poundage;
public singleBean() {
}
public String getShop_id() {
return shop_id;
}
public void setShop_id(String shop_id) {
this.shop_id = shop_id;
}
public String getGoods_code() {
return goods_code;
}
public void setGoods_code(String goods_code) {
this.goods_code = goods_code;
}
public String getGoods_name() {
return goods_name;
}
public void setGoods_name(String goods_name) {
this.goods_name = goods_name;
}
public double getGoods_price() {
return goods_price;
}
public void setGoods_price(double goods_price) {
this.goods_price = goods_price;
}
public double getGoods_tax() {
return goods_tax;
}
public void setGoods_tax(double goods_tax) {
this.goods_tax = goods_tax;
}
public String getGoods_image() {
return goods_image;
}
public void setGoods_image(String goods_image) {
this.goods_image = goods_image;
}
public double getGoods_poundage() {
return goods_poundage;
}
public void setGoods_poundage(double goods_poundage) {
this.goods_poundage = goods_poundage;
}
@Override
public String toString() {
return "singleBean{" +
"shop_id='" + shop_id + '\'' +
", goods_code='" + goods_code + '\'' +
", goods_name='" + goods_name + '\'' +
", goods_price=" + goods_price +
", goods_tax=" + goods_tax +
", goods_image='" + goods_image + '\'' +
", goods_poundage=" + goods_poundage +
'}';
}
}
package request.http.com.httprequest.bean;
import java.io.Serializable;
public class goodsSuitBean implements Serializable {
private String goods_codes;
private String goods_main_id;
private String goods_packaged_image;
private String goods_packaged_name;
private double goods_packaged_poundage;
private double goods_packaged_price;
private double goods_tax;
private String shop_id;
public goodsSuitBean() {
}
public String getGoods_codes() {
return goods_codes;
}
public void setGoods_codes(String goods_codes) {
this.goods_codes = goods_codes;
}
public String getGoods_main_id() {
return goods_main_id;
}
public void setGoods_main_id(String goods_main_id) {
this.goods_main_id = goods_main_id;
}
public String getGoods_packaged_image() {
return goods_packaged_image;
}
public void setGoods_packaged_image(String goods_packaged_image) {
this.goods_packaged_image = goods_packaged_image;
}
public String getGoods_packaged_name() {
return goods_packaged_name;
}
public void setGoods_packaged_name(String goods_packaged_name) {
this.goods_packaged_name = goods_packaged_name;
}
public double getGoods_packaged_poundage() {
return goods_packaged_poundage;
}
public void setGoods_packaged_poundage(double goods_packaged_poundage) {
this.goods_packaged_poundage = goods_packaged_poundage;
}
public double getGoods_packaged_price() {
return goods_packaged_price;
}
public void setGoods_packaged_price(double goods_packaged_price) {
this.goods_packaged_price = goods_packaged_price;
}
public double getGoods_tax() {
return goods_tax;
}
public void setGoods_tax(double goods_tax) {
this.goods_tax = goods_tax;
}
public String getShop_id() {
return shop_id;
}
public void setShop_id(String shop_id) {
this.shop_id = shop_id;
}
@Override
public String toString() {
return "goodsSuitBean{" +
"goods_codes='" + goods_codes + '\'' +
", goods_main_id='" + goods_main_id + '\'' +
", goods_packaged_image='" + goods_packaged_image + '\'' +
", goods_packaged_name='" + goods_packaged_name + '\'' +
", goods_packaged_poundage=" + goods_packaged_poundage +
", goods_packaged_price=" + goods_packaged_price +
", goods_tax=" + goods_tax +
", shop_id='" + shop_id + '\'' +
'}';
}
}
package request.http.com.httprequest.bean;
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;
import java.util.Date;
public class TokenInfoBean implements Serializable {
private long ExpirationTime;
private Boolean IsExpired;
private int LoginType;
private String Token;
private int UserId;
private String UserName;
public TokenInfoBean() {
}
public long getExpirationTime() {
return ExpirationTime;
}
public void setExpirationTime(long expirationTime) {
ExpirationTime = expirationTime;
}
public Boolean getExpired() {
return IsExpired;
}
public void setExpired(Boolean expired) {
IsExpired = expired;
}
public int getLoginType() {
return LoginType;
}
public void setLoginType(int loginType) {
LoginType = loginType;
}
public String getToken() {
return Token;
}
public void setToken(String token) {
Token = token;
}
public int getUserId() {
return UserId;
}
public void setUserId(int userId) {
UserId = userId;
}
public String getUserName() {
return UserName;
}
public void setUserName(String userName) {
UserName = userName;
}
@Override
public String toString() {
return "TokenInfoBean{" +
"ExpirationTime=" + ExpirationTime +
", IsExpired=" + IsExpired +
", LoginType=" + LoginType +
", Token='" + Token + '\'' +
", UserId=" + UserId +
", UserName='" + UserName + '\'' +
'}';
}
}
6.定义Adapter
package request.http.com.httprequest.adapter;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.util.Base64;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import request.http.com.httprequest.R;
import request.http.com.httprequest.bean.goodsBean;
import request.http.com.httprequest.bean.singleBean;
public class RecyclerViewAdapter extends RecyclerView.Adapter{
private ArrayList dataList;
private Context mContext;
private singleBean entity;
public RecyclerViewAdapter(Context mContext, ArrayList goodsList) {
this.dataList = goodsList;
this.mContext = mContext;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(mContext).inflate(R.layout.adapter_recyclerview, viewGroup , false);
onItemClick(view);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
holder.itemView.setTag(position);
entity = dataList.get(position);
((ViewHolder)holder).tv_goodsName.setText(entity.getGoods_name());
((ViewHolder)holder).tv_goodsPrice.setText(entity.getGoods_price()+ "");
((ViewHolder)holder).tv_goodsTax.setText(entity.getGoods_tax()+"");
//图片使用的是base64
((ViewHolder)holder).iv_goodsImg.setImageBitmap(stringToBitmap(entity.getGoods_image()));
}
public Bitmap stringToBitmap(String base64DataStr) {
Bitmap bitmap = null;
try {
byte[] bitmapArray = Base64.decode(base64DataStr, Base64.DEFAULT);
bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length);
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
@Override
public int getItemCount() {
return dataList.size();
}
public void onItemClick(View view){
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
private class ViewHolder extends RecyclerView.ViewHolder{
private final ImageView iv_goodsImg;
private final TextView tv_goodsName;
private final TextView tv_goodsPrice;
private final TextView tv_goodsTax;
public ViewHolder(@NonNull View itemView) {
super(itemView);
iv_goodsImg = (ImageView)itemView.findViewById(R.id.iv_goodsImg);
tv_goodsName = (TextView)itemView.findViewById(R.id.tv_goodsName);
tv_goodsPrice = (TextView)itemView.findViewById(R.id.tv_goodsPrice);
tv_goodsTax = (TextView)itemView.findViewById(R.id.tv_goodsTax);
}
}
}
adapter_recyclerview.XML文件:
7.activity中使用
package request.http.com.httprequest.activity;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.widget.ImageView;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import okhttp3.logging.HttpLoggingInterceptor;
import request.http.com.httprequest.R;
import request.http.com.httprequest.adapter.RecyclerViewAdapter;
import request.http.com.httprequest.api.RequestApi;
import request.http.com.httprequest.bean.TokenInfoBean;
import request.http.com.httprequest.bean.goodsBean;
import request.http.com.httprequest.bean.goodsSuitBean;
import request.http.com.httprequest.bean.singleBean;
import request.http.com.httprequest.common.CommonFunc;
import request.http.com.httprequest.common.Tools;
import request.http.com.httprequest.common.retrofitCommon;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import java.util.ArrayList;
import java.util.HashMap;
public class MainActivity extends Activity {
private Unbinder unbinder;
@BindView(R.id.lv_showDetail)
RecyclerView lv_showDetail;
private ArrayList dataBeanList;
private RecyclerViewAdapter adapter;
private DefaultItemAnimator defaultItemAnimator;
private RequestApi requestApi;
private RequestBody body;
private HashMap hashMap;
private String authorizationCode;
private String appKey;
private singleBean singleBean;
private TokenInfoBean tokenInfoBean;
private ArrayList singleList;
private goodsSuitBean goodsSuitBean;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
unbinder = ButterKnife.bind(this);
initView();
}
public void initRecyclerView(){
LinearLayoutManager manager = new LinearLayoutManager(this);
lv_showDetail.setLayoutManager(manager);
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
dividerItemDecoration.setDrawable(getApplicationContext().getDrawable(R.drawable.rv_item_devider));
lv_showDetail.addItemDecoration(dividerItemDecoration);
adapter = new RecyclerViewAdapter(MainActivity.this, dataBeanList);
lv_showDetail.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
public void initView() {
retrofitCommon retrofitCommon = new retrofitCommon();
authorizationCode = CommonFunc.getBasicAuthorizationCode("user","asdasdsd");
appKey = CommonFunc.getFinplexAppKey();
requestApi= retrofitCommon.retrofitRequestPost(“访问接口的地址”);
body = retrofitCommon.getRequestBody("code","1232131312");
hashMap = retrofitCommon.getRequestParam(authorizationCode,appKey);
requestApi.getGroupGoods(body,hashMap).enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
callSuccessResponse(response);
}
@Override
public void onFailure(Call call, Throwable t) {
callErrorResponse(t);
}
});
}
private void callSuccessResponse( Response response){
dataBeanList = new ArrayList<>();
goodsBean goods = response.body();
goodsSuitBean = goods.getGoodsSuit();
singleList = goods.getDataList();
tokenInfoBean = goods.getTokenInfo();
for (int i=0;i< singleList.size();i++){
//处理需要显示的数据
}
initRecyclerView();
}
private void callErrorResponse(Throwable t){
Tools.i("error","error"+t.fillInStackTrace());
}
//去掉base64前缀
public String removeBase64(String baseStr){
String base64Str = baseStr.substring(baseStr.indexOf(",")+1, baseStr.length());
return base64Str;
}
}