网络通信框架之retrofit
主页: [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;
}
} }
网络通信框架之retrofit的更多相关文章
- 网络通信框架Retrofit2
网络通信框架Retrofit2 1 概要 Retrofit2的简介以及特点 Retrofit2使用配置(导包,权限等) Retrofit2中常用的注解介绍 Retrofit2实现http网络访问 GE ...
- c#网络通信框架networkcomms内核解析 序言
NetworkComms网络通信框架序言 networkcomms是我遇到的写的最优美的代码,很喜欢,推荐给大家:) 基于networkcomms2.3.1开源版本( gplv3)协议,写了一些文章, ...
- c#网络通信框架networkcomms内核解析之十 支持优先级的自定义线程池
NetworkComms网络通信框架序言 本例基于networkcomms2.3.1开源版本 gplv3协议 如果networkcomms是一顶皇冠,那么CommsThreadPool(自定义线程池 ...
- c#网络通信框架networkcomms内核解析之九 自定义处理方法的运行机制
NetworkComms网络通信框架序言 本文基于networkcomms2.3.1开源版本 gplv3协议 我们自己写的处理方法都称之为自定义处理方法 比如,我们在服务器上写的与登陆相关的处理方法 ...
- c#网络通信框架networkcomms内核解析之八 数据包的核心处理器
NetworkComms网络通信框架序言 本文基于networkcomms2.3.1开源版本 gplv3协议 我们先回顾一个 c#网络通信框架networkcomms内核解析之六 处理接收到的二进制 ...
- NetworkComms网络通信框架V3结构图
NetworkComms网络通信框架序言 来自英国的c#网络通信框架,历时五年打造,由英国剑桥的2位工程师倾情开发,最新版本V3.x版本.
- 强大的网络通信框架(实现缓存)--第三方开源--volley
Android Volley是Android平台上很好用的第三方开源网络通信框架.使用简答,功能强大. Android Volley的库jar包Volley.ja下载连接地址:Volley下载 下载后 ...
- 成熟的C#网络通信框架介绍——ESFramework通信框架
(转自:http://www.cnblogs.com/zhuweisky/archive/2010/08/12/1798211.html) ESFramework通信框架是一套性能卓越.稳定可靠.强大 ...
- DotNetty网络通信框架学习之初识Netty
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...
随机推荐
- dhcpd.conf配置文件几例
例1 ddns-update-style interim; ignore client-updates; subnet 192.168.222.0 netmask 255.255.255.0 { ...
- centos 7 安装 LNMPC cacti 1.2.7 监控
先上图,后续更新
- DA_04_解决Xshell中文乱码问题
一:解决Xshell中文乱码问题 二:解决克隆后eth0不见的问题 2.1:虚拟机克隆步骤: 1.直接修改 /etc/sysconfig/network-script/i ...
- 从零开始学会GAN 0:第一部分 介绍生成式深度学习(连载中)
本书的前四章旨在介绍开始构建生成式深度学习模型所需的核心技术.在第1章中,我们将首先对生成式建模领域进行广泛的研究,并从概率的角度考虑我们试图解决的问题类型.然后,我们将探讨我们的基本概率生成模型的第 ...
- java8学习之Lambda表达式深入与流初步
Lambda表达式深入: 在上一次[http://www.cnblogs.com/webor2006/p/8135873.html]中介绍Lambda表达式的作用时,其中说到这点: 如标红处所说,既然 ...
- P2634 树上路径长度为3的倍数的点对数 点分治
在计算答案的时候维护一个数组num num[i]为当前所有点距离根距离%3的数量 则当前块的答案为num[0]*num[0]+2*num[1]*num[2] #include<bits/stdc ...
- go学习开篇
我是做java开发的,从接触java开始算,已经8年了,为什么会想到学go语言呢?前端时间我一直在学习jvm,java的一些更底层的东西,梳理回顾时,感觉可以通过学习其他开发语言,来提 ...
- git 学习使用记录
一.一个小时学会git:https://www.cnblogs.com/best/p/7474442.html 二.fetch fatal: Refusing to fetch into curren ...
- CSS基础学习-15.CSS3 动画效果
- nodejs基础一
Node.js是一个基于Chrome V8引擎的JavaScript运行. js的运行环境 运行js有两种: .js文件方式 交互(REPL): node 回车进入交互模式 .exit 退出交互模式 ...