Android Retrofit 实现(图文上传)文字(参数)和多张图片一起上传

https://www.jianshu.com/p/acfefb0a204f

https://www.jianshu.com/p/a330b0df54ae

前言

官方教程:http://square.github.io/retrofit/

简介:

  • 在Android开发中,网络请求十分常见
  • 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库

简介

介绍

  • 基于OKHttp的RESTful的网络请求框架的封装

作者

  • Square

功能

  • 基于OkHttp
  • 遵循RESTful API设计风格
  • 通过注解配置网络请求参数
  • 支持同步/异步网络请求操作
  • 支持多种数据的解析(Json、Gson、XML等)
  • 提供对RxJava的支持

应用场景

  • 任何网络请求(特别是API遵循RESTful设计风格/使用RxJava进行异步操作)

原理

Retrofit其实是一个网络请求框架的封装,因为网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装。

  • App应用程序通过 Retrofit 请求网络,实际上是使用 Retrofit 接口层封装请求参数、Header、Url 等信息,之后由 OkHttp 完成后续的请求操作。
  • 在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,Retrofit根据用户的需求对结果进行解析。

注解说明

1.首先将所需要的库依赖:前三个是retrofit2的使用 ,后三个是retrofit2与rxjava2结合使用所需要的

implementation'com.squareup.okhttp3:okhttp:3.12.1'//由于Retrofit是基于OkHttp,所以还需要添加OkHttp库依赖
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.1.0'//与rxjava2一起使用
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.1.7'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'

2.在AndroidManifest.xml文件中添加网络权限

<uses-permission android:name="android.permission.INTERNET"/>

3.建立json实体类

public class SnslearnBean {/*** is_admin : 1* count : 1* data : [{"id":"9772","name":"js高级教程.txt","type":"1","public_flag":"0","public_time":"0","domain":"0","parent_id":"0","resource_type":"4","resource_id":"286949","face_md":"","user_id":"111402","org_type":"0","org_target_id":"111402","ctime":"1545912965","mtime":"1545912965","status":"0","public_end_time":"0","qrcode_md":"","format_mtime":"2018-12-27 20:16","format_ctime":"2018-12-27 20:16","size":"235B","before_format_size":"235","suffix":"txt","resource_md":"be87493e2beb407fe80b2f5ec279fcc5","download_url":"http://eagle.snslearn.com/interface/Resource/download?id=286949&directory_id=9772","upload_user_name":"土豆区域云管理员","icon":"","url":"","format_url":"","face":"","view_url":"http://eagle.snslearn.com/resource/Index/resourceView?resource_id=286949","resource_status":"3","filename":"js高级教程.txt","user_info":{"uid":"111402","email":"","login":"Tudo_areaadmin","nick":"土豆区域云管理员","nick_pinyin":"tudouquyuyunguanliyuan","card":"","idNumber":"","name":"土豆区域云管理员","pinyin":"tudouquyuyunguanliyuan","first_letter":"T","address":"","birthday":"1539878400","interesting":"","description":"","complete_telephone":"","telephone":"","logo_md":"046decb5e961f04998d832b9791b081a","qrcode_md":"ded31bc235e052184883976c0f3e0d06","type":"1","type_code":"","is_first_login":"0","is_modify_login":0,"intro":"","sex":"2","score":"0","status":0,"province_id":0,"city_id":0,"district_id":0,"node_id":113,"project_id":1065,"ctime":1539915789,"format_ctime":"2018-10-19 10:23:09","last_login_time":1563844387,"huanxin_name":"113_111402","webapp_url":"http://eagle.snslearn.com/index.php?app=webapp&mod=Index&act=homepage&user_id=111402","webapp_growth_url":"http://eagle.snslearn.com/teaching/UserWebapp/studentGrowth?user_id=111402","english_name":"tudouquyuyunguanliyuan","logo":"http://eagle.snslearn.com/md/046decb5e961f04998d832b9791b081a","qrcode":"http://eagle.snslearn.com/md/ded31bc235e052184883976c0f3e0d06","age":0,"url":"http://eagle.snslearn.com/index.php?app=center&mod=Teacher&act=homepage&user_id=111402"},"org_url":"http://eagle.snslearn.com/index.php?app=interface&mod=Resource&act=document&md=be87493e2beb407fe80b2f5ec279fcc5","share_user_count":1,"format_share_time":"2018-12-27 20:16","collect_flag":0}]* error_msg : 成功* error_code : 0*/public int is_admin;public int count;public String error_msg;public String error_code;public List<DataBean> data;public static class DataBean {/*** id : 9772* name : js高级教程.txt* type : 1* public_flag : 0* public_time : 0* domain : 0* parent_id : 0* resource_type : 4* resource_id : 286949* face_md :* user_id : 111402* org_type : 0* org_target_id : 111402* ctime : 1545912965* mtime : 1545912965* status : 0* public_end_time : 0* qrcode_md :* format_mtime : 2018-12-27 20:16* format_ctime : 2018-12-27 20:16* size : 235B* before_format_size : 235* suffix : txt* resource_md : be87493e2beb407fe80b2f5ec279fcc5* download_url : http://eagle.snslearn.com/interface/Resource/download?id=286949&directory_id=9772* upload_user_name : 土豆区域云管理员* icon :* url :* format_url :* face :* view_url : http://eagle.snslearn.com/resource/Index/resourceView?resource_id=286949* resource_status : 3* filename : js高级教程.txt* user_info : {"uid":"111402","email":"","login":"Tudo_areaadmin","nick":"土豆区域云管理员","nick_pinyin":"tudouquyuyunguanliyuan","card":"","idNumber":"","name":"土豆区域云管理员","pinyin":"tudouquyuyunguanliyuan","first_letter":"T","address":"","birthday":"1539878400","interesting":"","description":"","complete_telephone":"","telephone":"","logo_md":"046decb5e961f04998d832b9791b081a","qrcode_md":"ded31bc235e052184883976c0f3e0d06","type":"1","type_code":"","is_first_login":"0","is_modify_login":0,"intro":"","sex":"2","score":"0","status":0,"province_id":0,"city_id":0,"district_id":0,"node_id":113,"project_id":1065,"ctime":1539915789,"format_ctime":"2018-10-19 10:23:09","last_login_time":1563844387,"huanxin_name":"113_111402","webapp_url":"http://eagle.snslearn.com/index.php?app=webapp&mod=Index&act=homepage&user_id=111402","webapp_growth_url":"http://eagle.snslearn.com/teaching/UserWebapp/studentGrowth?user_id=111402","english_name":"tudouquyuyunguanliyuan","logo":"http://eagle.snslearn.com/md/046decb5e961f04998d832b9791b081a","qrcode":"http://eagle.snslearn.com/md/ded31bc235e052184883976c0f3e0d06","age":0,"url":"http://eagle.snslearn.com/index.php?app=center&mod=Teacher&act=homepage&user_id=111402"}* org_url : http://eagle.snslearn.com/index.php?app=interface&mod=Resource&act=document&md=be87493e2beb407fe80b2f5ec279fcc5* share_user_count : 1* format_share_time : 2018-12-27 20:16* collect_flag : 0*/public String id;public String name;public String type;public String public_flag;public String public_time;public String domain;public String parent_id;public String resource_type;public String resource_id;public String face_md;public String user_id;public String org_type;public String org_target_id;public String ctime;public String mtime;public String status;public String public_end_time;public String qrcode_md;public String format_mtime;public String format_ctime;public String size;public String before_format_size;public String suffix;public String resource_md;public String download_url;public String upload_user_name;public String icon;public String url;public String format_url;public String face;public String view_url;public String resource_status;public String filename;public UserInfoBean user_info;public String org_url;public int share_user_count;public String format_share_time;public int collect_flag;public static class UserInfoBean {/*** uid : 111402* email :* login : Tudo_areaadmin* nick : 土豆区域云管理员* nick_pinyin : tudouquyuyunguanliyuan* card :* idNumber :* name : 土豆区域云管理员* pinyin : tudouquyuyunguanliyuan* first_letter : T* address :* birthday : 1539878400* interesting :* description :* complete_telephone :* telephone :* logo_md : 046decb5e961f04998d832b9791b081a* qrcode_md : ded31bc235e052184883976c0f3e0d06* type : 1* type_code :* is_first_login : 0* is_modify_login : 0* intro :* sex : 2* score : 0* status : 0* province_id : 0* city_id : 0* district_id : 0* node_id : 113* project_id : 1065* ctime : 1539915789* format_ctime : 2018-10-19 10:23:09* last_login_time : 1563844387* huanxin_name : 113_111402* webapp_url : http://eagle.snslearn.com/index.php?app=webapp&mod=Index&act=homepage&user_id=111402* webapp_growth_url : http://eagle.snslearn.com/teaching/UserWebapp/studentGrowth?user_id=111402* english_name : tudouquyuyunguanliyuan* logo : http://eagle.snslearn.com/md/046decb5e961f04998d832b9791b081a* qrcode : http://eagle.snslearn.com/md/ded31bc235e052184883976c0f3e0d06* age : 0* url : http://eagle.snslearn.com/index.php?app=center&mod=Teacher&act=homepage&user_id=111402*/public String uid;public String email;public String login;public String nick;public String nick_pinyin;public String card;public String idNumber;public String name;public String pinyin;public String first_letter;public String address;public String birthday;public String interesting;public String description;public String complete_telephone;public String telephone;public String logo_md;public String qrcode_md;public String type;public String type_code;public String is_first_login;public int is_modify_login;public String intro;public String sex;public String score;public int status;public int province_id;public int city_id;public int district_id;public int node_id;public int project_id;public int ctime;public String format_ctime;public int last_login_time;public String huanxin_name;public String webapp_url;public String webapp_growth_url;public String english_name;public String logo;public String qrcode;public int age;public String url;@Overridepublic String toString() {return "UserInfoBean{" +"uid='" + uid + '\'' +", email='" + email + '\'' +", login='" + login + '\'' +", nick='" + nick + '\'' +", nick_pinyin='" + nick_pinyin + '\'' +", card='" + card + '\'' +", idNumber='" + idNumber + '\'' +", name='" + name + '\'' +", pinyin='" + pinyin + '\'' +", first_letter='" + first_letter + '\'' +", address='" + address + '\'' +", birthday='" + birthday + '\'' +", interesting='" + interesting + '\'' +", description='" + description + '\'' +", complete_telephone='" + complete_telephone + '\'' +", telephone='" + telephone + '\'' +", logo_md='" + logo_md + '\'' +", qrcode_md='" + qrcode_md + '\'' +", type='" + type + '\'' +", type_code='" + type_code + '\'' +", is_first_login='" + is_first_login + '\'' +", is_modify_login=" + is_modify_login +", intro='" + intro + '\'' +", sex='" + sex + '\'' +", score='" + score + '\'' +", status=" + status +", province_id=" + province_id +", city_id=" + city_id +", district_id=" + district_id +", node_id=" + node_id +", project_id=" + project_id +", ctime=" + ctime +", format_ctime='" + format_ctime + '\'' +", last_login_time=" + last_login_time +", huanxin_name='" + huanxin_name + '\'' +", webapp_url='" + webapp_url + '\'' +", webapp_growth_url='" + webapp_growth_url + '\'' +", english_name='" + english_name + '\'' +", logo='" + logo + '\'' +", qrcode='" + qrcode + '\'' +", age=" + age +", url='" + url + '\'' +'}';}}@Overridepublic String toString() {return "DataBean{" +"id='" + id + '\'' +", name='" + name + '\'' +", type='" + type + '\'' +", public_flag='" + public_flag + '\'' +", public_time='" + public_time + '\'' +", domain='" + domain + '\'' +", parent_id='" + parent_id + '\'' +", resource_type='" + resource_type + '\'' +", resource_id='" + resource_id + '\'' +", face_md='" + face_md + '\'' +", user_id='" + user_id + '\'' +", org_type='" + org_type + '\'' +", org_target_id='" + org_target_id + '\'' +", ctime='" + ctime + '\'' +", mtime='" + mtime + '\'' +", status='" + status + '\'' +", public_end_time='" + public_end_time + '\'' +", qrcode_md='" + qrcode_md + '\'' +", format_mtime='" + format_mtime + '\'' +", format_ctime='" + format_ctime + '\'' +", size='" + size + '\'' +", before_format_size='" + before_format_size + '\'' +", suffix='" + suffix + '\'' +", resource_md='" + resource_md + '\'' +", download_url='" + download_url + '\'' +", upload_user_name='" + upload_user_name + '\'' +", icon='" + icon + '\'' +", url='" + url + '\'' +", format_url='" + format_url + '\'' +", face='" + face + '\'' +", view_url='" + view_url + '\'' +", resource_status='" + resource_status + '\'' +", filename='" + filename + '\'' +", user_info=" + user_info +", org_url='" + org_url + '\'' +", share_user_count=" + share_user_count +", format_share_time='" + format_share_time + '\'' +", collect_flag=" + collect_flag +'}';}}@Overridepublic String toString() {return "SnslearnBean{" +"is_admin=" + is_admin +", count=" + count +", error_msg='" + error_msg + '\'' +", error_code='" + error_code + '\'' +", data=" + data +'}';}
}

4.创建用于描述网络请求的接口

代码中的 1 部分 是将请求地址全部写出

2部分 是使用@Query注解拼凑参数   MainActivity中 ; requestData()方法

3部分 是使用rxjava 结合方式 见 MainActivity中的 requestRxJavaData();方法

package com.example.myretrofit.inter;import com.example.myretrofit.bean.SnslearnBean;import io.reactivex.Observable;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;public interface IGetRequestDataInterface {// 注解里传入网络请求的部分URL地址// 其中返回类型为Call<News>,News是接收数据的类(即上面定义的News类)// 如果想直接获得Responsebody中的内容,可以定义网络请求返回值为Call<ResponseBody>//1.直接将地址放上去//@GET("index.php?app=interface&mod=Directory&act=getDirectoryList&parent_id=0&token=YTA3ZjI2NGM0MDRhNDk1OGZkN2YzZDhjOTBmMzFlNDQ")// Call<SnslearnBean> getCall();//2.采用拼接的方式将参数拼出来  @Path("app")String app,// 使用path拼接出来的没有连接符:比如(&,? )等// @Query("app") String app  相当于自己添加了个 (?,&) 变为:(?app)的形式   注:与上面的长地址对比一下就知道了@GET("index.php")// getCall()是接受网络请求数据的方法Call<SnslearnBean> getCall(@Query("app") String app, @Query("mod") String mod, @Query("act") String act, @Query("parent_id") String parent_id, @Query("token") String token);//3. rxjava  结合方式@GET("index.php?app=interface&mod=Directory&act=getDirectoryList&parent_id=0&token=YTA3ZjI2NGM0MDRhNDk1OGZkN2YzZDhjOTBmMzFlNDQ")Observable<SnslearnBean> getRxJavaCall();}

5.传统请求方式requestData()

private void requestData() {/*** 创建Retrofit实例时需要通过Retrofit.Builder,并调用baseUrl方法设置URL。* Retrofit2的baseUlr 必须以 /(斜线)结束,不然会抛出一个IllegalArgumentException*/retrofit = new Retrofit.Builder().baseUrl("http://eagle.snslearn.com/") // 设置 网络请求 Url.addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖).build();/*** 创建网络请求接口的实例* 拿到代理对象 自己创建的接口*/IGetRequestDataInterface request = retrofit.create(IGetRequestDataInterface.class);// 封装请求Call<SnslearnBean> call = request.getCall("interface", "Directory","getDirectoryList", "0", "YTA3ZjI2NGM0MDRhNDk1OGZkN2YzZDhjOTBmMzFlNDQ");// 发送网络请求(异步)call.enqueue(new Callback<SnslearnBean>() {@Overridepublic void onResponse(Call<SnslearnBean> call, Response<SnslearnBean> response) {SnslearnBean snslearnBean = response.body();Log.d("tgw1", "onResponse: " + snslearnBean.toString());//如果Call<SnslearnBean> 中的参数为 :---ResponseBody  采用下面方法获取,它的返回值与okhttp3 一样
//                try {
//                    Log.d("tgw1", "onResponse: "+response.body().string());
//                    Gson gson = new Gson();
//                    SnslearnBean snslearnBean = gson.fromJson(response.body().string(),SnslearnBean.class);
//                    Log.d("tgw2", "onResponse: "+snslearnBean.data.get(0).id);
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }}@Overridepublic void onFailure(Call<SnslearnBean> call, Throwable t) {Log.d("tgw1", "onFailure:失败 ");}});}

6.使用Rxjava与retrofit结合的方式:

 private void requestRxJavaData() {Retrofit retrofit = new Retrofit.Builder().baseUrl("http://eagle.snslearn.com/").addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();IGetRequestDataInterface request = retrofit.create(IGetRequestDataInterface.class);// 封装请求// 2. 采用Observable<...>形式对网络请求进行封装Observable<SnslearnBean> observable =  request.getRxJavaCall();// 3. 发送网络请求(异步)observable.subscribeOn(Schedulers.io())               // 在IO线程进行网络请求.observeOn(AndroidSchedulers.mainThread())  // 回到主线程 处理请求结果.subscribe(new Observer<SnslearnBean>() {// 发送请求后调用该复写方法(无论请求成功与否)@Overridepublic void onSubscribe(Disposable d) {// 初始化工作Log.d("tgwrxjava", "初始化工作");}@Overridepublic void onNext(SnslearnBean snslearnBean) {Log.d("tgwrxjava", "结果"+snslearnBean.toString());}// 发送请求成功后,先调用onNext()再调用该复写方法@Overridepublic void onComplete() {Log.d("tgwrxjava", "请求成功");}// 发送请求失败后调用该复写方法@Overridepublic void onError(Throwable e) {Log.d("tgwrxjava", "请求失败");}});}

7..MainActivity代码如下:

package com.example.myretrofit;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;import com.example.myretrofit.bean.PostSnslearnBean;
import com.example.myretrofit.bean.SnslearnBean;
import com.example.myretrofit.inter.IGetRequestDataInterface;
import com.example.myretrofit.inter.IPostRequestDataInterface;
import com.google.gson.Gson;import java.io.IOException;
import java.net.URL;import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button btRequestSnslearn, btPostData;private Retrofit retrofit;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btRequestSnslearn = findViewById(R.id.bt_request_data);btPostData = findViewById(R.id.bt_post_request_data);btRequestSnslearn.setOnClickListener(this);btPostData.setOnClickListener(this);}@Overridepublic void onClick(View v) {int viewId = v.getId();if (viewId == R.id.bt_request_data) {//1. 传统方式:Call<..>接口形式requestData();//2. RxJava 方式:Observable<..>接口形式requestRxJavaData();} else if (viewId == R.id.bt_post_request_data) {//post 请求postData();}}private void postData() {Retrofit retrofit = new Retrofit.Builder().baseUrl("http://eagle.snslearn.com/").addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();// 创建网络请求接口的实例IPostRequestDataInterface mApi = retrofit.create(IPostRequestDataInterface.class);Call<PostSnslearnBean> call = mApi.getCall("10018", "我使用retrofit重命名", "MzM1MjYyMWE0NjMyZTFkOWQ5YzVkMTYyODJmOTFjZDk");call.enqueue(new Callback<PostSnslearnBean>() {@Overridepublic void onResponse(Call<PostSnslearnBean> call, Response<PostSnslearnBean> response) {PostSnslearnBean snslearnBean = response.body();Log.d("tgw2", "onResponse: " + snslearnBean.toString());}@Overridepublic void onFailure(Call<PostSnslearnBean> call, Throwable t) {Log.d("tgw2", "onFailure:失败 ");}});}private void requestData() {/*** 创建Retrofit实例时需要通过Retrofit.Builder,并调用baseUrl方法设置URL。* Retrofit2的baseUlr 必须以 /(斜线)结束,不然会抛出一个IllegalArgumentException*/retrofit = new Retrofit.Builder().baseUrl("http://eagle.snslearn.com/") // 设置 网络请求 Url.addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖).build();/*** 创建网络请求接口的实例* 拿到代理对象 自己创建的接口*/IGetRequestDataInterface request = retrofit.create(IGetRequestDataInterface.class);// 封装请求Call<SnslearnBean> call = request.getCall("interface", "Directory","getDirectoryList", "0", "YTA3ZjI2NGM0MDRhNDk1OGZkN2YzZDhjOTBmMzFlNDQ");// 发送网络请求(异步)call.enqueue(new Callback<SnslearnBean>() {@Overridepublic void onResponse(Call<SnslearnBean> call, Response<SnslearnBean> response) {SnslearnBean snslearnBean = response.body();Log.d("tgw1", "onResponse: " + snslearnBean.toString());//如果Call<SnslearnBean> 中的参数为 :---ResponseBody  采用下面方法获取,它的返回值与okhttp3 一样
//                try {
//                    Log.d("tgw1", "onResponse: "+response.body().string());
//                    Gson gson = new Gson();
//                    SnslearnBean snslearnBean = gson.fromJson(response.body().string(),SnslearnBean.class);
//                    Log.d("tgw2", "onResponse: "+snslearnBean.data.get(0).id);
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }}@Overridepublic void onFailure(Call<SnslearnBean> call, Throwable t) {Log.d("tgw1", "onFailure:失败 ");}});}private void requestRxJavaData() {Retrofit retrofit = new Retrofit.Builder().baseUrl("http://eagle.snslearn.com/").addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();IGetRequestDataInterface request = retrofit.create(IGetRequestDataInterface.class);// 封装请求// 2. 采用Observable<...>形式对网络请求进行封装Observable<SnslearnBean> observable =  request.getRxJavaCall();// 3. 发送网络请求(异步)observable.subscribeOn(Schedulers.io())               // 在IO线程进行网络请求.observeOn(AndroidSchedulers.mainThread())  // 回到主线程 处理请求结果.subscribe(new Observer<SnslearnBean>() {// 发送请求后调用该复写方法(无论请求成功与否)@Overridepublic void onSubscribe(Disposable d) {// 初始化工作Log.d("tgwrxjava", "初始化工作");}@Overridepublic void onNext(SnslearnBean snslearnBean) {Log.d("tgwrxjava", "结果"+snslearnBean.toString());}// 发送请求成功后,先调用onNext()再调用该复写方法@Overridepublic void onComplete() {Log.d("tgwrxjava", "请求成功");}// 发送请求失败后调用该复写方法@Overridepublic void onError(Throwable e) {Log.d("tgwrxjava", "请求失败");}});}
}

参考链接:https://www.jianshu.com/p/2241d4238deb

https://www.jianshu.com/p/0fda3132cf98

https://www.jianshu.com/p/f7026cbf1cc9 注解

https://www.jianshu.com/p/f23be7f8cb93

项目地址:https://github.com/tanguiwu/MyRetrofit

Retrofit的使用方法相关推荐

  1. android网络请求撤销,Android OkHttp + Retrofit 取消请求的方法

    前言 在某一个界面,用户发起了一个网络请求,因为某种原因用户在网络请求完成前离开了当前界面,比较好的做法是取消这个网络请求.对于OkHttp来说,具体是调用Call的cancel方法. 如何找到这一个 ...

  2. Spring Boot 中的 RestTemplate不好用?试试 Retrofit !

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 六点半起床 来源 | juejin.im/post/68 ...

  3. Retrofit原理分析

    Retrofit原理分析 温故而知新 还记得retrofit的使用方法嘛,下面我们来回顾一下 接口定义 public interface GitHubService {@GET("users ...

  4. java创建请求拦截器_80.简单Retrofit+RxJava+日志拦截器结合使用

    1.需要使用到的依赖如下(Retrofit\RxJava\RecyclerView\日志拦截器) //only Retrofit(只用Retrofit联网) implementation 'io.re ...

  5. Spring Boot 中的 RestTemplate 不好用?试试 Retrofit!

    大家都知道okhttp是一款由square公司开源的java版本http客户端工具.实际上,square公司还开源了基于okhttp进一步封装的retrofit工具,用来支持通过接口的方式发起http ...

  6. Spring Boot项目整合Retrofit最佳实践,最优雅的HTTP客户端工具!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 转自 ...

  7. Retrofit2.5是如何解析在接口类中定义的请求方法?

    前言 Retrofit的核心在于它的create方法中使用了动态代理,在这里面主要是loadServiceMethod方法: 以下代码基于Retrofit2.5.0(跟2.3.0代码存在明显不同) p ...

  8. SpringBoot项目整合Retrofit最佳实践,这才是最优雅的HTTP客户端工具!

    作者:六点半起床 juejin.im/post/6854573211426750472 大家都知道okhttp是一款由square公司开源的java版本http客户端工具.实际上,square公司还开 ...

  9. retrofit框架学习(二)----retrofit封装

    retrofit 的封装 前言 上一篇文章的链接 http://blog.csdn.net/qq_26296197/article/details/78011188 1 上一篇文章讲到Retrofit ...

最新文章

  1. 交换两个变量的值不使用第三个变量(Java)
  2. pandas使用iloc函数将dataframe的所有数据行反序(reverse the order of rows in dataframe)
  3. 无线AP、WiFi、WLAN是什么关系?
  4. SQL游标的使用与语法
  5. Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(10)...
  6. C++ STL学习之容器set和multiset (补充材料)
  7. GDB / TUI 模式
  8. poj3083 Children of the Candy Corn 深搜+广搜
  9. python中的logger模块详细讲解
  10. linux服务器和客户端配置,Linux基础教程:YUM服务端与客户端配置步骤
  11. Objective-C 的 self 和 super 详解
  12. iphone--使用NSUserDefaults存储数据
  13. SQL注入-盲注(布尔盲注与时间盲注)
  14. 金蝶移动bos开发教程_金蝶bos
  15. ps: 如何调出辅助线
  16. 关于EPCS系列芯片的说明
  17. 登录注册,文件增删查改实现
  18. 单元格中公式结果为0如何不显示0符号?
  19. 拉卡拉支付开启生态化移动支付新趋势
  20. React中实现插槽

热门文章

  1. python爬虫实例教程-python动态爬虫的实例分享
  2. python公历转农历
  3. 飞浆AI studio人工智能课程学习(4)-优质Prompt分享
  4. 信号完整性经验100条---Eirc Bogatin总结的SI/PI方面的精华
  5. ahk用于热键和宏的按键和鼠标/操纵杆按钮的列表
  6. noip模拟赛 赤の夜
  7. kafka streams学习笔记
  8. 2020“香港科大商学院-黑瞳科技”【人工智能】百万奖金国际创业大赛宣讲会成都站成功举办...
  9. 全卷积神经网络(FCN)论文笔记
  10. android linker自举