Java Retrofit2使用

简介: 本文使用eclipse编辑器,gradle依赖jar,如若未配置此环境,请转Java Eclipse配置gradle编译项目配置好环境后再查看此文在build.

本文使用eclipse编辑器,gradle依赖jar,如若未配置此环境,请转Java Eclipse配置gradle编译项目配置好环境后再查看此文

  1. 在build.gradle文件中添加一下依赖
    compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'
  1. 定义java bean,bean中的变量名要与返回的json数据中的key保持一致,否则会匹配不上。
// 1. 定义java bean
    /**
     * Java Bean
     */
    public class Info {
        int error_code; // 状态码
        String reason; // 返回状态文字
        Result result; // 页面URL

        @Override
        public String toString() {
            return "Info [error_code=" + error_code + ", reason=" + reason + ", result=" + result.toString() + "]";
        }
    }

    /**
     * Java Bean
     */
    public class Result {
        String h5url;
        String h5weixin;

        @Override
        public String toString() {
            return "Result [h5url=" + h5url + ", h5weixin=" + h5weixin + "]";
        }
    }
  1. 定义接口。
    static String url = "http://v.juhe.cn/"; // 请求链接
    static String KEY = "9488373060c8483a3ef6333353fdc7fe"; // 请求参数
    // 2. 定义接口
    public interface InfoService{
        @GET("wepiao/query")
        Call<Info> getInfo(
                @Query(value = "key")
                String key
        );
    }

4.获取Retrofit实例

        // 3. 获取实例
        Retrofit retrofit = new Retrofit.Builder()
                // 设置OKHttpClient,如果不设置会提供一个默认的
                .client(new OkHttpClient())
                //设置baseUrl
                .baseUrl(url)
                //添加Gson转换器
                .addConverterFactory(GsonConverterFactory.create())
                .build();
  1. 执行retrofit.create方法
        // 4. 执行retrofit.create方法
        InfoService infoService = retrofit.create(InfoService.class);
  1. 执行同步请求
        // 5. 执行请求
        Call<Info> call = infoService.getInfo(KEY);
        Response<Info> response = call.execute();
        
        // 6. 判断是否成功,成功则打印出数据
        if (response.isSuccessful()) {
            Info info = response.body();
            System.out.println(info.toString());
        }
  1. 执行异步请求
        // 5. 执行请求
        Call<Info> call = infoService.getInfo(KEY);
        call.enqueue(new Callback<RetrofitTest2.Info>() {
            
            public void onResponse(Call<Info> call, Response<Info> response) {
                Info info = response.body();
                System.out.println(info);
            }
            
            public void onFailure(Call<Info> call, Throwable t) {
                System.out.println(t.getMessage());
            }
        });

retrofit注解:

方法注解,包含@GET、@POST、@PUT、@DELETE、@PATH、@HEAD、@OPTIONS、@HTTP。
标记注解,包含@FormUrlEncoded、@Multipart、@Streaming。
参数注解,包含@Query,@QueryMap、@Body、@Field,@FieldMap、@Part,@PartMap。
其他注解,@Path、@Header,@Headers、@Url。
几种特殊的注解
@HTTP:可以替代其他方法的任意一种

   /**
     * method 表示请的方法,不区分大小写
     * path表示路径
     * hasBody表示是否有请求体
     */
    @HTTP(method = "get", path = "users/{user}", hasBody = false)
    Call<ResponseBody> getFirstBlog(@Path("user") String user);

@Url:使用全路径复写baseUrl,适用于非统一baseUrl的场景。

    @GET
    Call<ResponseBody> v3(@Url String url);

@Streaming:用于下载大文件

    @Streaming
    @GET
    Call<ResponseBody> downloadFileWithDynamicUrlAsync(@Url String fileUrl);
    ResponseBody body = response.body();
    long fileSize = body.contentLength();
    InputStream inputStream = body.byteStream();

常用注解
@Path:URL占位符,用于替换和动态更新,相应的参数必须使用相同的字符串被@Path进行注释

    @GET("group/{id}/users")
    Call<List<User>> groupList(@Path("id") int groupId);
    //--> http://baseurl/group/groupId/users

    //等同于:
    @GET
    Call<List<User>> groupListUrl(
          @Url String url
    );

@Query,@QueryMap:查询参数,用于GET查询,需要注意的是@QueryMap可以约定是否需要encode

    @GET("group/users")
    Call<List<User>> groupList(@Query("id") int groupId);
    //--> http://baseurl/group/users?id=groupId
    Call<List<News>> getNews((@QueryMap(encoded=true) Map<String, String> options);

@Body:用于POST请求体,将实例对象根据转换方式转换为对应的json字符串参数,这个转化方式是GsonConverterFactory定义的。

     @POST("add")
     Call<List<User>> addUser(@Body User user);

@Field,@FieldMap:Post方式传递简单的键值对,需要添加@FormUrlEncoded表示表单提交Content-Type:application/x-www-form-urlencoded.

    @FormUrlEncoded
    @POST("user/edit")
    Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);

@Part,@PartMap:用于POST文件上传
其中@Part MultipartBody.Part代表文件,@Part("key") RequestBody代表参数
需要添加@Multipart表示支持文件上传的表单,Content-Type: multipart/form-data.

    @Multipart
    @POST("upload")
    Call<ResponseBody> upload(@Part("description") RequestBody description, @Part MultipartBody.Part file);
// https://github.com/iPaulPro/aFileChooser/blob/master/aFileChooser/src/com/ipaulpro/afilechooser/utils/FileUtils.java
    // use the FileUtils to get the actual file by uri
    File file = FileUtils.getFile(this, fileUri);

    // create RequestBody instance from file
    RequestBody requestFile =
            RequestBody.create(MediaType.parse("multipart/form-data"), file);

    // MultipartBody.Part is used to send also the actual file name
    MultipartBody.Part body =
            MultipartBody.Part.createFormData("picture", file.getName(), requestFile);

    // add another part within the multipart request
    String descriptionString = "hello, this is description speaking";
    RequestBody description =
            RequestBody.create(
                    MediaType.parse("multipart/form-data"), descriptionString);

@Header:header处理,不能被互相覆盖,用于修饰参数

    //动态设置Header值
    @GET("user")
    Call<User> getUser(@Header("Authorization") String authorization)

等同于

    //静态设置Header值
    @Headers("Authorization: authorization")//这里authorization就是上面方法里传进来变量的值
    @GET("widget/list")
    Call<User> getUser()

@Headers 用于修饰方法,用于设置多个Header值

    @Headers({
        "Accept: application/vnd.github.v3.full+json",
        "User-Agent: Retrofit-Sample-App"
    })
    @GET("users/{username}")
    Call<User> getUser(@Path("username") String username);
目录
相关文章
|
Java API Python
Java:retrofit2发送http网络请求
Java:retrofit2发送http网络请求
206 0
|
Java fastjson 数据格式
Java Retrofit2使用--自定义转换器
Retrofit2的基础使用请参考Java Retrofit2使用 自定义Converter(转换器) retrofit默认情况下支持的converts有Gson,Jackson,Moshi... 搭建基础架构 这里将自定义一个FastJsonConverterFactory来解析返回的数据,其内部使用阿里巴巴的Fastjson(依赖添加compile 'com.alibaba:fastjson:1.2.37')。
1646 0
|
9天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
9天前
|
安全 Java 开发者
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第9天】本文将深入探讨Java并发编程的核心概念,包括线程安全和性能优化。我们将详细解析Java中的同步机制,包括synchronized关键字、Lock接口以及并发集合等,并探讨它们如何影响程序的性能。此外,我们还将讨论Java内存模型,以及它如何影响并发程序的行为。最后,我们将提供一些实用的并发编程技巧和最佳实践,帮助开发者编写出既线程安全又高效的Java程序。
22 3
|
12天前
|
设计模式 安全 Java
Java并发编程实战:使用synchronized关键字实现线程安全
【4月更文挑战第6天】Java中的`synchronized`关键字用于处理多线程并发,确保共享资源的线程安全。它可以修饰方法或代码块,实现互斥访问。当用于方法时,锁定对象实例或类对象;用于代码块时,锁定指定对象。过度使用可能导致性能问题,应注意避免锁持有时间过长、死锁,并考虑使用`java.util.concurrent`包中的高级工具。正确理解和使用`synchronized`是编写线程安全程序的关键。
|
10天前
|
Java
Java 并发编程:深入理解线程池
【4月更文挑战第8天】本文将深入探讨 Java 中的线程池技术,包括其工作原理、优势以及如何使用。线程池是 Java 并发编程的重要工具,它可以有效地管理和控制线程的执行,提高系统性能。通过本文的学习,读者将对线程池有更深入的理解,并能在实际开发中灵活运用。
|
9天前
|
算法 Java 开发者
Java中的多线程编程:概念、实现与性能优化
【4月更文挑战第9天】在Java编程中,多线程是一种强大的工具,它允许开发者创建并发执行的程序,提高系统的响应性和吞吐量。本文将深入探讨Java多线程的核心概念,包括线程的生命周期、线程同步机制以及线程池的使用。接着,我们将展示如何通过继承Thread类和实现Runnable接口来创建线程,并讨论各自的优缺点。此外,文章还将介绍高级主题,如死锁的预防、避免和检测,以及如何使用并发集合和原子变量来提高多线程程序的性能和安全性。最后,我们将提供一些实用的性能优化技巧,帮助开发者编写出更高效、更稳定的多线程应用程序。
|
7天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第11天】 在Java中,高效的并发编程是提升应用性能和响应能力的关键。本文将探讨Java并发的核心概念,包括线程安全、锁机制、线程池以及并发集合等,同时提供实用的编程技巧和最佳实践,帮助开发者在保证线程安全的前提下,优化程序性能。我们将通过分析常见的并发问题,如竞态条件、死锁,以及如何利用现代Java并发工具来避免这些问题,从而构建更加健壮和高效的多线程应用程序。
|
11天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第7天】在现代软件开发中,多线程编程已经成为一种不可或缺的技术。为了提高程序性能和资源利用率,Java提供了线程池这一强大工具。本文将深入探讨Java线程池的原理、使用方法以及如何根据实际需求定制线程池,帮助读者更好地理解和应用线程池技术。
15 0
|
1天前
|
存储 安全 Java
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
7 1