Retrofit2.0的使用

依赖:

    implementation 'com.squareup.retrofit2:retrofit:2.1.0'
    implementation 'com.squareup.okhttp3:okhttp:3.4.2'
    implementation 'com.squareup.retrofit2:converter-gson:2.1.0' 


1.

public class RetrofitManager {
    //基地址
    public static final String BASE_URL = "基地址";//比如http://105.55.525.25:8080

    //单例
    private static RetrofitManager instance;

    private Retrofit retrofit;

    private RetrofitManager() {
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)//网络请求的地址
                .addConverterFactory(GsonConverterFactory.create())//数据解析器
                .build();
    }


    public static RetrofitManager getInstance() {
        if (instance == null) {
            instance = new RetrofitManager();
        }
        return instance;
    }


    public Retrofit getRetrofit() {
        return retrofit;
    }
    
}


2.interfase一个类,方便你随时拿,这里有三种请求方式,get、post请求数据、post上传文件:

public interface DataServer {

    //地址里不用再把基地址也写进去,因为你前面
    //单例RetrofitManigar的时候已经加进去里,这里的地址直接加上后面的就行

    //比如你地址是:https://105.55.525.25:8080/........
    //那你直接把8080后面的 /........复制到你的进去就行


    //get请求
    //比如@GET("/........")
    @GET("地址")
    Call<WXMode> getaccessToken(@Query("appid") String appid,
                                @Query("secret") String secret,
                                @Query("code") String code,
                                @Query("grant_type") String grant_type);

    //post请求数据
    //比如@POST("/........")
    @POST("地址")
    @FormUrlEncoded
    Call<User> getuser(@Field("nickName") String nickName,
                       @Field("sex") int sex,
                       @Field("headImg") String headImg,
                       @Field("uniqueCode") String uniqueCode,
                       @Field("userSource") int userSource);


    //Post上传文件
    //比如@POST("/........")
    @POST("地址")
    @Multipart
    Call<BaseModel> changeUserHeadImg(@Part("token") RequestBody token,
                                      @Part MultipartBody.Part file);

}


3.使用get请求:

private void getByOkhttp(final String code) {
    Retrofit retrofit = RetrofitManager.getInstance().getRetrofit();
    Call<WXMode> call = retrofit.create(DataServer.class).getaccessToken(APP_ID, WX_APP_SECRET, code, Authorization_Code);
    call.enqueue(new Callback<WXMode>() {
        @Override
        public void onResponse(Call<WXMode> call, retrofit2.Response<WXMode> response) {
            //请求成功返回的数据,也可以在这里做请求成功之后想做的事情
            String accessToken = response.body().getAccess_token();
            String openId = response.body().getOpenid();
            GetUserInfo(accessToken, openId);//获取用户信息
        }

        @Override
        public void onFailure(Call<WXMode> call, Throwable t) {
            //返回的错误信息
            Toast.makeText(WXEntryActivity.this, t.getMessage().toString(),Toast.LENGTH_SHORT).show();
        }
    });
}


4.Post请求数据:

private void loginByQQOpenId(String nick, int sex, String headImg, String uniqueCode, int userSource) {
    Retrofit retrofit = RetrofitManager.getInstance().getRetrofit();
    Call<User> getuser = retrofit.create(DataServer.class).getuser(nick, sex, headImg, uniqueCode, userSource);
    getuser.enqueue(new retrofit2.Callback<User>() {
        @Override
        public void onResponse(Call<User> call, Response<User> response) {
            //请求成功返回的信息
            if (response.body().getStatus() == 200) {//.getStatus()是文档接口返回示例的内容
               //在这里做你请求成功之后想做的事情,这里也会返回数据,用response.body去.能拿到
            } else {
                
            }
        }

        @Override
        public void onFailure(Call<User> call, Throwable t) {
            //请求错误返回的信息
            Toast.makeText(LoginActivity.this, t.getMessage().toString(),Toast.LENGTH_SHORT).show();
        }
    });
}


5.Post上传文件:

private void updataPic(String urifile) {
    Retrofit retrofit = RetrofitManager.getInstance().getRetrofit();
    //1.token
    RequestBody token = RequestBody.create(MediaType.parse("application/json"), app.getToken());//application/json是格式
    //2.文件
    File file = new File(urifile);
    final RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);//multipart/form-data是格式
    MultipartBody.Part filePart = MultipartBody.Part.createFormData("img", file.getName(), requestFile);//img是接口文档给你的参数名
    Call<BaseModel> call = retrofit.create(DataServer.class).changeUserHeadImg(token, filePart);
    call.enqueue(new Callback<BaseModel>() {
        @Override
        public void onResponse(Call<BaseModel> call, Response<BaseModel> response) {
            //请求成功
            if (response.body().getStatus() == 200) {//.getStatus()是文档接口返回示例的内容
               //在这里做你请求成功之后想做的事情,这里也会返回数据,用response.body去.能拿到
            } else {
                Toast.makeText(EditDataActivity.this, response.body().getMessage(),Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<BaseModel> call, Throwable t) {
            //请求错误返回的信息
            Toast.makeText(EditDataActivity.this, t.getMessage().toString(),Toast.LENGTH_SHORT).show();
        }
    });
}


6.这里用的三个mode都是接口文档返回的示例,你mode里是什么有什么,请求成功后返回的数据就有什么。比如我最后一个mode:BaseMode:

public class BaseModel {


    /**
     * message : 请求成功
     * status : 200
     * code : 0
     * currentTime : 1525406383649
     */

    private String message;
    private int status;
    private String code;
    private long currentTime;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public long getCurrentTime() {
        return currentTime;
    }

    public void setCurrentTime(long currentTime) {
        this.currentTime = currentTime;
    }
}

那我请求后台成功的话,response.body就能.getState,能.getCurrentTime...



猜你喜欢

转载自blog.csdn.net/qq_41873558/article/details/80643640