Retrofit 使用

2023-05-16

Retrofit 使用

    • Retrofit 官网
    • 导入依赖库
    • 请求数据(以 玩Android 为例,官方文档为 github 接口:https://api.github.com/)
          • 数据请求前提
          • get
          • post
          • 提交图片
          • 执行请求,并处理返回结果
    • 注解的含义及使用

Retrofit 官网

https://square.github.io/retrofit/

导入依赖库

// retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
// 或
// implementation 'com.squareup.retrofit2:retrofit:(insert latest version)'
// gson 解析数据,直接转换成需要的实体类或其他类型(可以不添加)
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
// 数据请求
implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'

请求数据(以 玩Android 为例,官方文档为 github 接口:https://api.github.com/)

  • 数据请求前提
    • 数据
      val baseurl = "https://www.wanandroid.com"
      val username = "bin"
      val password = "123456"
      
    • 创建请求的接口文件 Api.class
      interface Api{
      
      //    登陆
          @FormUrlEncoded
          @POST("/user/login")
          fun login(@Field("username") username:String, @Field("password") password:String) : Call<WanAndroidResponse<WanAndroidUser>>
      
      //    首页文章列表
          @GET("/article/list/{page}/json")
          fun homeArticleList(@Path("page") page:Int) : Call<WanAndroidResponse<ArticleList>>
      }
      
    • 创建 Retrofit 对象
      val retrofit: Retrofit = Retrofit.Builder()
                      .baseUrl(baseurl)
                      .addConverterFactory(GsonConverterFactory.create())
                      .build()
      
    • 创建 Api 对象
      var mApi: Api = retrofit.create(Api::class.java)
      
  • get
    mApi.homeArticleList(0).also {
                it.enqueue(object : Callback<WanAndroidResponse<ArticleList>> {
                    override fun onFailure(
                        call: Call<WanAndroidResponse<ArticleList>>?,
                        t: Throwable?
                    ) {
                        Log.e(TAG, "getHomeArticleList onFailure:\n ${t.toString()}\n${call.toString()}" )
                    }
    
                    override fun onResponse(
                        call: Call<WanAndroidResponse<ArticleList>>?,
                        response: Response<WanAndroidResponse<ArticleList>>?
                    ) {
                        Log.e(TAG, "getHomeArticleList onResponse: ${response!!.body().toString()}" )
                    }
    
                })
            }
    
  • post
    mApi.login(username, password).also {
                it.enqueue(object : Callback<WanAndroidResponse<WanAndroidUser>> {
                    override fun onFailure(call: Call<WanAndroidResponse<WanAndroidUser>>, t: Throwable) {
                        Log.e(TAG, "login onFailure:\n ${t.toString()}\n${call.toString()}" )
                    }
    
                    override fun onResponse(
                        call: Call<WanAndroidResponse<WanAndroidUser>>,
                        response: Response<WanAndroidResponse<WanAndroidUser>>
                    ) {
                        Log.e(TAG, "login onResponse: ${response.body().toString()}" )
                        Log.e(TAG, "onResponse: ${response.headers()}" )
    
                        cookieList = response.headers().values("Set-Cookie")
                        Log.e(TAG, "onResponse: ${response.headers().values("Set-Cookie")}\n${cookieList.size}" )
                    }
    
                })
            }
    
  • 提交图片
    @Multipart
        @POST("home/upload-image")
        Call<PictureBean> setHttpPortrait(@Part MultipartBody.Part part);
    
    private void setHttpPortrait(final String name, final String strPath) {//name:参数名称;strPath:图片路径
            File file = new File(strPath);
            RequestBody imageBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
            MultipartBody.Part imageBodyPart = MultipartBody.Part.createFormData(name, file.getName(), imageBody);
            Call<PictureBean> repos = xxx.setHttpPortrait(imageBodyPart);
            repos.enqueue(new Callback<PictureBean>() {
                @Override
                public void onResponse(Call<PictureBean> call, Response<PictureBean> response) {
                    try {
                        if (response.body().isOk()) {//请求成功
                            //返回数据处理
                        } else {
                            //图片上传失败
                        }
                    } catch (Exception e) {
                        //返回数据异常
                    }
                }
     
                @Override
                public void onFailure(Call<PictureBean> call, Throwable t) {
                    //请求异常
                }
            });
        }
    
    @Multipart
        @POST("home/upload-image")//多张上传图片
        Call<PictureBean> setHttpDataPortrait(@Part List file);
    
    private void setHttpPortrait(final String name, final List<String> paths) {
            showLoading();
            MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
            for (String path : paths) {
                File file = new File(path);
                RequestBody requestBody = RequestBody.create(MediaType.parse("text/x-markdown; charset=utf-8"), file);
                builder.addFormDataPart("files", file.getName(), requestBody);
            }
            List parts = builder.build().parts();
     
            Call<PictureBean> repos = xxx.setHttpDataPortrait(parts);
            repos.enqueue(new Callback<PictureBean>() {
                @Override
                public void onResponse(Call<PictureBean> call, Response<PictureBean> response) {
                    try {
                        if (response.body().isOk()) {
                            //返回数据处理
                        } else {
                            //图片上传失败
                        }
                    } catch (Exception e) {
                        //返回数据异常
                    }
                }
     
                @Override
                public void onFailure(Call<PictureBean> call, Throwable t) {
                    //请求异常
                }
            });
        }
    
  • 执行请求,并处理返回结果
    mApi.xxx().enqueue(object : Callback<ResponseBody> {
                override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
                    // 请求成功,进行后续处理
                }
    
                override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
                    // 请求失败,进行后续处理
                }
    
            })
    

注解的含义及使用

  • 请求方法
    • @GET
    • @POST
    • @PUT
    • @DELETE
    • @PATH
    • @HEAD
    • @OPTIONS
    • @HTTP
  • 标记类
    • @FormUrlEncoded
      表示请求主体是表单
    • @Multipart
      表示请求主体是支持文件上传的表单
    • @Streaming
      表示返回的数据以流的形式返回。适用于返回数据较大的场景(没使用过)
  • 请求参数
    • @Headers
      添加请求头(固定的请求头)

      @Headers({
          "Accept: application/vnd.github.v3.full+json",
          "User-Agent: Retrofit-Sample-App"
      })
      @GET("users/{username}")
      Call<User> getUser(@Path("username") String username);
      
      @Headers("Cache-Control: max-age=640000")
      @GET("widget/list")
      Call<List<Widget>> widgetList();
      
    • @HeaderMap
      添加请求头(不固定的请求头)

      @GET("user")
      Call<User> getUser(@HeaderMap Map<String, String> headers)
      
    • @Header
      添加单个请求头(不固定的请求头)

      @GET("user")
      Call<User> getUser(@Header("Authorization") String authorization)
      
    • @Body
      用于非表单请求体(传实体类对象或其他自己需要的类型)

      @POST("users/new")
      Call<User> createUser(@Body User user);
      
      @POST("auth/guest")
      Call<BaseResponse<TokenInfo>> guest(@Body RequestBody requestBody);
      
    • @Field
      向 post 表单传入键值对

      @FormUrlEncoded
      @POST("user/edit")
      Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
      
    • @FieldMap
      向 post 表单传入多个键值对

      @FormUrlEncoded
      @POST("user/edit")
      Call<User> updateUser(@FieldMap Map<String, String> fields);
      
    • @Part
      向 post 表单传入键值对(需要上传文件的场景)

      @Multipart
       @POST("/")
       Call<ResponseBody> example(
           @Part("description") String description,
           @Part(value = "image", encoding = "8-bit") RequestBody image);
      
       @Multipart
          @POST("home/upload-image")
          Call<PictureBean> setHttpPortrait(@Part MultipartBody.Part part);
      
    • @PartMap
      向 post 表单传入多个键值对(需要上传文件的场景)

      @Multipart
       @POST("/upload")
       Call<ResponseBody> upload(
           @Part("file") RequestBody file,
           @PartMap Map<String, RequestBody> params);
      
      @Multipart
          @POST("home/upload-image")//多张上传图片
          Call<PictureBean> setHttpDataPortrait(@Part List file);
      
    • @Query
      向 get 请求传入参数及对应的值

      @GET("/friends")
       Call<ResponseBody> friends(@Query("page") int page);
      
    • @QueryMap
      向 get 请求传入多个参数及对应的值

       @GET("/friends")
       Call<ResponseBody> friends(@QueryMap Map<String, String> filters);
      
    • @Path
      向 get 请求传入链接的缺省值

      @GET("users/{user}/repos")
      Call<List<Repo>> listRepos(@Path("user") String user);
      
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Retrofit 使用 的相关文章

随机推荐

  • 深入学习Tomcat----自己动手写服务器(附服务器源码)

    相信大多 Web 开发者对 Tomcat 是非常熟悉的 xff0c 众所周知 Tomcat 是一款非常好用的开源 Servlet 容器 xff0c 您一定对这个最流行的 Servlet 容器充满好奇 xff0c 虽然它并不像一个黑盒子那样让
  • Cesium入门(六):加载EPSG4326网格的瓦片地图

    本章介绍Cesium JS库的TilingScheme类 xff0c 并以GeoServer服务器为例演示了加载EPSG 4326网络的瓦片地图 主要包括以下内容 xff1a TilingScheme添加EPSG 4326瓦片图层 在Ces
  • Cesium入门(七):设置影像图层的覆盖范围

    本章介绍Cesium JS库的Rectangle类 xff0c 并以GeoServer服务器为例演示了在加载EPSG 4326网格的瓦片地图时 xff0c 通过设置rectangle参数来限定图层的覆盖范围 主要包括以下内容 xff1a R
  • Wget下载网页与镜像网站

    本文主要介绍GNU Wget实用程序及其在在FreeBSD操作系统下的安装过程 xff0c 并对几个最常用的下载功能进行了说明 xff0c 主要包括以下几个方面 xff1a GNU Wget概述Wget程序安装Wget常用功能 1 GNU
  • 使用cron定时执行任务

    本文主要介绍Unix系统中用于定时执行任务的cron守护程序和crontab配置表的文件格式 xff0c 并对自动执行脚本文件时的注意事项进行了说明 xff0c 主要包括以下几个方面 xff1a cron守护程序概述crontab配置表cr
  • 用Imagex备份&还原Windows7简明教程+本人编写的批处理+解说Imagex常用命令

    用Imagex备份 amp 还原Windows7简明教程 43 本人编写的批处理 43 解说Imagex常用命令 2012 03 26 23 32 53 分类 xff1a Windows 7 探索实 标签 xff1a 举报 字号 大 中 小
  • Android 硬件版本问题(M/Q/O/RM)

    M gt MTK Q gt 高通 O gt 海外 RM gt 国内 个人理解 xff1a 软件在编写的过程中 xff0c 为了适配不同的硬件 处理器 xff0c 要搞不同的内置版本
  • 学成在线笔记三:CMS管理页面开发

    注意 xff1a 我是用的element ui的版本位 xff1a 2 10 1 xff0c 若要使用本博客中的前端代码 xff0c 建议修改为相同版本 修改方式 xff1a 修改根目录下的package json中dependencies
  • vue3 和 vite3脚手架相关20个库

    学会这 20 个库 xff0c 让你快速看懂 vue3 和 vite3 源码 x1f680 前言 写一个开源的项目也不例外 xff0c 就拿在国内很火的 vue3 框架 和 vite 工具 来讲 xff0c 其中的实现与架构设计无不是一个
  • SQL高级优化

    知识回顾 1 git版本控制工具 xff0c 主要管理项目的代码文件 它相比CVS SVN它特点 xff0c 可支持分布式 外网 离线工作 主流代码管理工具 2 xff09 基本概念 工作空间 本地索引 本地仓库 远程仓库 就体积而言 xf
  • windows批处理:暂停的处理

    参考 xff1a https www cnblogs com yulinlewis p 10074565 html 总结 xff1a 1 ping n 1 127 1 127 1是127 0 0 1 xff0c 被称为本地回环地址 xff0
  • 如何减小与“大牛”的差距

    为什么同样的时间有的人可以漂亮的完成工作 xff0c 而有些人废了很大的力气也没有完成 xff1f 前者我们常常称之为 大牛 xff0c 后者我们常常叫他们 菜鸟 当然 大牛 都是相对而言的 xff0c 大牛 也不可能方方面面都非常厉害 x
  • Android Studio:模拟器启动后不停闪烁

    解决方法 xff1a graphics选择Software
  • java基于springboot+vue的企业员工人事工资薪酬管理系统 elementui

    系统主要分为管理员和普通用户和员工三部分 主要功能包括个人中心 普通用户管理 员工管理 人事档案管理 部门管理 薪酬管理 人事调动管理 职务管理 培训管理 招聘信息管理 求职简历管理 邀请面试管理 录用信息管理 员工应聘管理 系统管理等功能
  • Unity设置横竖屏

    Unity设置横竖屏 使用开发工具设置 xff08 工程统一设置 xff09 使用代码设置 xff08 可以分开设置不同场景 xff09 使用开发工具设置 xff08 工程统一设置 xff09 使用代码设置 xff08 可以分开设置不同场景
  • 网络错误 Unable to resolve host

    1 没有网络权限 2 没有网络 3 防火墙阻止
  • Android 项目中 Mopub 广告基础使用(插屏和横幅)

    1 下载 MoPub Android SDK repositories mavenCentral MoPub SDK is now available in Maven Central android compileOptions sour
  • Camera2打开相机,建立会话,并监听相机流(以拍照为例)

    Camera2打开相机 xff0c 建立会话 xff0c 并监听相机流 xff08 以拍照为例 xff09 获取 CameraManager通过 CameraManager openCamera 方法打开相机 xff0c 监听回调 xff0
  • 协程的创建

    GlobalScope launch 使用 xff08 代码会在当前线程所有内容执行完成之后再执行 xff09 新建线程 xff0c 执行 34 延时 1 秒 xff0c 打印当前线程名称 34 的代码 GlobalScope launch
  • Retrofit 使用

    Retrofit 使用 Retrofit 官网导入依赖库请求数据 xff08 以 玩Android 为例 xff0c 官方文档为 github 接口 xff1a https api github com xff09 数据请求前提getpos