zoukankan      html  css  js  c++  java
  • 网络通信框架之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;
            }
        }
    
    }

  • 相关阅读:
    .net从网络接口地址获取json,然后解析成对象(一)
    .net获取本地ip地址
    .net上传文件,利用npoi读取文件信息到datatable里
    .net利用NPOI生成excel文件
    .NET获取城市信息(将三字代码转换成城市名)
    JS下拉页面时一个横幅的样式和js
    整数中1出现的次数(1~n)
    连续子数组的最大和
    最小的K个数
    数组中出现次数超过一半的数字
  • 原文地址:https://www.cnblogs.com/loaderman/p/6445921.html
Copyright © 2011-2022 走看看