泉州网站建设报价,建网站找哪家公司,菲斯曼售后服务中心,校园网自助网站一、 Retrofit是什么 Retrofit是Android用来接口请求的网络框架#xff0c;内部是基于OkHttp实现的#xff0c;retrofit负责接口请求的封装#xff0c;retrofit可以直接将接口数据解析为Bean类、List集合等#xff0c;直接简化了中间繁琐的数据解析过程 二、 Retrofit的简单…一、 Retrofit是什么 Retrofit是Android用来接口请求的网络框架内部是基于OkHttp实现的retrofit负责接口请求的封装retrofit可以直接将接口数据解析为Bean类、List集合等直接简化了中间繁琐的数据解析过程 二、 Retrofit的简单使用
Retrofit在github的地址 https://github.com/square/retrofitRetrofit官方使用介绍 https://square.github.io/retrofit/
2.1 在项目中引入retrofit implementation com.squareup.retrofit2:retrofit:2.9.0implementation com.squareup.retrofit2:converter-gson:2.9.0//解析json字符所用2.2 清单文件AndroidManifest.xml中添加网络权限
uses-permission android:nameandroid.permission.INTERNET/Google在Android p为了安全起见,已经明确规定禁止http协议额接口都是https请忽略如果接口有http请在清单文件AndroidManifest.xml中application先添加networkSecurityConfig配置 applicationandroid:name.Appandroid:allowBackuptrueandroid:iconmipmap/ic_launcherandroid:labelstring/app_nameandroid:networkSecurityConfigxml/network_security_configandroid:requestLegacyExternalStoragetrueandroid:supportsRtltrueandroid:themestyle/AppThemetools:ignoreUnusedAttributeres文件夹下新建xml文件夹xml文件夹中新建network_security_config文件文件内容如下
?xml version1.0 encodingutf-8?
network-security-configbase-config cleartextTrafficPermittedtrue /
/network-security-config2.3 创建Retrofit
Retrofit retrofit new Retrofit.Builder().baseUrl(https://api.github.com/).addConverterFactory(GsonConverterFactory.create())//设置数据解析器.build();2.4 创建RetrofitApi
//定义 网络API 地址
public interface RetrofitApi{GET(users/{user}/repos)CallListUser getData(Path(user) String user);
}2.5 请求接口
//获取API
GitHubService service retrofit.create(RetrofitApi.class);CallListUser call service.getData(user);2.6 发送请求数据 //异步call.enqueue(new CallbackListUser() {Overridepublic void onResponse(CallListUser call, ResponseListUser response) {//处理请求数据}Overridepublic void onFailure(CallListUser call, Throwable throwable) {}});//同步try {ResponseListUser execute call.execute();execute.body().toString();} catch (IOException e) {e.printStackTrace();}三、Retrofit注解参数类型 3.1 网络请求方法
3.1.1 GET请求
//简单的get请求(没有参数)GET(user)CallUserInfo getItem();//简单的get请求(URL中带有参数)GET(News/{userId})CallTradesBean getItem(Path(userId) String userId);//参数在url问号之后GET(trades)CallTradesBean getItem(Query(userId) String userId);//get请求多个请求参数GET(trades)CallTradesBean getItem(QueryMap MapString, String map);GET(trades)CallTradesBean getItem(Query(userId) String userId,QueryMap MapString, String map);//get请求不使用baseUrl直接请求url地址GETCallTradesBean getItem(Url String url,QueryMap MapString, Object params);3.1.2 POST请求
http://192.168.43.173/api/trades/{userId}
//需要补全URL,post的数据只有一条reasonFormUrlEncodedPOST(trades/{userId})CallTradesBean postResult(Path(userId) String userId,Field(reason) String reason;http://192.168.43.173/api/trades/{userId}?token{token}
//需要补全URL,问号后需要加token,post的数据只有一条reasonFormUrlEncodedPOST(trades/{userId})CallTradesBean postResult(Path(userId) String userId,Query(token) String token,Field(reason) String reason;//post一个对象POST(trades/{userId})CallTradesBean postResult(Path(userId) String userId,Query(token) String token,Body TradesBean bean;//post请求不使用baseUrl直接请求url地址FormUrlEncodedPOSTCallTradesBean postResultl(Url String url,FieldMap MapString, Object params);3.2 标记类 3.2.1 FormUrlEncoded
作用表示发送form-encoded的数据FieldMap必须与 FormUrlEncoded 一起配合使用
3.2.2 Multipart
作用表示发送form-encoded的数据适用于 有文件 上传的场景每个键值对需要用Part来注解键名随后的对象需要提供值。 MultipartPOSTCallResponseBody uploadFiles(Url String uploadUrl,Part MultipartBody.Part file);3.2.3 Steaming
表示数据以流的形式返回大文件官方建议用 Streaming 来进行注解不然会出现IO异常小文件可以忽略不注入 /*** 大文件官方建议用 Streaming 来进行注解不然会出现IO异常小文件可以忽略不注入** param fileUrl 地址* return ResponseBody*/StreamingGETCallResponseBody downloadFile(Url String fileUrl);3.3 网络请求类 3.3.1 Header Headers
添加请求头 添加不固定的请求头
// Header
GET(user)
CallUser getUser(Header(Authorization) String authorization)// Headers
Headers(Authorization: authorization)
GET(user)
CallUser getUser()// 以上的效果是一致的。
// 区别在于使用场景和使用方式
// 1. 使用场景Header用于添加不固定的请求头Headers用于添加固定的请求头
// 2. 使用方式Header作用于方法的参数Headers作用于方法
3.3.2 Body
以 Post方式 传递 自定义数据类型 给服务器Body会将请求参数放到请求体中所以适用于POST请求Body相当于多个Field,以对象的方式提交Body 提交的提交的Content-Type 为application/json; charsetUTF-8Body标签不能和FormUrlEncoded或Multipart标签同时使用会报错
3.3.3 Field FieldMap
发送 Post请求 时提交请求的表单字段FieldMap必须与 FormUrlEncoded 一起配合使用提交的Content-Type 为application/x-www-form-urlencoded
3.3.4 Part PartMap
发送 Post请求 时提交请求的表单字段 与Field的区别功能相同但携带的参数类型更加丰富包括数据流所以适用于 有文件上传 的场景与 Multipart 注解配合使用 3.3.5 Query和QueryMap
用于 GET 方法的查询参数Query Url 中 ‘?’ 后面的 key-value
//参数在url问号之后GET(trades)CallTradesBean getItem(Query(userId) String userId);3.3.6 Path
URL地址的缺省值 GET(users/{user}/repos)CallResponseBody getBlogPath(user) String user ;// 访问的API是https://api.github.com/users/{user}/repos// 在发起请求时 {user} 会被替换为方法的第一个参数 user被Path注解作用3.3.7 Url
直接传入一个请求的 URL变量 用于URL设置 GETCallResponseBody testUrlAndQuery(Url String url, Query(showAll) boolean showAll);// 当有URL注解时GET传入的URL就可以省略// 当GET、POST...HTTP等方法中没有设置Url时则必须使用 {link Url}提供下一篇文章总结一下RetrofitRxjava封装成网络请求库