您的位置 首页 > 德语词汇

retrofit是什么意思,看这一篇就够了

大家好,关于retrofit是什么意思很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于看这一篇就够了的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

本文主要对Android中经常使用的网络请求框架Retrofit做简单介绍,抛砖引玉,希望可以帮大家快速入门Retrofit的使用。

Retrofit是Square公司开发的一款针对Android和java的网络请求框架,遵循Restful设计风格,底层基于OkHttp。

retrofit是什么意思,看这一篇就够了

相比去其他网络请求框架,其具有性能特别棒、使用特别方便的特性,所以在任何网络请求场景下,我们都应该有限考虑Retrofit,本文就Retrofit的入门使用和简单特性做简单介绍,抛砖引玉,希望大家可以爱上Retrofit。

我们首先通过一个简单的案例带大家走一遍使用Retrofit的完整流程,然后再深入介绍Retrofit的一些特性。

我们要做的就是在Android中使用Retrofit发起网络请求,将下图(图片地址:http://picture-pool.oss-cn-beijing.aliyuncs.com/2019-06-29-121904.png)下载并展示出来,下面我来一步一步介绍如何去做。

implementation'com.squareup.retrofit2:retrofit:2.6.0'\n

声明网络权限

在Android的manifest配置文件中声明网络请求权限:

<uses-permissionandroid:name="android.permission.INTERNET"/>\n

创建用于配置网络请求的接口

Retrofit将Http请求抽象成Java接口,采用注解来描述配置网络请求参数,何为配置网络请求参数?说白了就是设置网络请求的地址是什么、使用什么请求方法、传递的参数是什么、返回值类型是什么等等一系列配置信息,通过接口描述清楚这些具体的网络配置信息,Retrofit才能根据你的配置发起最终的网络请求。所以我们首先应该声明一个用于配置网络请求的Java接口:

/**\n*@authordmrfcoder\n*@date2019-06-29\n*/\npublicinterfaceGetRequestInterface{\n/**\n*\n*\n*通过get()方法获取图片的请求接口\n*GET注解中的参数值"2019-06-29-121904.png"和Retrofit的baseurl拼接在一起就是本次请求的最终地址\n*\n*@return\n*\n*/\n@GET("2019-06-29-121904.png")\nCall<ResponseBody>getPictureCall();\n}\n

创建Retrofit实例并发起网络请求

这里直接给出代码,重点都在注释中:

publicvoidretrofitGet(){\n/*\n创建Retrofit对象,这里设置了baseUrl,注意我们在声明网络配置接口GetRequestInterface的时候在GET注解中也声明了一个Url,\n我们将会这里的baseUrl和GET注解中设置的Url拼接之后就可以形成最终网络请求实际访问的url\n*/\nRetrofitretrofit=newRetrofit.Builder().baseUrl("http://picture-pool.oss-cn-beijing.aliyuncs.com/").build();\n//创建网络请求配置的接口实例\nGetRequestInterfacegetRequestInterface=retrofit.create(GetRequestInterface.class);\n//调用我们声明的getPictureCall()方法创建Call对象\nCall<ResponseBody>requestBodyCall=getRequestInterface.getPictureCall();\n//使用requestBodyCall发起异步网络请求\nrequestBodyCall.enqueue(newCallback<ResponseBody>(){\n@Override\npublicvoidonResponse(Call<ResponseBody>call,Response<ResponseBody>response){\n//将网络请求返回的数据解析为图片并展示到界面\nResponseBodybody=response.body();\nInputStreaminputStream=body.byteStream();\nDrawabledrawable=Drawable.createFromStream(inputStream,"pic.png");\nimageView.setBackground(drawable);\nLog.e(TAG,"网络请求成功");\n}\n@Override\npublicvoidonFailure(Call<ResponseBody>call,Throwablet){\nLog.e(TAG,"网络请求失败,失败原因:"+t.getMessage());\n}\n});\n}\n

如果使用过OkHttp的读者可能很熟悉最后两步创建Call对象、发起异步网络请求的操作,几乎和OkHttp一模一样,这是因为Retrofit就是基于OkHttp的啊~~

细心的读者可能发现了一个问题,在上面的代码中我是直接在CallBack接口的onResponse()回调方法中更新的ImageView,即在onResponse()中更新UI的,在OkHttp中这个onResponse()方法是在子线程中被调用的,而在Retrofit中,onResponse()和onFailure()这两个回调方法都是在主线程进行调用的,所以可以在其中直接更新UI,这也是Retrofit和OkHttp的一点不同之处。

通过上面的例子带大家走了一遍Retrofit的整体流程,让大家对Retrofit有了一个整体的感知,接下来我们来逐步深入了解一下Retrofit的具体使用。

每一个方法都必须有一个HTTP注解,用来提供网络请求的请求方法以及相对URL。在Retrofit中可以使用五种请求方法:GET,POST,PUT,DELETE,HEAD,而相对URL直接在对应注解中填写即可,比如:

@GET("users/list")//表示以GET请求方法发起网络请求,子URL为:users/list\n

你可以在URL中直接指定查询的参数:

@GET("users/list?sort=desc")\n

URL操作

网络请求的URL可以通过结合占位符和方法中的参数的方式来进行动态更新,所谓的占位符指的是URL中由{}包裹的String类型字符串,而参数必须使用@Path注解进行修饰,而且也只能是String,这样,@Path修饰的变量会动态对应到URL中,比如:

@GET("group/{id}/users")\nCall<List<User>>groupList(@Path("id")intgroupId);\n

如上面的代码所示,当代码运行的时候,groupId会被动态绑定到子URL中{id}所占的位置上,达到动态设置URL的作用。

查询参数也可以使用类似的方法进行设置:

@GET("group/{id}/users")\nCall<List<User>>groupList(@Path("id")intgroupId,@Query("sort")Stringsort);\n

如果查询参数太多,还可以使用Map:

@GET("group/{id}/users")\nCall<List<User>>groupList(@Path("id")intgroupId,@QueryMapMap<String,String>options);\n

请求体

我们可以通过@Body注解将一个对象以Post方式发送给服务器:

@POST("users/new")\nCall<User>createUser(@BodyUseruser);\n

标记注解

当我们想发送form-encoded的数据时,可以使用@FormUrlEncode注解,将每个键值对中的键使用@Filed注解来进行说明,而值设置为随后跟随的对象:

@FormUrlEncoded\n@POST("user/edit")\nCall<User>updateUser(@Field("first_name")Stringfirst,@Field("last_name")Stringlast);\n

当我们想发送Multipart的数据时(适用于文件发送的场景),可以使用@Multipart注解,时使用,将每个键值对中的键使用@Part注解来进行说明,而值设置为随后跟随的对象:

@Multipart\n@PUT("user/photo")\nCall<User>updateUser(@Part("photo")RequestBodyphoto,@Part("description")RequestBodydescription);\n

Header操作

你可以通过使用@Headers注解为请求方法设置静态请求头:

@Headers("Cache-Control:max-age=640000")\n@GET("widget/list")\nCall<List<Widget>>widgetList();\n

或者像这样:

@Headers({\n"Accept:application/vnd.github.v3.full+json",\n"User-Agent:Retrofit-Sample-App"\n})\n@GET("users/{username}")\nCall<User>getUser(@Path("username")Stringusername);\n

注意,请求头中不会进行覆盖,即如果你设置两个相同键的请求头,这两个请求头都会被发送。

请求头可以使用@Header进行动态更新,前提是设置了合法的请求头,如果你设置了类型为null的请求头,那么对应的请求头会被忽略,如果不为null,将最终会发送你设置参数的toString()结果。

@GET("user")\nCall<User>getUser(@Header("Authorization")Stringauthorization)\n

和查询参数的设置方法类似,当请求头的参数过于复杂时,你也可以使用Map:

@GET("user")\nCall<User>getUser(@HeaderMapMap<String,String>headers)\n

同步请求和异步请求

Call实例可以使用同步和异步两种方式进行执行,每一个实例都仅仅只能被执行一次,但是,你可以通过调用clone()方法拷贝一份新的、同样的Call实例,以达到多次请求的目的。

在Android中,Call的回调接口会在主线程中执行,在JVM中,回调接口会在发起请求的当前线程中执行。

转换器(converters)

默认情况下,Retrofit只能反序列化OkHttp中的ResponseBody类型的返回值,通过添加不同类型的转换器可以使Retrofit拥有反序列化其他主流序列的能力,以下是一些常用转换器的列表:

下面是一个使用GsonConverterFactory类反序列化GithubService返回结果的例子:

Retrofitretrofit=newRetrofit.Builder()\n.baseUrl("https://api.github.com")\n.addConverterFactory(GsonConverterFactory.create())\n.build();\nGitHubServiceservice=retrofit.create(GitHubService.class);\n

网络请求适配器(CallAdapter)

Retrofit支持多种网络请求适配器方式:guava、Java8和rxjava

使用时如使用的是Android默认的CallAdapter,则不需要添加网络请求适配器的依赖,否则则需要按照需求进行添加Retrofit提供的CallAdapter,对应依赖为:

这里使用rxjava来发起之前例子中的网络请求:

publicinterfaceGetRequestInterfaceWithRxJava{\n/**\n*通过get()方法获取图片的请求接口\n*GET注解中的参数值"2019-06-29-121904.png"和Retrofit的baseurl拼接在一起就是本次请求的最终地址\n*\n设置返回值类型为Observable的\n*@return\n*/\n@GET("2019-06-29-121904.png")\nObservable<ResponseBody>getPictureCall();\n}\n

然后使用RxJava发起网络请求:

publicvoidretrofitGetWithRxJava(){\n/*\n创建Retrofit对象,这里设置了baseUrl,注意我们在声明网络配置接口GetRequestInterface的时候在GET注解中也声明了一个Url,\n我们将会这里的baseUrl和GET注解中设置的Url拼接之后就可以形成最终网络请求实际访问的url\n*/\nRetrofitretrofit=newRetrofit.Builder().baseUrl("http://picture-pool.oss-cn-beijing.aliyuncs.com/").addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();\n//创建网络请求配置的接口实例\nGetRequestInterfaceWithRxJavagetRequestInterfaceWithRxJava=retrofit.create(GetRequestInterfaceWithRxJava.class);\n//调用我们声明的getPictureCall()方法创建Call对象\nObservable<ResponseBody>requestObservable=getRequestInterfaceWithRxJava.getPictureCall();\nrequestObservable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(newObserver<ResponseBody>(){\n@Override\npublicvoidonSubscribe(Disposabled){\nLog.e(TAG,"onSubscribe");\n}\n@Override\npublicvoidonNext(ResponseBodybody){\n//将网络请求返回的数据解析为图片并展示到界面\nInputStreaminputStream=body.byteStream();\nDrawabledrawable=Drawable.createFromStream(inputStream,"pic.png");\nimageView.setBackground(drawable);\nLog.e(TAG,"网络请求成功");\n}\n@Override\npublicvoidonError(Throwablee){\nLog.e(TAG,"onError:"+e.getMessage());\n}\n@Override\npublicvoidonComplete(){\nLog.e(TAG,"onComplete");\n}\n});\n}\n

运行效果和之前的代码一样:

本文介绍了Retrofit的基本使用和常用API,希望可以帮大家对Retrofit有一个入门的认识,后面我会推出有关Retrofit源码分析等一系列文章,欢迎大家关注。

关于retrofit是什么意思和看这一篇就够了的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023