欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Retrofit的使用

程序员文章站 2024-03-01 00:02:22
...

先说说Retrofit这个框架,它是一个网络请求框架,底部封装了OKhttp,遵循了restful设计风格。它的优点有通过注解配置网络请求的参数、支持多种数据的解析(如gson)、支持同步异步请求、支持Rxjava。
用法
1.添加依赖
除了Retrofit还导入了Rxjava和gson的包,之后会用到

    compile 'com.squareup.retrofit2:retrofit:2.0.2'
    compile 'com.squareup.retrofit2:converter-gson:2.0.2'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'

2.创建服务器返回数据的bean类

public class User {
    private String id;
    private String name;

    public User() {}
    public User(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

3.创建配置网络请求的接口
这个接口只要是用来配置网络请求,核心就通过各种注解来配置

public interface RequestInterface {
    //Call<T>方法为接收响应数据的方法 响应的数据类型为T

    //通过GET方式进行网络请求,里面加URL
    /*
    @GET("Test/testretrofit?key=123456")
    Call<User> getuser();
    */

    //{}变量传参
    //使用时Call<User> userCall=requestInterface.getuser("testretrofit");
    @GET("Test/{aa}?key=123456")
    Call<User> getuser(@Path("aa") String aa);

    //通过Post方式进行网络请求,里面加URL
    /*
    @POST("Test/testretrofit?key=123456")
    Call<User> getuser();
    */

    //通过http设置请求,参数分别为请求方式、URL、是否有请求体
    //注意!!!method里面区分大小写
    /*
    @HTTP(method = "GET",path = "Test/testretrofit?key=123456",hasBody = false)
    Call<User> getuser();
    */

    //使用@body注解来设置请求体,现修改上述url的key为user
    //使用时传参,如:Call<User> userCall=requestInterface.getuser(new User("456","hhh"));
    //注意!!!body标签是将user对象转化成json写入请求体中,而不是像QueryMap在URL后面加键值对。
    //本例中的请求体读出后:{"id":"456","name":"hhh"}
    /*
    @HTTP(method = "POST",path = "Test/testretrofit",hasBody = true)
    Call<User> getuser(@Body User user);
    */
}

还有@field、@query、@part等不一一举例,给出一个偷来的汇总图,Retrofit的使用
Retrofit的使用
4.创建Retrofit实例
5.创建配置网络请求接口的实例
6.发送同步或异步请求并解析返回结果
这个步骤都在一个活activity中所以给出activity代码

public class MainActivity extends AppCompatActivity {

    //final static String url="http://localhost:8080/Test/testretrofit";

    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button= (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                request();
            }
        });
    }

    public void request(){
        //创建retrofit
        Retrofit retrofit=new Retrofit.Builder()
                .baseUrl("http://169.254.225.111:8080/")//设置请求的URL
                .addConverterFactory(GsonConverterFactory.create())//设置数据解析器为Gson
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//设置网络请求适配器为Rxjava
                .build();

       //通过创建网络请求接口的实例
        RequestInterface requestInterface=retrofit.create(RequestInterface.class);
        //创建请求的实例
       //Call<User> userCall=requestInterface.getuser();
        //Call<User> userCall=requestInterface.getuser(new User("456","hhh"));
        Call<User> userCall=requestInterface.getuser("testretrofit");

         //发送请求(异步)
        userCall.enqueue(new Callback<User>() {
            //请求成功
            @Override
            public void onResponse(Call<User> call, Response<User> response) {
                User user=response.body();
                Log.e("结果",user.getName());
                button.setText(user.getName());
            }
            //请求失败
            @Override
            public void onFailure(Call<User> call, Throwable t) {
                Log.e("结果",t.toString());
            }
        });


//        //发送请求(同步)
//        final Call<User> userCall=requestInterface.getuser();
//        new Thread(){
//            public void run(){
//                try {
//                    Response<User> response=userCall.execute();
//                    User user=response.body();
//                    Log.e("结果",user.getName());
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }.start();
//        //注意,不能在主线程中就行同步请求
    }


}

到这里基本的Retrofit用法介绍完了。然后Rxjava不太了解可以参考这篇文章:Rxjava基本用法

  • Retrofit上传图片
    首先一个上传文件的接口。MultipartBody.Part用于指定文件,如果要上传多个文件那就传一个MultipartBody.Part集合
public interface FileuploadService {
    @Multipart
    @POST("Test/testretrofit")
    Call<Result> upload(@Part("description") RequestBody description,
            @Part MultipartBody.Part img);
}

上传文件的核心代码

private void uploadpicture(String path){

        Retrofit retrofit=new Retrofit.Builder()
                .baseUrl("http://192.168.43.110:8080/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        FileuploadService fileuploadService=retrofit.create(FileuploadService.class);
        File file=new File(path);
        //创建请求体
        RequestBody requestfile=RequestBody.create(MediaType.parse("multipart/form-data"),file);
        MultipartBody.Part body=MultipartBody.Part.createFormData("aFile", file.getName(), requestfile);
        //MultipartBody.Part body=MultipartBody.Part.create(requestfile);//这样服务器通过表单读不到。
        String descriptionString = "This is description";
        RequestBody description =
                RequestBody.create(MediaType.parse("multipart/form-data"), descriptionString);
        //异步请求
        Call<Result> call=fileuploadService.upload(description,body);
        call.enqueue(new Callback<Result>() {
            @Override
            public void onResponse(Call<Result> call, Response<Result> response) {
                Log.e("result",response.body().getName());
            }

            @Override
            public void onFailure(Call<Result> call, Throwable t) {

            }
        });

    }

这样提交的表单是multipart/form-data类型。不能直接从请求体中解析,
服务器代码:servlet处理multipart/form-data
源码(含服务器代码)下载:Retrofit上传文件

相关标签: Retrofit