- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
Retrofit底层是由OkHttp封装的,Retrofit对于注解的使用十分频繁,所以不了解注解的同学们可以去查查资料什么的.
这里有一个小细节,要使用Retrofit至少需要jdk1.8以上和Android API 21以上 。
Android架构中的MVVM所普遍使用的网络请求框架就是Retrofit.
我们说了,注解的使用很平凡,那么我们来看看Retrofit的注解有哪些吧.
注解 | 含义 |
---|---|
@GET | 通过GET方式请求 |
@POST | 通过POST方式请求 |
@DELETE | 通过DELETE方式请求 |
@PUT | 通过PUT方式请求 |
@HEAD | 通过HEAD方式请求 |
@OPTIONS | 通过OPTIONS方式请求 |
@PATCH | 通过PATCH方式请求 |
以上的都是请求方式。这里就知道了我们并不是只能有四种请求方式的.
还有一些对这个请求进行标注的注解.
注解 | 含义 |
---|---|
@Headers | 给请求添加请求头 |
@Path | 用于restful风格的请求替换其中的路径 |
@Query | 用于标注请求的参数,一般get请求 |
@FormUrlEncoded | 表示这个请求以表单的方式提交 |
@Field | 用于标注请求的参数,一般post请求 |
@Body | 用于标注请求的参数,一般是一个请求体,可以上传文件或者是一个类 |
上面的就是Retrofit常用注解了.
这里要导入两个依赖包,分别是retrofit2和gson的。因为retrofit2支持直接将获取到的数据转换成实体类对象,方便我们使用.
在项目文件下build.gradle(app)的dependencies中导入所需要的库 。
implementation group: 'com.squareup.retrofit2', name: 'retrofit', version: '2.6.3'
implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.0'
我们先新建一个网络请求类,在其中实例化retrofit.
// 请求地址
public static String IP = "http://www.baidu.com";
// 实例化Retrofit
private static Retrofit retrofit = new Retrofit.Builder()
// 设置Retrofit的基础网络地址
.baseUrl(IP)
// 添加gson实例化工厂
.addConverterFactory(GsonConverterFactory.create())
.build();
设置了baseUrl(IP),之后通过该对象发起的网络请求中默认在你的请求连接地址前加上IP.
新建一个接口,用于存放网络请求的各个地址 。
public interface Link {
@GET("/s?wd=坚定不移推动构建亚太命运共同体")
Call<String> getBaiDu();
}
在我们的网络请求类中创建一个可以访问到该接口的方法.
public static Link getLink(){
return retrofit.create(Link.class);
}
这里使用的都是公开静态方法和变量,是为了在其他类中更加方便的使用网络请求类.
在MainActivity中去调用它 。
Net.getLink().getBaiDu().enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
String body = response.body();
System.out.println(body);
}
@Override
public void onFailure(Call<String> call, Throwable throwable) {
}
});
这短代码中只需要你通过网络请求类Net访问Link结构getLink(),调用请求方法getBaiDu();我们会通过get方法去访问如下地址 。
http://www.baidu.com/s?wd=坚定不移推动构建亚太命运共同体
这其实就是将baseUrl和@GET中的地址拼接起来了。最基本的使用就是这么简单.
当然了,如果我们想将搜索的值设置为一个由用户输入的变量,我们修改getBaiDu方法 。
@GET("/s")
Call<String> getBaiDu(@Query("wd") String value);
那么在调用时可以作为一个参数传入到该请求中,如 。
Net.getLink().getBaiDu("坚定不移推动构建亚太命运共同体").enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
String body = response.body();
System.out.println(body);
}
@Override
public void onFailure(Call<String> call, Throwable throwable) {
}
});
如果我们的参数是restful风格的,那么我们需要修改以下传递的参数,比如/s就是restful风格,我们就这么改 。
@GET("/{path}")
Call<String> getBaiDu(@Path("path") String path,@Query("wd") String value);
那么我们在调用时只需要全部以参数的形式传递即可 。
Net.getLink().getBaiDu("s","坚定不移推动构建亚太命运共同体").enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
String body = response.body();
System.out.println(body);
}
@Override
public void onFailure(Call<String> call, Throwable throwable) {
}
});
这些效果都是一样的.
如果你需要传入请求头,那么就多加一个参数,如 。
@Headers({
"Accept: application/json",
"User-Agent: Retrofit-Sample-App"
})
@GET("/{path}")
Call<String> getBaiDu(@Path("path") String path,@Query("wd") String value);
以上注解都是可以用的,如你想post请求那么使用@POST,效果都是一样的。灵活切换,多尝试。Restful的特点就是 对开发者特别友好 , 性能好,处理快,使用简单 、 使用REST API非常方便 、 支持NIO(新的IO API,可以替代标准的Java IO API) 、 默认使用Gson解析 .
想要了解更多的可以去搜一搜这些注解,使用方式就是这么简单,也没多复杂.
可以和LiveData、ViewModle、Rxjava构建MVVM项目结构 。
网络请求就到这里了,基本上这些网络框架就是我们日常开发中的全部了,至于HttpClient,它的使用不比java原生的HttpURLConnection方便到哪里去,我就不讲了,同样感兴趣的可以去自行查阅资料.
最后此篇关于Android网络请求(终)网络请求框架Retrofit的文章就讲到这里了,如果你想了解更多关于Android网络请求(终)网络请求框架Retrofit的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试迁移我的应用程序以使用 RxJava。我已经在使用 Retrofit,因此我正在尝试使用方法返回 Observables 的 Retrofit 接口(interface)。但是我现在在针对它
我想 post 数据如下: { "user_id":"14545646", "list":["4545645","4545645","4545645","4545645"]
我是改造新手。我向网站发出 POST 请求。网站以 HTML 形式返回响应。所以我会解析它。但是 Retrofit 尝试将其解析为 JSON。怎么办? @FormUrlEncoded @POST("/
我想异步执行 2 个网络调用 - 我正在使用 Retrofit+RxJava 来完成这个。这个逻辑来自一个简单的 Runner 类来测试解决方案。注意:这主要涉及服务器端的 RxJava。 我的代码如
我最近在改造的存储库中使用 Flow。 Result 的密封类 enum class ApiStatus{ SUCCESS, ERROR, LOADING } sealed c
我目前正在开发 Retrofit2 客户端的错误处理部分(使用 Retrofit 的 Rx 实现)。 找了一段时间,没有找到简单的方法将Retrofit返回的ResponseBody反序列化到我报错的
我从 retrofit 更新到 retrofit2 后出现此错误。 FATAL EXCEPTION: OkHttp Dispatcher Process: nz.co.datacom.mars.jun
在使用 RxJava 和 Retrofit 2 时,我正在尝试创建单元测试来覆盖我的应用何时收到特定响应。 我遇到的问题是,在 Retrofit 2 中,我看不到在不使用反射的情况下创建 retrof
在 Retrofit 1.9.x 中有一个 RetrofitError.Kind.NETWORK这让您可以轻松确定故障是否由网络错误引起。在新的 2.0 API 中,我们不再有 RetrofitErr
有没有办法用Refit动态输入参数? 我的 Refit 界面中有这段代码: [Get("/click?{parm}")] Task> SaveClick(string parm
有没有办法用Refit动态输入参数? 我的 Refit 界面中有这段代码: [Get("/click?{parm}")] Task> SaveClick(string parm
我知道,Retrofit 在内部使用 OkHttp。但是,我可以看到一些开发人员提供了以下方法的应用 return new Retrofit.Builder() .baseUrl(Bu
在项目上安装这个库之后: compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'io.reactivex.rxjava2:rxjava:2.0
在 Retrofit 1.x 中,我使用以下模式创建 API 服务类,该类模拟某些构建变体的不良网络连接。 // Retrofit 1 private T create(Class apiServi
Retrofit请求API格式(Android): @POST("getOrderStatus") @Headers("Content-Type:application/json") Obser
当我实例化 RestAdapter 时,我的应用程序总是崩溃 private void submitForm(SignupForm form){ RestAdapter adapter = n
我正要从 retrofit 1.9 迁移到最新版本并遇到问题... 我的设置: 三星 Galaxy S7 Edge(Android 7) 改造 2.3 OkHttp 3.8 迁移后突然遇到这个问题:
我正在尝试在 2.5.1-SNAPSHOT 中使用 retrofit 的协程支持,但我不断收到一个奇怪的异常。 我的改造服务类有: @GET("weather") suspend fun getFor
我正在尝试 Ktor通过转换一些当前正在使用的现有项目 Retrofit . 虽然我可以很容易地将请求转换为: client.get { url("$BASE_URL/something/so
使用改造 2,如何为上传的文件设置动态名称? 目前是这样的: @Part("avatar\"; filename=\"image\" ") RequestBody image, 但是,上传的文件名将是
我是一名优秀的程序员,十分优秀!