首页 > 其他分享 >1-3.Retrofit 异常请求清单(404 请求、超时请求、连接失败请求)

1-3.Retrofit 异常请求清单(404 请求、超时请求、连接失败请求)

时间:2024-10-16 21:22:42浏览次数:11  
标签:请求 ------------------------------ create 404 okHttpClientBuilder new Retrofit

Retrofit

1、Retrofit 概述
  • Retrofit 是一个网络请求库,专门用于发送 HTTP 请求和处理 HTTP 响应
2、Retrofit 引入
  1. 在 AndroidManifest.xml 文件中添加相关权限,如果是 Android 6.0(API 级别 23)或之后,需要在运行时请求
<uses-permission android:name="android.permission.INTERNET" />
  1. 在模块级 build.gradle 中引入相关依赖
implementation 'com.squareup.okhttp3:logging-interceptor:3.8.1'

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'

implementation 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
implementation 'io.reactivex:rxandroid:1.2.0'
3、Retrofit 使用步骤
  1. 创建接口:创建一个接口,并定义具体的请求方法,使用 Retrofit 提供的注解来描述 HTTP 请求

  2. 配置 Retrofit:使用 Retrofit.Builder 构建出一个 Retrofit 实例对象

  3. 创建接口代理对象:通过 Retrofit 实例对象创建接口的代理对象

  4. 发送并处理请求:调用接口方法发送网络请求,通过回调处理请求结果


一、404 请求

1、Client Api
  • ApiService.java
@GET("test/testGet12345")
Call<String> test404();
2、Client Test
  • MainActivity.java
// 日志拦截器
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
okHttpClientBuilder.addInterceptor(httpLoggingInterceptor);
OkHttpClient okHttpClient = okHttpClientBuilder.build();

// 构建 Retrofit 对象
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://172.31.8.3:9999")
        .client(okHttpClient)
        .addConverterFactory(ScalarsConverterFactory.create())
        .addConverterFactory(GsonConverterFactory.create()) // 解析实体类
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 结合 RxJava
        .build();

ApiService apiService = retrofit.create(ApiService.class);
apiService.test404().enqueue(new Callback<String>() {
    @Override
    public void onResponse(Call<String> call, Response<String> response) {
        if (response.code() == 200) {
            String result = response.body();

            Log.i(TAG, "------------------------------ 请求成功,结果为:" + result);

            return;
        }

        if (response.code() == 404) {
            Log.i(TAG, "------------------------------ 请求 404");
            return;
        }

        Log.i(TAG, "------------------------------ 请求失败");
    }

    @Override
    public void onFailure(Call<String> call, Throwable t) {
        Log.i(TAG, "------------------------------ 请求失败:" + t.getMessage());
        Log.i(TAG, "------------------------------ " + t.getClass().getName());
    }
});
  • 输出结果
D/OkHttp: --> GET http://192.168.0.10:9999/test/testGet12345 http/1.1
D/OkHttp: --> END GET

D/OkHttp: <-- 404  http://192.168.0.10:9999/test/testGet12345 (101ms)
D/OkHttp: Content-Type: application/json
D/OkHttp: Transfer-Encoding: chunked
D/OkHttp: Date: Wed, 16 Oct 2024 13:01:13 GMT
D/OkHttp: Keep-Alive: timeout=60
D/OkHttp: Connection: keep-alive
D/OkHttp: {"timestamp":"2024-10-16T13:01:13.422+00:00","status":404,"error":"Not Found","path":"/test/testGet12345"}
D/OkHttp: <-- END HTTP (106-byte body)

I/MainActivity: ------------------------------ 请求 404

二、超时请求

1、Server
  • TestController.java
@RestController
@RequestMapping("/test")
@CrossOrigin
public class TestController {

    @GetMapping("/testTimeout")
    public String testTimeout() {
        try {
            Thread.sleep(20 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "testTimeout Hello World";
    }
}
2、Client Api
  • ApiService.java
@GET("/test/testTimeout")
Call<String> testTimeout();
3、Client Test
  • MainActivity.java
// 日志拦截器
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
okHttpClientBuilder.addInterceptor(httpLoggingInterceptor);
okHttpClientBuilder.connectTimeout(10, TimeUnit.SECONDS); // 连接超时
okHttpClientBuilder.readTimeout(10, TimeUnit.SECONDS); // 读取超时
okHttpClientBuilder.writeTimeout(10, TimeUnit.SECONDS); // 写入超时
OkHttpClient okHttpClient = okHttpClientBuilder.build();

// 构建 Retrofit 对象
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://172.31.8.3:9999")
        .client(okHttpClient)
        .addConverterFactory(ScalarsConverterFactory.create())
        .addConverterFactory(GsonConverterFactory.create()) // 解析实体类
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 结合 RxJava
        .build();

apiService = retrofit.create(ApiService.class);
apiService.testTimeout().enqueue(new Callback<String>() {
    @Override
    public void onResponse(Call<String> call, Response<String> response) {
        String result = response.body();

        Log.i(TAG, "------------------------------ 请求成功,结果为:" + result);
    }

    @Override
    public void onFailure(Call<String> call, Throwable t) {
        Log.i(TAG, "------------------------------ 请求失败:" + t.getMessage());
        Log.i(TAG, "------------------------------ " + t.getClass().getName());
    }
});
  • 输出结果
D/OkHttp: --> GET http://192.168.0.10:9999/test/testTimeout http/1.1
D/OkHttp: --> END GET

D/OkHttp: <-- HTTP FAILED: java.net.SocketTimeoutException: timeout

I/Main2Activity: ------------------------------ 请求失败:timeout
I/Main2Activity: ------------------------------ java.net.SocketTimeoutException

三、连接失败请求(错误地址)

1、Client Api
  • ApiService.java
@GET("/test/testGet")
Call<String> testFailedToConnect();
2、Client Test
  • MainActivity.java
// 日志拦截器
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
okHttpClientBuilder.addInterceptor(httpLoggingInterceptor);
OkHttpClient okHttpClient = okHttpClientBuilder.build();

// 构建 Retrofit 对象
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://192.168.0.11:9999")
        .client(okHttpClient)
        .addConverterFactory(ScalarsConverterFactory.create())
        .addConverterFactory(GsonConverterFactory.create()) // 解析实体类
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 结合 RxJava
        .build();

ApiService apiService = retrofit.create(ApiService.class);
apiService.testFailedToConnect().enqueue(new Callback<String>() {
    @Override
    public void onResponse(Call<String> call, Response<String> response) {
        String result = response.body();

        Log.i(TAG, "------------------------------ 请求成功,结果为:" + result);
    }

    @Override
    public void onFailure(Call<String> call, Throwable t) {
        Log.i(TAG, "------------------------------ 请求失败:" + t.getMessage());
        Log.i(TAG, "------------------------------ " + t.getClass().getName());
    }
});
  • 输出结果
D/OkHttp: --> GET http://192.168.0.11:9999/test/testGet http/1.1
D/OkHttp: --> END GET

标签:请求,------------------------------,create,404,okHttpClientBuilder,new,Retrofit
From: https://blog.csdn.net/weixin_52173250/article/details/142992074

相关文章

  • 【Azure 环境】请求经过应用程序网关,当响应内容大时遇见504超时报错
    问题描述API调用过程中,一旦遇到数据量大的场景下,返回504 超时的错误。注意: 请求首先达到ApplicationGateway,然后转发到后端的AppService服务中。 问题解答这可能与应用程序网关的“响应缓存区”配置有关:应用程序网关的响应缓冲区可以收集后端服务器发送的全部或部分......
  • RESTful API常用的HTTP请求方法
    RESTfulAPI常用的HTTP请求方法1.GET获取资源在RESTfulAPI中,一般用来获取数据,例如列表,详情等。对应CRUD中的R,即查找操作。请求参数通常在URL中传递(如查询字符串)。2.POST用途:创建新资源。特点:可以提交数据到服务器进行处理,通常会改变服务器的状态或数据。例如提交表单信息......
  • AJAX——HTTP 协议请求报文和响应报文结构
    1、HTTP(hypertexttransportprotocol)协议【超文本传输协议】,协议详细规定了浏览器和万维网服务器之间互相通信的规则。2、请求报文(浏览器向服务器发送的内容)重点是格式和参数        ①请求行             请求类型+/+url文件(页面路径/查询......
  • Go语言中http.Transport的RoundTrip方法请求过滤与拦截技巧与应用
    go语言中http.transport的请求过滤与拦截技巧与应用1.引言在Go语言的http包中,http.Transport作为底层的HTTP传输层实现,提供了强大的功能,可以用于发起HTTP请求。本文将重点介绍如何使用http.Transport实现请求过滤和拦截的技巧及其应用。2.请求过滤2.1过滤请求方法我们可以使用h......
  • springboot接口,放回404 Bad Request
    分析:这种报错,通常都是json格式有误,导致的,比如说接口接受的对象是JSONArray,但是传进来的参数是JSONObject类型2024-10-1610:39:07.555WARN18536---[io-8688-exec-10].w.s.m.s.DefaultHandlerExceptionResolver:Resolved[org.springframework.http.converter.HttpMessag......
  • JSON 请求太大,无法反序列化
    方案一asp.netmvc默认的json序列化ValueProviderFactory使用的是javascriptserializer,可以在配置文件web.config中设置:<addkey="aspnet:MaxJsonDeserializerMembers"value="150000000"/>和<system.web.extensions><scripting><w......
  • vue+wangEditor编辑器,上传图片请求后台接口
    来吧,先给大家看一下,是否是你想要的简单轻便编辑器的效果。父组件:<EditorView:content="value"@change="grtUrl"/><script>importEditorViewfrom"@/components/EditorView";exportdefault{components:{EditorView}},dat......
  • 网络数据请求
     测试可跳过域名校验 ......
  • uniapp(vue)打包web项目页面刷新后报404解决方案
    一、问题概述uniapp是一款优秀的跨平台开发框架,它可以帮助开发者快速构建出适用于多端的应用程序。然而,在项目打包后,有可能发现页面在刷新时会出现404错误。这无疑给用户体验带来了极大的困扰,下面我们就来分析一下这个问题。二、原因分析路由配置问题:uniapp项目采用Vue路由......
  • 代码随想录算法训练营day15| 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和
    学习资料:https://programmercarl.com/0110.平衡二叉树.html#算法公开课平衡二叉树:任意一个节点的左右子树高度差不超过1左叶子:是叶子节点,且是其父节点的左节点完全二叉树:上层均满,底层的节点从左到右连续满二叉树:每层都是满的,节点总数为(2^k+1)语法:2<<1是2^2学习记录:1......