retrofit 响应时间_HTTP Retrofit 网络传输
原文:https://www.jianshu.com/p/0fda3132cf98
Retrofit注解
请求方法
注解代码请求格式
@GET
GET请求
@POST
POST请求
@DELETE
DELETE请求
@HEAD
HEAD请求
@OPTIONS
OPTIONS请求
@PATCH
PATCH请求
请求参数
注解代码说明
@Headers
添加请求头
@Path
替换路径
@Query
替代参数值,通常是结合get请求的
@FormUrlEncoded
用表单数据提交
@Field
替换参数值,是结合post请求的
前提:
Android 系统上面默认所有Http的请求都被阻止了。
需要在androidmanifest.xml的 application标签上加入 android:usesCleartextTraffic="true"
首先引入依赖:Gson可以将Json和基本数据类型之间做转换;Okhtttp用来进行HTTP连接(Retrofit就是建立在OkHttp之上的);ReJava用来提供一个异步处理的操作。
//Gson库
implementation 'com.google.code.gson:gson:2.8.2'
//Okhttp库
implementation 'com.squareup.okhttp3:okhttp:3.1.2'
//Retrofit库
implementation 'com.squareup.retrofit2:retrofit:2.0.2'implementation'com.squareup.retrofit2:converter-gson:2.0.2' //gson转化
implementation 'com.squareup.retrofit2:adapter-rxjava:2.0.2' //RxJava//RxJava库
implementation 'io.reactivex:rxandroid:1.0.1'
先看下服务端代码,其实就是接收到了连接后返回一个JSON格式的数据:
var http = require('http');var url = require('url');var util = require('util');
http.createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/plain'});//解析 url 参数
var params = url.parse(req.url, true).query;
console.log("有连接");
console.log(util.inspect(url.parse(req.url,true)));//发送JSON数据
var jsonobj = {time:0, code:1, data:{song_url:'yangzhilong_tem.mp3', msg:123}};
res.end(JSON.stringify(jsonobj));
}).listen(3000);
先定义一个Bean来表示从服务端获取到的东西:
importjava.util.Map;public classUser {private longtime;private intcode;private Mapdata;public MapgetData() {returndata;
}public intgetCode() {returncode;
}public longgetTime() {returntime;
}
}
定义一个接口来提供服务:
importretrofit2.http.GET;importretrofit2.http.Query;importrx.Observable;public interfaceGetAPI {//设置路径
@GET("create/original")
Observable getUser(@Query("author_id") String author_id, @Query("type") String type, @Query("info") String info);
}
java代码:
packagecom.example.m_evolution;importandroid.support.v7.app.AppCompatActivity;importandroid.os.Bundle;importandroid.util.Log;importcom.example.m_evolution.Bean.User;importcom.example.m_evolution.HttpAPI.GetAPI;importjava.util.concurrent.TimeUnit;importokhttp3.OkHttpClient;importretrofit2.Retrofit;importretrofit2.adapter.rxjava.RxJavaCallAdapterFactory;importretrofit2.converter.gson.GsonConverterFactory;importrx.Subscriber;importrx.android.schedulers.AndroidSchedulers;importrx.schedulers.Schedulers;public class TestActivity extendsAppCompatActivity {
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
OkHttpClient okHttpClient= newOkHttpClient().newBuilder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.build();
Retrofit retrofit= newRetrofit.Builder()//设置数据解析器
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//设置网络请求的Url地址
.baseUrl("http://172.17.1.96:3000/")
.client(okHttpClient)
.build();//创建网络请求接口的实例
GetAPI mApi = retrofit.create(GetAPI.class);
mApi.getUser("1", "10", "[嘻哈,兴奋]")
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber() {
@Overridepublic voidonCompleted() {
Log.d("TestActivity", "调用完成");
}
@Overridepublic voidonError(Throwable e) {
Log.d("TestActivity", "请求失败"+e.toString());
}
@Overridepublic voidonNext(User user) {
Log.d("TestActivity", "请求成功");
Log.d("TestActivity", "time:"+user.getTime());
Log.d("TestActivity", "code:"+user.getCode());
Log.d("TestActivity", "song_url:"+user.getData().get("song_url")+"; msg:"+user.getData().get("msg"));
}
});
}
}
客户端结果:
服务端结果:
GET请求:
服务端提供的接口:
客户端:
//获取某用户的信息
@GET("/user/info")
Observable get_user_info(@Header("Authorization")String token, @Query("user_id")String user_id);
public classUserInfoHTTPResult {private long time; //服务器响应时间
private int code; //响应码 0表示正常
private String msg; //错误信息
private Mapdata;public longgetTime() {returntime;
}public intgetCode() {returncode;
}publicString getMsg() {returnmsg;
}publicString getUserName(){return data.get("username");
}publicString getGender(){return data.get("gender");
}publicString getAvatarUrl(){return data.get("avatar");
}
}
httpAPI.get_user_info(MyApp.token_pre+myApp.getUser_token(), user_id)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber() {
@Overridepublic voidonCompleted() {
Log.d(TAG,"onCompleted: "+"调用完成");
}
@Overridepublic voidonError(Throwable e) {
Log.d(TAG,"onError: "+"请求失败: "+e.toString());
myApp.MakeToast("网络出错");
}
@Overridepublic voidonNext(UserInfoHTTPResult userInfoHTTPResult) {if(userInfoHTTPResult.getCode()==0){//更新个人信息
myApp.setUser_nickname(userInfoHTTPResult.getUserName());
myApp.setUser_gender(userInfoHTTPResult.getGender());
myApp.setUser_head_url(userInfoHTTPResult.getAvatarUrl());
Log.d(TAG,"onNext: username: "+myApp.getUser_nickname());
Log.d(TAG,"onNext: gender: "+myApp.getUser_gender());
Log.d(TAG,"onNext: avatar: "+myApp.getUser_head_url());
editor.putString("user_nickname",myApp.getUser_nickname());
editor.putString("user_gender",myApp.getUser_gender());
editor.putString("user_head_url", myApp.getUser_head_url());
editor.commit();//修改控件
tv_user_nickname.setText(userInfoHTTPResult.getUserName());if(myApp.getUser_gender().equals("female")){
iv_user_gender.setImageResource(R.drawable.icon_user_gender_female);
}else{
iv_user_gender.setImageResource(R.drawable.icon_user_gender_male);
}
ImageLoader.getInstance().displayImage(MyApp.baseUrl+myApp.getUser_head_url(),iv_user_head);
}
}
});
POST请求:
服务端提供的接口:
注意,最后一个参数avatar表示头像,涉及到文件的上传;
//用户更新信息
@Multipart
@POST("/update/user")
Observable update_user(@Header("Authorization")String token, @Part("user_id") RequestBody user_id, @Part("username")RequestBody user_nickname, @Part("gender")RequestBody gender, @Part MultipartBody.Part part_head);
public classUpdateUserHTTPResult {private long time; //服务器响应时间
private int code; //响应码 0表示正常
private String msg; //错误信息
private Mapdata;public longgetTime() {returntime;
}public intgetCode() {returncode;
}publicString getMsg() {returnmsg;
}publicString getIsok(){return data.get("isok");
}publicString getAvatar_url(){return data.get("avatar_url");
}
}
RequestBody requestUserID = RequestBody.create(MediaType.parse("multipart/form-data"), user_id);
RequestBody requestUserNickname= RequestBody.create(MediaType.parse("multipart/form-data"), user_nickname);
RequestBody requestGender= RequestBody.create(MediaType.parse("multipart/form-data"), gender);//将头像图片存储为图片
Bitmap bitmap =((BitmapDrawable)iv_user_head.getDrawable()).getBitmap();
ImageUtils.saveImage(bitmap,"temp.png");//创建RequestBody,传入参数:"multipart/form-data",File
File imgFile = new File(Environment.getExternalStorageDirectory(),getString(R.string.app_name)+"/temp.png");
RequestBody fileRequestBody= RequestBody.create(MediaType.parse("multipart/form-data"), imgFile);//创建MultipartBody.Part,用于封装文件数据
MultipartBody.Part requestImgPart = MultipartBody.Part.createFormData("avatar", imgFile.getName(), fileRequestBody);
httpAPI.update_user("Bearer "+myApp.getUser_token(),requestUserID, requestUserNickname, requestGender, requestImgPart)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer() {
@Overridepublic voidonCompleted() {
Log.d(TAG,"onCompleted: ");
dialog_busying.dismiss();
}
@Overridepublic voidonError(Throwable e) {
Log.d(TAG,"onError: "+e.toString());
myApp.MakeToast("网络出错");
dialog_busying.dismiss();
}
@Overridepublic voidonNext(UpdateUserHTTPResult updateUserHTTPResult) {
Log.d(TAG,"onNext: Time "+updateUserHTTPResult.getTime());
Log.d(TAG,"onNext: Code "+updateUserHTTPResult.getCode());
Log.d(TAG,"onNext: Msg "+updateUserHTTPResult.getMsg());
Log.d(TAG,"onNext: Isok "+updateUserHTTPResult.getIsok());
Log.d(TAG,"onNext: Avatar_url "+updateUserHTTPResult.getAvatar_url());if(updateUserHTTPResult.getIsok().equals("true")){ //如果保存成功//更新本地的用户昵称
String user_nickname =et_user_nickname.getText().toString();
myApp.setUser_nickname(user_nickname);
myApp.setUser_head_url(updateUserHTTPResult.getAvatar_url());if (selector_gender == 0) myApp.setUser_gender("male");else if (selector_gender == 1) myApp.setUser_gender("female");
editor.putString("user_nickname", myApp.getUser_nickname());
editor.putString("user_head_url", myApp.getUser_head_url());
editor.putString("user_gender",myApp.getUser_gender());
editor.commit();
myApp.MakeToast("保存成功");
Log.d(TAG,"onNext: 保存成功");
EventBus.getDefault().post("change_user_info");
}else{
myApp.MakeToast("保存失败");
Log.d(TAG,"onNext: 保存失败");
}
dialog_busying.dismiss();
}
});
上面是表单上传数据,如果是要JSON上传数据,则:
interfaceAPIStore {
@Headers({"Content-Type: application/json","Accept: application/json"})//需要添加头
@POST ("vdyweb/ws/rest/Login")
CallgetMessage(@Body RequestBody info); //请求体味RequestBody 类型
PS:这里的数据类型是@Body,与表单不同
public classInfo {
String account;
String password;publicInfo(String account, String password) {this.account =account;this.password =password;
}
}
Info info=new Info("test","123456"); /*** 利用Gson 将对象转json字符串*/Gson gson=newGson();
String obj=gson.toJson(info);
retrofit=newRetrofit.Builder().baseUrl(BASE_LOGIN_URL).build();
RequestBody body=RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),obj);
retrofit 响应时间_HTTP Retrofit 网络传输相关推荐
- android http常用配置,Android中Retrofit+OkHttp进行HTTP网络编程的使用指南
Retrofit介绍:Retrofit(GitHub主页https://github.com/square/okhttp)和OkHttp师出同门,也是Square的开源库,它是一个类型安全的网络请求库 ...
- Android OkHttp+Retrofit+Rxjava+Hilt 的网络请求封装
今天给大家简单的封装一个现在比较流行的网络请求框架 第一步是导入我们所需要的依赖还需要在android {}闭包下添加一个 buildFeatures{viewBinding true } imple ...
- Retrofit + Kotlin + MVVM 的网络请求框架的封装尝试
1.前言 之前在学习郭霖<第一行代码>时按部就班地写过一个彩云天气 App,对里面的网络请求框架的封装印象非常深刻,很喜欢这种 Retrofit + Kotlin + 协程的搭配使用.随后 ...
- 是时候客观评价Retrofit了,Retrofit这几点你必须明白!
Tamic/CSDN 尊重原创:http://blog.csdn.net/sk719887916/article/details/53613263 是时候客观评价下Retrofit了,retrofit ...
- Android Retrofit详解(retrofit:2.3.0)
目录 1.Retrofit是什么? 2.Retrofit如何使用? 2.1创建HTTP请求的API接口 2.2请求执行 3.注解详情 3.1请求方法注解 3.2标记请求数据类型 3.3注解参数 4.G ...
- 15Mbps!台湾网友33公里无线网络传输实测
http://network.pconline.com.cn/pingce/0907/1708485_all.html 15Mbps!台湾网友33公里无线网络传输实测 2009-07-23 16:39 ...
- ensp大型网络环境设计与实现_mongodb内核源码设计实现、性能优化、最佳运维系列-网络传输层模块源码实现三...
1. 说明 在之前的<<Mongodb网络传输处理源码实现及性能调优-体验内核性能极致设计>>和<<mongodb内核源码设计实现.性能优化.最佳运维系列-tran ...
- Android 实现无网络传输文件(2)
在我的上一篇文章:Android 实现无网络传输文件,我介绍了通过 Wifi Direct(Wifi 直连)实现 Android 设备之间进行文件传输的方法,可以在无移动网络的情况下实现点对点的文件传 ...
- java字符串 直接能网络传输吗_atitit.二进制数据无损转字符串网络传输
atitit.二进制数据无损转字符串网络传输 1. gbk的网络传输问题,为什么gbk不能使用来传输二进制数据 gbk会造成信息丢失 由于有些字符在gbk字符集中找不到对应的字符,所以默认使用编码63 ...
- 网络传输模型(概念)
网络传输的参考模型有两种,一种是OSI(Open System InetConnection)参考模型,其有七层,另一种是TCP/IP参考模型,被减压成四层.OSI模型在当下以基本被TCP/IP模型所 ...
最新文章
- Swift3.0语言教程字符串转换为数字值
- Java assert
- jquery调用asp.net 页面后台方法
- CommonJs、AMD、CMD模块化规范
- 蓝色起源8月25日进行无人飞行,携带实验设备等上天
- mysql连表查询最大值_SQL 两个表联合查询记录中取最大值
- 传输表空间--使用Rman方式
- tar -xf_【图】兼具优雅与运动 抢先实拍改款捷豹XF
- Java测试-RestTemplate-@requestBody
- Oracle数据库常见版本
- .gen格式文件读取,完成兰伯特和墨卡托投影转换
- 电子电路学习笔记(15)——晶振
- linux md5检测工具下载,教你校验 Debian 软件包的MD5
- python 妹子图抓取
- 智能家居DIY之智能吸顶灯
- 用r求f分布的临界值
- 【python】python编译器以及安装
- Chained Predictions Using Convolutional Neural Networks
- 时序分析应用案例-【工具篇】用EVIEWS处理时间序列
- 头歌实训项目【学生信息转换】
热门文章
- 347,猜数字大小 II
- face++ 行驶证OCR识别
- java随机生成迷宫游戏地图_java随机生成迷宫(图的深度优先遍历)
- 什么是项目管理?怎么管?(一)
- 保定2021高考学校成绩查询,2021年保定高考成绩排名查询,成绩什么时候可以查询...
- 新浪微博分享错误代码列表
- ctf web 的一些writeup jwt以及黑客游戏
- iOS集成twitter分享
- Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be forced)
- 计算机操作系统产生的先后顺序,任务调度优先级