主页: [https://github.com/square/retrofit](https://github.com/square/retrofit)


注意: 使用Retrofit的前提是**服务器端代码遵循REST规范
!!!!!**


功能:
* 效率非常高
* 可以直接将结果转换称Java类
* 主要是配合RxJava一起使用


配置:

    implementation 'com.squareup.retrofit2:retrofit:2.0.2'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
// OkHttp3
api "com.squareup.okhttp3:okhttp:3.10.0"
api "com.squareup.okhttp3:logging-interceptor:3.10.0"
//网络日志
implementation('com.github.ihsanbal:LoggingInterceptor:3.0.0') {
exclude group: 'org.json', module: 'json'
}
HttpManager.java
package com.loaderman.demo.http;

import android.os.Build;

import com.ihsanbal.logging.Level;
import com.ihsanbal.logging.LoggingInterceptor;
import com.loaderman.demo.BuildConfig;
import com.loaderman.demo.MyApplication; import java.io.File;
import java.io.IOException; import okhttp3.Cache;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.internal.platform.Platform;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory; public class HttpManager { private static HttpManager apiManager;
private static final String TAG = "HttpManager";
private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
int maxAge = 60 * 5; // 在线缓存在5分钟内可读取
Request request = chain
.request()
.newBuilder()
.addHeader("User-Agent", Build.BRAND + "/" + Build.MODEL + "/" + Build.VERSION.RELEASE)//添加请求头
.header("Cache-Control", "public, max-age=" + maxAge)
.build(); return chain.proceed(request);
}
};
private static final LoggingInterceptor httpLoggingInterceptor = new LoggingInterceptor.Builder()
.loggable(BuildConfig.DEBUG)
.setLevel(Level.BASIC)
.log(Platform.INFO)
.request("Request")
.response("Response")
.build(); private static File httpCacheDirectory = new File(MyApplication.applicationContext.getCacheDir(), "mCache");
private static int cacheSize = 10 * 1024 * 1024; // 10 MiB
private static Cache cache = new Cache(httpCacheDirectory, cacheSize);
private static OkHttpClient client = new OkHttpClient.Builder()
.addNetworkInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)
.addInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)
.addInterceptor(httpLoggingInterceptor)
.cache(cache)
.build(); public static HttpManager getInstence() { if (apiManager == null) {
synchronized (HttpManager.class) {
if (apiManager == null) {
apiManager = new HttpManager();
}
}
}
return apiManager;
} private static Apiservice apiservice; public Apiservice getHttpService() {
if (apiservice == null) {
synchronized (new Object()) {
if (apiservice == null) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://192.168.0.104:8080")
.addConverterFactory(GsonConverterFactory.create()) //设置数据解析器
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(client)
.build();
apiservice = retrofit.create(Apiservice.class);
}
}
}
return apiservice;
}
}
package com.loaderman.demo.http;

import com.loaderman.demo.bean.User;

import java.util.List;
import java.util.Map; import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET; import retrofit2.http.Headers;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Part;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.QueryMap; public interface Apiservice {
// Path是网址中的参数,例如:trades/{userId}
// Query是问号后面的参数,例如:trades/{userId}?token={token}
// QueryMap 相当于多个@Query
// Field用于Post请求,提交单个数据,然后要加@FormUrlEncoded
// Body相当于多个@Field,以对象的方式提交
// @Streaming:用于下载大文件
// @Header,@Headers、加请求头 // 具体查看: https://square.github.io/retrofit/
@GET("/user/user1.json")
Call<User> getUser();
@POST("users/{user}/repos")
Call<List<User>> listRepos(@Path("user") String user);//@Path("user") 将参数替换到UR中 例如传 zhangsan ,那么URl为:users/zhangsan/repos @GET("users/list?sort=desc") //可以对数据进行排序
Call<User> getList(); @POST("users/new")
Call<User> createUser(@Body User user);//可传实体类 @Headers("Cache-Control: max-age=640000")
@GET("user/list")
Call<List<User>> userList(); @Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description); @FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last); @GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options); @GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
}

使用:

package com.loaderman.demo;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast; import com.loaderman.demo.bean.User; import com.loaderman.demo.http.HttpManager; import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class MainActivity extends AppCompatActivity { private TextView tvMsg;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvMsg = findViewById(R.id.tv_msg); }
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_get:
HttpManager.getInstence().getHttpService().getUser().enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
boolean successful = response.isSuccessful();
System.out.println("isSuccessful"+ successful);
if (successful){
User user = response.body();
tvMsg.setText(user.toString());
System.out.println("onResponse"+ user);
Toast.makeText(MainActivity.this,user.toString(),Toast.LENGTH_LONG).show();
}else {
Toast.makeText(MainActivity.this,response.code()+response.message(),Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(Call<User> call, Throwable t) {
System.out.println("onFailure"+t.toString());
}
}); break;
}
} }

最新文章

  1. Git 技能总结
  2. RabbitMQ入门教程——工作队列
  3. 提取Windows用户密钥文件cachedump
  4. WebService《JavaEE6权威指南 基础篇第4版》
  5. Android Studio修改包名和applicationId的方法
  6. boost库的使用(一)
  7. linux相关小工具的使用(一)————代码相关工具
  8. 网络组Network Teaming
  9. NOIP2017 小凯的疑惑
  10. 在win7下用net命令无法实现对用户的创建(未完成)
  11. rpm 相关问题
  12. 工程师的URL大全
  13. 30、进程的基础理论,并发(multiprocessing模块)
  14. Ubuntu - Start - 必要软件安装
  15. ORM全集
  16. gcc8.2安装__(沒有成功)
  17. 查询部门----返回给前台TreeView数据格式的数据
  18. java 其它可选方法
  19. Hadoop Single Node Setup(hadoop本地模式和伪分布式模式安装-官方文档翻译 2.7.3)
  20. Linux 的软件安装目录

热门文章

  1. xtrabackup备份恢复过程
  2. odoo 字段组件
  3. nginx的反向代理的优势,特点于原理(一)
  4. BLE 5协议栈-属性协议层(ATT)
  5. 【Swing】图形用户界面基础
  6. tp5将查询数据返回为对象转为数组
  7. 第二章 Vue快速入门--8 v-bind指令的学习
  8. Python之windows锁屏
  9. springboot整合jetty(转)
  10. C# dll文件添加引用失败