如何使用retrofit发送网络请求

如何使用retrofit发送网络请求,第1张

用Retrofit发送网络请求和解析json的实例

Retrofit是Android的一个非常好用的开源HTTP Request。现在介绍一下Retrofit是如何使用的。。。。

首先是导入Retrofit包,

dependencies {

compile fileTree(dir: 'libs', include: ['*.jar'])

compile 'com.android.support:appcompat-v7:22.0.0'

compile 'com.squareup.retrofit:retrofit:1.9.0'

}1234512345

然后是根据API的JSON数据建立一个数据类

URL:http://apistore.baidu.com/microservice/weather?citypinyin=beijing

{

errNum: 0,

errMsg: "success",

retData: {

city: "北京", //城市

pinyin: "beijing", //城市拼音

citycode: "101010100", //城市编码

date: "15-02-11", //日期

time: "11:00", //发布时间

postCode: "100000", //邮编

longitude: 116.391, //经度

latitude: 39.904, //维度

altitude: "33", //海拔

weather: "晴", //天气情况

temp: "10", //气温

l_tmp: "-4", //最低气温

h_tmp: "10", //最高气温

WD: "无持续风向", //风向

WS: "微风(<10m/h)", //风力

sunrise: "07:12", //日出时间

sunset: "17:44" //日落时间

}

}

123456789101112131415161718192021222324123456789101112131415161718192021222324

以下是数据类:

public class Result {

private String errNum

private String errMsg

private WeatherData retData

public void setErrNum(String errNum) {

this.errNum = errNum

}

public void setErrMsg(String errMsg) {

this.errMsg = errMsg

}

public WeatherData getRetData() {

return retData

}

public void setRetData(WeatherData retData) {

this.retData = retData

}

public String getErrNum() {

return errNum

}

public String getErrMsg() {

return errMsg

}

}

public class WeatherData {

private String city//城市

private String pinyin//城市拼音

private String citycode //城市编码

private String date//日期

private String time//发布时间

private String postCode//邮编

private String longitude//经度

private String latitude//维度

private String altitude//海拔

private String weather//天气情况

private String temp//气温

private String l_tmp//最低气温

private String h_tmp//最高气温

private String WD//风向

private String WS//风力

private String sunrise//日出时间

private String sunset//日落时间

//setter和getter就不贴了

}

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657

新建一个MyService的接口,由于之后要在主线程使用(安卓3.0以上主线程不能同步访问网络),所以这里采用异步获取的方式。故增加了Callback<Result >cb

import retrofit.Callback

import retrofit.http.GET

import retrofit.http.Query

public interface MyService {

// URI:http://apistore.baidu.com/microservice/weather?citypinyin=beijing

@GET("/microservice/weather")

void getResult(@Query("citypinyin") String citypinyin, Callback<Result>cb)

}12345678910111234567891011

使用RestAdapter来实例化MyService;

import retrofit.RestAdapter

public class MyRestClient {

private static String API_URL = "http://apistore.baidu.com"

public static MyService getService() {

RestAdapter restAdapter = new RestAdapter.Builder()

.setEndpoint(API_URL)//设置站点路径

.setLogLevel(RestAdapter.LogLevel.FULL)//设置log的级别

.build()

MyService myService = restAdapter.create(MyService.class)

return myService

}

}123456789101112131415161718123456789101112131415161718

系统调用如下

@Override

public void onStart()

{

super.onStart()

MyRestClient.getService().getResult("beijing",new Callback<Result>() {

@Override

public void success(Result result, Response response) {

Log.i("",result.getRetData().getDate())

}

@Override

public void failure(RetrofitError error) {

}

})

}12345678910111213141516171234567891011121314151617

别忘了添加网络访问权限哟。

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

1、Retrofit创建

2、Retrofit实现Cookie自动化管理

3、Retrofit,Gson解析,请求返回的类型不统一,假如double返回的是null

4、请求参数日志打印

5、统一请求参数添加到请求头中

6、统一请求参数添加到请求body中

7、缓存的拦截

8、BaseUrl动态切换

9、拦截指定接口,动态更改返回值便于测试

点击传送查看

点击传送查看

1.第一种办法,依赖第三方库

配置信息如下

2.第二种办法,拦截器拦截(个人推荐第二种,可控性高)

给大家推荐一个打印日志库,很漂亮的日志结构

然后在httpClientBuilder中添加拦截

然后在httpClientBuilder中添加拦截

然后在httpClientBuilder中添加拦截

然后在httpClientBuilder中添加拦截

用了一个博客中民间大神的拦截动态替换baseUrl方法有点问题,我暂时用了一种简单粗暴方法

上边的路径是我随便写的,post中写全路径,这个优先级最高,同时设置了baseUrl不受影响

给大家一个专门写动态替换baseUrl连接 传送门

有时候我们需要返回指定值测试,可能需要空或者null等,迫于无法修改服务器返回数据,也没必要让后台修改数据,所以引发一个问题,如果拦截返回内容并修改指定字段值

然后在httpClientBuilder中添加拦截

Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装

1.添加Retrofit库的依赖:

后面三个是可选的,分别是数据解析器和gson,以及rxjava支持的依赖

2.创建 用于描述网络请求 的接口

Retrofit将 Http请求 抽象成 Java接口:采用 注解 描述网络请求参数 和配置网络请求参数

3.创建Retrofit实例

4.发送请求

请求分为同步请求和异步请求

response.body()就是Reception对象,网络请求的完整 Url =在创建Retrofit实例时通过.baseUrl()设置 +网络请求接口的注解设置(下面称 “path“ )

整合的规则如下:

上面我们用了@GET注解来发送Get请求,Retrofit还提供了很多其他的注解类型

1.@GET、@POST、@PUT、@DELETE、@HEAD分别对应 HTTP中的网络请求方式

2.@HTTP替换@GET、@POST、@PUT、@DELETE、@HEAD注解的作用 及 更多功能拓展

具体使用:通过属性method、path、hasBody进行设置

1.@FormUrlEncoded

表示发送form-encoded的数据,每个键值对需要用@Filed来注解键名,随后的对象需要提供值。

2.@Multipart

表示发送form-encoded的数据(适用于 有文件 上传的场景),每个键值对需要用@Part来注解键名,随后的对象需要提供值。

1.@Header &@Headers

添加请求头 &添加不固定的请求头

2.@Body

以 Post方式 传递 自定义数据类型 给服务器,如果提交的是一个Map,那么作用相当于 @Field,不过Map要经过 FormBody.Builder 类处理成为符合 Okhttp 格式的表单,如:

3.@Field &@FieldMap

发送 Post请求 时提交请求的表单字段,与 @FormUrlEncoded 注解配合使用

4.@Part &@PartMap

发送 Post请求 时提交请求的表单字段,与@Field的区别:功能相同,但携带的参数类型更加丰富,包括数据流,所以适用于 有文件上传 的场景,与 @Multipart 注解配合使用

5.@Query和@QueryMap

用于 @GET 方法的查询参数(Query = Url 中 ‘?’ 后面的 key-value)

如:url = http://www.println.net/?cate=android ,其中,Query = cate

配置时只需要在接口方法中增加一个参数即可:

6.@Path

URL地址的缺省值

7.@Url

直接传入一个请求的 URL变量 用于URL设置


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11789604.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存