对于某个API所需要添加Header时,可以直接在Service接口上添加@Headers注解:
@Headers({
"Content-Type: application/json;charset=UTF-8",
"User-Agent: Retrofit-your-App"})
@GET(ConstantsApi.douban_in_theaters)
Observable<MovieTheatersModel> requestTheatersMovies(@Query("city")String city,
@Query("count")Integer count,
@Query("start")Integer start);
如上,我们可以发现,大部分API「”Content-Type: application/json;charset=UTF-8”」都是Header中必须的,那么我们可以直接添加在拦截器中:
new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.client(new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request()
.newBuilder()
.addHeader("Content-Type", "application/json;charset=UTF-8")
.addHeader("header2", "123456")
.addHeader("header3", "123456")
.addHeader("header4", "123456")
.build()
return chain.proceed(request)
}).build()
然后你说直接这样每次都add一个匿名的intercept,令人头大的缩进,也太不软件工程了,那就直接封装一个:
public class MyInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request()
.newBuilder()
.addHeader("Content-Type", "application/json;charset=UTF-8")
.addHeader("header2", "123456")
.addHeader("header3", "123456")
.addHeader("header4", "123456")
.build();
return chain.proceed(request);
每次请求需要这些header的时候只需要:
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor()
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
MyInterceptor myInterceptor = new MyInterceptor()
OkHttpClient client = new OkHttpClient()
.newBuilder()
.addInterceptor(httpLoggingInterceptor)
.addInterceptor(myInterceptor)
.build()
movieService = new Retrofit.Builder() //配合Retrofit
.baseUrl(ConstantsApi.BASE_DOUBAN)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(client)
.build()
.create(DoubanMovieService.class)
二.添加Json类型Body
假定需求Json格式如下:
"param1": "111",
"param2": "222",
"data": {
"param3": "string",
"param4": "string2"
1.创建JsonObject对象
JSONObject root = new JSONObject()
JSONObject requestData = new JSONObject()
try {
requestData.put("param3", "string")
requestData.put("param4", "string2")
root.put("param1", "111")
root.put("param2", "222")
root.put("data", requestData)
} catch (JSONException e) {
e.printStackTrace()
2.API 接口设置
@POST("api/data?")
Observable<PromotionModel> getResult(@Body RequestBody requestBody);
3.联网请求(包含上述1中代码)
JSONObject root = new JSONObject()
JSONObject requestData = new JSONObject()
try {
requestData.put("param3", "string")
requestData.put("param4", "string2")
root.put("param1", "111")
root.put("param2", "222")
root.put("data", requestData)
} catch (JSONException e) {
e.printStackTrace()
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),root.toString())
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new Interceptor())
.addInterceptor(logging)
.build()
service = new Retrofit.Builder()
.client(client)
.baseUrl(Constants.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build()
.create(Service.class)
return service.getResult(requestBody)
本博客为作者原创,如需转载请注明处处:https://blog.csdn.net/wusj3/article/details/102462499
Retrofit 2定义网络请求是通过注解的方式,所以自然我们这里就用到了@POST注解来提交我们的图片文件的二进制数据,需要注意用@Part MultipartBody.Part注解来定义我们要上传的图片文件,用@Part("attribute"...
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
加入网络权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACC
因为请求的content-type是multipart/form-data,所以接口的注解加上@Multipart,参数也要加上@Part。这个最开始不理解,用成了@FormUrlEncoded,导致一直请求失败。
近期,随着开发的需要,研究了一下网络请求Retrofit的功能,其实就是对okhttp的封装,使用起来很方便,主要是以注解的形式进行请求,下面是我看过一些博客大佬们写过的常用注解,
方法注解,包含@GET、@POST、@PUT、@DELETE、@PATH、@HEAD、@OPTIONS、@HTTP。
标记注解,包含@FormUrlEncoded、@Multipart、@Streaming。
1、什么是retrofit
retrofit是现在比较流行的网络请求框架,可以理解为okhttp的加强版,底层封装了Okhttp。准确来说,Retrofit是一个RESTful的http网络请求框架的封装。因为网络请求工作本质上是由okhttp来完成,而Retrofit负责网络请求接口的封装。
本质过...
笔者最近用图灵V2版本,V2跟V1版比起来,很大的区别是网络请求,V1版只需一条网址链接即可请求数据,V2版本则需要以请求参数格式为 json的post请求数据,无疑增大了难度
打开图灵官网API V2.0接入文档
文档给我们提供了请求示例和返回示例,看着数据十分复杂,复杂的数据就不必用android原生的json解析方式了,因为很容易出错。这里用谷歌的神器gson以及它的插件GsonFormat...
最近在项目里使用了Retrofit2 + Rxjava框架封装网络请求,照着网上的教程一步步搭建起来,顺利地完成了网络请求模块的工作,同时通过okhttp3提供的logging拦截器打印出的请求与服务器回复日志,也是正常的参数与数据,但不知为何日志显示得很长很详细,如下图(还没截完),通过抓包工具看到的参数key也是很长很详细的key,这就令人疑惑了,究竟是为什么呢?
通过向同事...
示例如下HttpService.javaimportokhttp3.RequestBody;importretrofit2.Call;importretrofit2.http.Body;importretrofit2.http.Headers;importretrofit2.http.POST;public interfaceHttpService {String BASE_URL= "http:...
本文将介绍如何通过retrofit库post一串json格式的数据。首先post的json数据格式如下:{"Id": "string","DeviceId": "string","Name": "string","SumDistance": 0,"RouteNo": "string","SumPoints": 0,"SetupTime": "2016-06-10T13:11:00.766Z","U...
【网络】Retrofit2 POST(参数传递和文件上传),post参数,post文件,还有文件和参数一起上传。记录过程中所遇到的一些坑。----tjstudy
Android开发中的网络框架经过多年的发展,目前比较主流的就是Retrofit了,Retrofit2版本出现也有几年了,为了方便使用,特封装了一些关于Retrofit2的代码,分享给大家。
框架主要包括:
Get请求
Post请求
使用效果预览:
Retrofit对象
Retrofit框架内部使用的还是OkHttp框架,在实例化的时候可以自定义OkHttpClie...