【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本身这个请求是成功的

相关推荐
私人珍藏库5 小时前
[Android] 京墨 v1.15.2 —— 古诗词文、汉语字典、黄历等查询阅读学习宝典(可离线)
android·学习·安卓
阿华的代码王国7 小时前
【Android】JSONObject和Gson的使用
android·java·json·gson·jsonobject
weixin_5885311511 小时前
android studio 同步慢问题解决
android·ide·android studio
AI2中文网11 小时前
别再说AppInventor2只能开发安卓了!苹果iOS现已支持!
android·ios·跨平台·苹果·appstore·app inventor 2·appinventor
xiayiye512 小时前
Android原生HttpURLConnection上传图片方案
android·android原生方案上传图片·httpurl上传图片·android原生api上传
fatiaozhang952714 小时前
晶晨线刷工具下载及易错点说明:生成工作流程XML失败
android·xml·网络·电视盒子·刷机固件·机顶盒刷机
CYRUS_STUDIO15 小时前
Frida + FART 联手:解锁更强大的 Android 脱壳新姿势
android·操作系统·逆向
阿华的代码王国16 小时前
【Android】使用Handler做多个线程之间的通信
android·handler·线程通信
DevRen17 小时前
实现Google原生PIN码锁屏密码效果
android·前端·kotlin