retrofit的简单使用

Retrofit详细全解

什么是Retrofit?

Retrofit 是一个广泛用于 Android 和 Java 项目的网络请求库,它可以帮助你方便地进行 HTTP 请求和处理服务器响应。Retrofit 是 Square 公司开发的一个开源库,旨在简化网络请求的处理,并以清晰的方式定义 API 端点和请求参数。

  1. 声明式 API 定义:Retrofit 允许你使用 Java 接口来定义 API 请求,将请求方法与请求 URL 直观地映射在一起。这使得代码易于阅读和维护。
  2. 强大的请求定制:你可以使用 Retrofit 提供的注解来自定义请求,包括请求方法(GET、POST、PUT、DELETE 等)、请求头、请求参数、请求体等。
  3. 数据转换:Retrofit 支持多种数据格式,包括 JSON、XML 和其他自定义格式。你可以使用不同的转换器工厂来处理这些数据格式。
  4. 多线程支持:Retrofit 允许你在后台线程上执行网络请求,然后轻松切换到主线程以处理响应,以确保不会阻塞应用程序的用户界面。
  5. 错误处理:Retrofit 提供了灵活的错误处理机制,允许你定义如何处理不同类型的错误响应。
  6. 拦截器:你可以添加拦截器来修改请求和响应,例如添加身份验证信息、日志记录等。
  7. 适配器:Retrofit 支持各种适配器,例如 RxJava、LiveData 和 Java 8 的 CompletableFuture,以便更好地与不同的异步编程模型集成。
  8. 轻量级:Retrofit 是一个轻量级库,它的使用不会增加太多的应用大小。

为什么有retrofit?

Retrofit 提供了一种方便且强大的方式来处理网络请求和与服务器进行通信。它简化了与 RESTful API 交互的过程,减少了样板代码的编写,使开发者能够更专注于业务逻辑和用户体验的构建。这些特性使得 Retrofit 成为许多应用程序中不可或缺的网络请求库。

Retrifit如何使用?

retrifot的是处理网络请求和服务器进行通信,我们使用动态代理模式:

基本步骤:

一:在接口里面声明一个方法(随便起一个名字):作为申请数据的方法

由于这是Retrofit框架:使用反射,读取注解,获取注解中的信息,通过动态代理类调用接口的方法,生成一个Call:

创建一个接口:

示例使用GET方式,得到数据:

package com.example.demo;

import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.GET;
import retrofit2.http.Path;
import retrofit2.http.Query;

public interface APIService {
    //表示返回一个String
    @GET(value = "{path}/now")
    Call<String> getData(@Path("path") String path, @Query("location") String location, @Query("key") String id);

}

二:在主活动里面创建Retrofit实例,进行基本配置:

1.baseUrl():

作为基本url,此处一般写为不变的前半部分

2.addConverterFactory():

希望将申请回来的数据转换成对象(反序列化),或者其他类型,创建一个对应的转换器,放在参数位置:

ScalarsConverterFactory.create() 创建了一个转换器,它可以处理纯文本响应,如字符串或标量值(例如整数、布尔值),这些响应来自 Web 服务。这在 API 的响应不是结构化格式,而是简单文本或数字时非常有用。

GsonConverterFactory.create()``GsonConverterFactory.create() 来创建一个 Gson 转换器,它将处理来自 API 的 JSON 响应并将其转换为 Java 对象,前提是您已经定义了相应的 Java 类来表示 JSON 数据的结构。

三:调用执行方法:

两个选择:

1.同步:

使用excute()方法,

2.异步:

使用enqueue()方法,回调方法,

  • 如果数据申请成功,对得到的数据进行处理
  • 如果申请失败,进行相应的处理。

示例:

package com.example.demo;

import androidx.appcompat.app.AppCompatActivity;

import android.nfc.Tag;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Converter;
import retrofit2.Response;
import retrofit2.Retrofit;

import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.converter.scalars.ScalarsConverterFactory;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //使用Retrofit和服务器进行数据交互
        //拉取服务器的数据:动态代理
        Button btn = findViewById(R.id.btn_1);
        TextView tv = findViewById(R.id.tv_1);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Retrofit r = new Retrofit.Builder().baseUrl("https://devapi.qweather.com/v7/").addConverterFactory(ScalarsConverterFactory.create()).build();
                //创建一个代理对象
                APIService apiService = r.create(APIService.class);

                Call<String> data = apiService.getData("weather", "101010100", "91259b03cbb44867abaa5555578a476a");
                //采用异步的方式
                data.enqueue(new Callback<String>() {

                    @Override
                    public void onResponse(Call<String> call, Response<String> response) {
                        String body = response.body();
                        Log.d("retrofitTest", body);
                        tv.setText(body);
                    }

                    @Override
                    public void onFailure(Call<String> call, Throwable t) {
                        Log.d("retrofitTest", "失败:" + t.toString());
                        tv.setText("失败:" + t.toString());
                    }
                });
            }
        });
    }
}

点击按钮之后,执行网络申请操作。

package com.example.demo;

import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.GET;
import retrofit2.http.Path;
import retrofit2.http.Query;

public interface APIService {
    //表示返回一个String
    @GET(value = "{path}/now")
    Call<String> getData(@Path("path") String path, @Query("location") String location, @Query("key") String id);

}

请求数据:

如示例

上传数据:

上传文件:

Retrofit常用的注解:

Retrofit 是一个用于构建 HTTP 请求的库,它使用注解来定义请求的参数、方法和请求方式等。以下是 Retrofit 中常用的注解:

  1. @GET: 用于指定 HTTP GET 请求。 请求数据
  2. @POST: 用于指定 HTTP POST 请求。 上传数据
  3. @PUT: 用于指定 HTTP PUT 请求。 更新资源
  4. @DELETE: 用于指定 HTTP DELETE 请求。 删除资源
  5. @PATCH: 用于指定 HTTP PATCH 请求。 更新部分资源
  6. @HEAD: 用于指定 HTTP HEAD 请求。 请求数据标头
  7. @OPTIONS: 用于指定 HTTP OPTIONS 请求。 请求通信选项

patch请求:

patch请求:;

PATCH 请求是一种 HTTP 请求方法,用于部分更新资源。与 PUT 请求不同,它允许客户端发送数据的部分更新资源,而不需要替换整个资源的表示。PATCH 请求的主要特点包括:

  1. 部分更新: PATCH 请求允许客户端发送只包含要更新的资源的部分信息的请求体。这对于大型资源或资源的一部分需要更新时非常有用,因为它避免了需要发送整个资源的表示的开销。
  2. 幂等性: 就像 PUT 请求一样,PATCH 请求也是幂等的。多次执行相同的 PATCH 请求不应产生不同的结果,只要相同的操作被应用。
  3. 指定资源位置: 客户端需要指定要更新的资源,通常在请求的 URL 中或通过请求头字段中的信息进行指定。
  4. 安全性: 与 PUT 请求类似,PATCH 请求通常需要适当的身份验证和权限,因为它涉及对资源的更改。
  5. 无需替换整个资源: 与 PUT 不同,PATCH 请求不需要替换整个资源。它只需要传递所需的更改,而不是整个资源。

典型的 PATCH 请求示例可能包括更新用户个人资料中的一部分信息、编辑文章内容的某个段落或在产品信息中修改特定字段的值。在 RESTful API 中,PATCH 请求通常用于部分更新资源,以减少带宽和处理时间的开销,并提供更高的效率。

put请求:

put请求:

PUT 请求是一种用于更新或替换现有资源的 HTTP 请求方法。它通常用于客户端向服务器发送数据以更新服务器上的资源,而不是像 POST 请求那样用于创建新资源。PUT 请求的主要特点包括:

  1. 更新资源: PUT 请求的主要目的是将数据传递给服务器,以便更新已存在的资源。服务器通常会使用客户端提供的数据来替换现有资源的内容。如果资源不存在,服务器可以选择创建一个新资源。
  2. 幂等性: PUT 请求是幂等的,这意味着多次执行相同的 PUT 请求不会产生不同的结果。如果您多次发送相同的 PUT 请求,它们应该具有相同的效果,不会导致资源状态不一致。
  3. 完整替换: PUT 请求通常会发送整个资源的表示,而不仅仅是资源的一部分。这与 PATCH 请求不同,后者用于部分更新资源。
  4. 指定资源位置: 在执行 PUT 请求时,客户端通常需要指定资源的唯一标识或位置。这通常在请求的 URL 中或通过请求头字段中的信息进行指定。
  5. 安全性: PUT 请求通常要求适当的身份验证和权限,因为它涉及对资源的更改。只有具有适当权限的用户才能执行 PUT 请求。

典型的 PUT 请求示例可能是更新用户资料、编辑文章内容或更新产品信息。在 RESTful API 中,PUT 请求通常与特定资源的唯一标识(如资源的 URL)一起使用,以确保正确的资源得到更新。

head请求:

head请求

HEAD 请求是一种 HTTP 请求方法,它与 GET 请求非常相似,但有一个关键区别:HEAD 请求仅请求获取资源的标头(header),而不请求获取资源的主体内容。具体来说,HEAD 请求会向服务器发送一个请求,要求服务器返回与资源相关的元信息,如响应状态码、响应头字段(如日期、内容类型、内容长度等)等,但不包括实际的资源内容。

HEAD 请求的主要特点包括:

  1. 获取元信息: HEAD 请求的目的是获取与资源相关的元信息,这些信息可以用于检查资源的状态、验证缓存或了解资源的特征,而无需获取实际资源内容。
  2. 节省带宽和时间: 由于不获取实际资源内容,HEAD 请求通常比相应的 GET 请求更快,节省了带宽和时间。
  3. 与缓存相关: HEAD 请求通常用于与缓存相关的操作,例如,客户端可以发送 HEAD 请求以检查资源是否已更改,从而决定是否使用缓存的副本。
  4. 验证资源: HEAD 请求还可以用于验证资源的存在或状态,而无需下载资源。服务器将返回资源的元信息,客户端可以根据需要决定是否需要获取实际的资源。
  5. 安全和幂等: HEAD 请求是安全和幂等的,因为它不会对资源状态产生影响,多次执行相同的 HEAD 请求应该产生相同的结果。

总之,HEAD 请求对于获取资源的元信息、验证资源状态以及优化网络性能和带宽利用都非常有用。它允许客户端在不获取资源内容的情况下了解资源的特性和状态。

这些注解通常与请求路径结合使用,例如:

@GET("endpoint")
Call<ResponseBody> getExample();

其中 "endpoint" 是请求的路径,getExample() 方法将执行一个 HTTP GET 请求。

另外,还有一些其他常用的注解:

  1. @Query: 用于指定查询参数。例如:@Query("param") String value 会将参数添加到 URL 中。
  2. @Path: 用于替换 URL 中的占位符。例如:@Path("id") int id 将替换 URL 中的 {id}
  3. @Field@FormUrlEncoded: 用于 POST 请求的表单字段。通常与 @POST 结合使用。
  4. @Body: 用于发送请求体,通常用于 POST 和 PUT 请求。
  5. @Header: 用于添加请求头信息。
  6. @Headers: 用于一次性指定多个请求头信息。
  7. @Multipart: 用于指定多部分请求,通常用于文件上传。

这些注解可根据您的 API 的需要进行组合使用,以构建适合的请求。要使用这些注解,您需要定义一个接口,并在接口的方法上应用这些注解,然后使用 Retrofit 创建一个 API 服务。

幂等性:

幂等性是指在计算中的一个重要性质,尤其在分布式系统和网络通信中经常讨论。在上下文中,幂等性意味着无论执行多少次相同的操作,其结果都将保持一致,不会有不同的影响。这是一个非常重要的性质,因为在网络通信和分布式系统中,操作可能会由于各种原因重复执行,如网络问题、故障恢复等。

幂等性的特点包括:

  1. 相同输入产生相同结果: 无论执行多少次相同的操作,只要输入相同,产生的结果都是一致的。
  2. 无副作用: 幂等操作不会引起不期望的副作用。即使多次执行,资源或状态也不会因操作的重复而变得不一致。
  3. 操作的幂等性: 幂等性通常与操作相关。一些操作是幂等的,而另一些则不是。例如,HTTP GET 请求通常是幂等的,因为多次执行相同的 GET 请求应该返回相同的响应。但 HTTP POST 请求通常不是幂等的,因为多次执行相同的 POST 请求会导致多次创建资源。
  4. 安全: 幂等操作是安全的,因为它们不会引起状态更改或产生不一致的结果。

在计算和网络通信中,幂等性非常有用,因为它可以帮助确保在不可靠的环境中进行的操作不会导致混乱或不一致的结果。例如,当进行网络通信时,如果请求因网络问题而重试,幂等性可以确保不会出现重复创建、删除或更新资源的问题。在分布式系统中,幂等性对于实现事务性操作和恢复机制也至关重要。

还有一些其他常用的注解:

  1. @Query: 用于指定查询参数。例如:@Query("param") String value 会将参数添加到 URL 中。
  2. @Path: 用于替换 URL 中的占位符。例如:@Path("id") int id 将替换 URL 中的 {id}
  3. @Field@FormUrlEncoded: 用于 POST 请求的表单字段。通常与 @POST 结合使用。
  4. @Body: 用于发送请求体,通常用于 POST 和 PUT 请求。
  5. @Header: 用于添加请求头信息。
  6. @Headers: 用于一次性指定多个请求头信息。
  7. @Multipart: 用于指定多部分请求,通常用于文件上传。

你可能感兴趣的:(Android,retrofit)