【Android】Retrofit2发起GET请求 && POST请求

三三要成为安卓糕手

一:Retrofit2介绍

1:背景介绍

Retrofit 也是由 Square 公司开发的一个强大且易用的网络请求库,专门用于 Android 和 Java 应用程序。它基于 OkHttp,提供了一种更高层次的抽象,帮助开发者简化 RESTful API(网络接口)调用和解析响应数据的流程。但是在2016年后Square把它升级成了Retrofit2,这让Retrofit在处理网络请求的过程中更方便。

2:依赖添加

java 复制代码
//在gradle中添加依赖
com.squareup.retrofit2:retrofit:2.11.0
//Retrofit2内部可以直接使用GSON做数据解析,如果有需要,就添加Gson转换器
implementation 'com.squareup.retrofit2:converter-gson:2.11.0'
//添加一个Retrofit2中包装好的Json封装;用于传递转换器使用
com.squareup.retrofit2:converter-gson:2.11.0

二:根据请求文档定义接口

1:接口设计

请求URL

请求Query参数

2:代码

archive 英 ['ɑ:kaɪvz] 档案

java 复制代码
public interface ApiService {


    //定义了网络请求接口,指定了请求方式GET、指定URL路径、指定查询参数、指定返回的结果实体类对象
    //自动补全?http://titok.fzqq.fun/addons/cms/api.user/userInfo?user_id=4&type=archives
    @GET("http://titok.fzqq.fun/addons/cms/api.user/userInfo")
    Call<UserInfoQuery> getUserInfo(
            @Query("user_id") String user_id ,
            @Query("type") String type);



    @POST("http://titok.fzqq.fun/addons/cms/api.login/login")
    Call<ResLogin> login(@Body ReqLogin login);


}

(1)Call导包

(2)服务端返回的类

原来服务端返回的是json字符串,Retrofit2直接帮我们封装好了;对比下图中OkHttp的操作,还需要我们自己进行json字符串转换为UserInfoQuery这种操作

总结:ApiService手动定义的 "网络请求接口" ,里面用 Retrofit 注解(@GET/@POST 等)描述了所有 API 的请求细节(URL、参数、请求方法等)。

三:GET请求细节说明

java 复制代码
	/**
     * 发起get请求
     */
    private void sendGetRequest() {
        Retrofit retrofit  = new Retrofit.Builder()
                .baseUrl("http://titok.fzqq.fun/")
                .addConverterFactory(GsonConverterFactory.create())//配置一个Gson转换器
                .build();


        ApiService apiService = retrofit.create(ApiService.class);

        String userId = etUserId.getText().toString();
        Call<UserInfoQuery> queryCall = apiService.getUserInfo(userId, "archives");


        queryCall.enqueue(new Callback<UserInfoQuery>() {
            @Override
            public void onResponse(Call<UserInfoQuery> call, Response<UserInfoQuery> response) {
                //Retrofit2中已经把返回回来的JSON字符串转换成Java类对象UserInfoQuery了
                UserInfoQuery body = response.body();
                String nickname = body.getData().getUser().getNickname();

                Toast.makeText(Retrofit2Activity.this,"查询到:" + nickname , Toast.LENGTH_SHORT).show();
                Log.i(TAG, "onResponse: " + nickname);
            }

            @Override
            public void onFailure(Call<UserInfoQuery> call, Throwable throwable) {
                Toast.makeText(Retrofit2Activity.this,"请求失败",Toast.LENGTH_SHORT).show();
            }
        });
    }

1:流程梳理

创建 Retrofit 实例

  • 通过Retrofit.Builder()构建器配置基础参数
  • 指定baseUrl为请求的基础地址(http://titok.fzqq.fun/
  • 添加 Gson 转换器(GsonConverterFactory),用于自动将 JSON 响应转换为 Java 对象

创建 API 服务接口实例

  • 通过retrofit.create(ApiService.class)生成 ApiService 接口的实现类对象
  • ApiService 中定义了具体的接口请求方法(这里使用的是getUserInfo方法)

准备请求参数

  • 从输入框etUserId获取用户输入的 userId
  • 调用apiService.getUserInfo()方法,传入 userId 和固定参数 "archives",得到一个Call<UserInfoQuery>对象
  • 这个 Call 对象代表了一次网络请求

发起异步请求

  • 调用queryCall.enqueue()方法发起异步请求(不会阻塞 UI 线程)
  • 传入Callback<UserInfoQuery>回调接口处理请求结果

处理请求结果

  • 当请求成功时,onResponse方法被调用:

    • 通过response.body()获取转换后的 Java 对象UserInfoQuery
    • 从返回对象中提取用户昵称(nickname)
    • 显示 Toast 提示查询结果,并通过 Log 输出信息
  • 当请求失败时,onFailure方法被调用:

    • 显示 "请求失败" 的 Toast 提示

2:动态代理

retrofit.create(ApiService.class)

Retrofit 会通过 动态代理(Dynamic Proxy) 技术,自动生成 ApiService 接口的具体实现类

这个实现类里,会把你在 ApiService 中定义的注解(@GET@Path 等),转化为实际的 HTTP 请求逻辑(拼接 URL、设置参数、执行请求等)

3:转换器代理工厂

添加一个结果的转换器;我们想要使用一个工具对服务端返回回来的结果做json转换,这里直接new Gson是不行的

服务器返回给我们的是一个字符串,想用Gson处理,但是这里不能传递一个Gson对象;添加一个Retrofit2中包装好的Json封装

4:结果

四:Retrofit2发起POST请求

java 复制代码
    /**
     * 发起post请求
     */
    private void sendPostRequest() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://titok.fzqq.fun/")
                .addConverterFactory(GsonConverterFactory.create())//配置一个Gson转换器
                .build();

        ApiService apiService = retrofit.create(ApiService.class);

        String account = etUserName.getText().toString();
        String password = etPassword.getText().toString();

        Call<ResLogin> loginCall = apiService.login(new ReqLogin(account, password));

        loginCall.enqueue(new Callback<ResLogin>() {
            @Override
            public void onResponse(Call<ResLogin> call, Response<ResLogin> response) {
                ResLogin resLogin = response.body();
                if(response.isSuccessful() && resLogin.getCode() == 1){
                    Toast.makeText(Retrofit2Activity.this , "欢迎你,"
                            + response.body().getData().getUser_id() , Toast.LENGTH_SHORT).show();
                }else {
                    Toast.makeText(Retrofit2Activity.this,response.message(),Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<ResLogin> call, Throwable throwable) {
                Toast.makeText(Retrofit2Activity.this, "网络请求失败", Toast.LENGTH_SHORT).show();
            }
        });
    }

在onResponse和onFailure两个方法中的代码默认是在主线程中使用,这也是Retrofit2的便捷之处

1:正常登录

请求成功code 为 1

2:用户名或密码错误

注:在登录时我们应该考虑到多种场景,增加判断条件,避免程序崩溃

3:空参数传值

直接发起POST请求,啥参数都不写,或者有一项为空;根据"OK"这个弹窗来说,http本身这个请求是成功的

相关推荐
阿巴斯甜10 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker11 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952712 小时前
Andorid Google 登录接入文档
android
黄林晴13 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android