网络通信框架之retrofit
2024-09-05 05:18:47
主页: [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;
}
} }
最新文章
- Git 技能总结
- RabbitMQ入门教程——工作队列
- 提取Windows用户密钥文件cachedump
- WebService《JavaEE6权威指南 基础篇第4版》
- Android Studio修改包名和applicationId的方法
- boost库的使用(一)
- linux相关小工具的使用(一)————代码相关工具
- 网络组Network Teaming
- NOIP2017 小凯的疑惑
- 在win7下用net命令无法实现对用户的创建(未完成)
- rpm 相关问题
- 工程师的URL大全
- 30、进程的基础理论,并发(multiprocessing模块)
- Ubuntu - Start - 必要软件安装
- ORM全集
- gcc8.2安装__(沒有成功)
- 查询部门----返回给前台TreeView数据格式的数据
- java 其它可选方法
- Hadoop Single Node Setup(hadoop本地模式和伪分布式模式安装-官方文档翻译 2.7.3)
- Linux 的软件安装目录