原文: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 网络传输相关推荐

  1. android http常用配置,Android中Retrofit+OkHttp进行HTTP网络编程的使用指南

    Retrofit介绍:Retrofit(GitHub主页https://github.com/square/okhttp)和OkHttp师出同门,也是Square的开源库,它是一个类型安全的网络请求库 ...

  2. Android OkHttp+Retrofit+Rxjava+Hilt 的网络请求封装

    今天给大家简单的封装一个现在比较流行的网络请求框架 第一步是导入我们所需要的依赖还需要在android {}闭包下添加一个 buildFeatures{viewBinding true } imple ...

  3. Retrofit + Kotlin + MVVM 的网络请求框架的封装尝试

    1.前言 之前在学习郭霖<第一行代码>时按部就班地写过一个彩云天气 App,对里面的网络请求框架的封装印象非常深刻,很喜欢这种 Retrofit + Kotlin + 协程的搭配使用.随后 ...

  4. 是时候客观评价Retrofit了,Retrofit这几点你必须明白!

    Tamic/CSDN 尊重原创:http://blog.csdn.net/sk719887916/article/details/53613263 是时候客观评价下Retrofit了,retrofit ...

  5. 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 ...

  6. 15Mbps!台湾网友33公里无线网络传输实测

    http://network.pconline.com.cn/pingce/0907/1708485_all.html 15Mbps!台湾网友33公里无线网络传输实测 2009-07-23 16:39 ...

  7. ensp大型网络环境设计与实现_mongodb内核源码设计实现、性能优化、最佳运维系列-网络传输层模块源码实现三...

    1. 说明 在之前的<<Mongodb网络传输处理源码实现及性能调优-体验内核性能极致设计>>和<<mongodb内核源码设计实现.性能优化.最佳运维系列-tran ...

  8. Android 实现无网络传输文件(2)

    在我的上一篇文章:Android 实现无网络传输文件,我介绍了通过 Wifi Direct(Wifi 直连)实现 Android 设备之间进行文件传输的方法,可以在无移动网络的情况下实现点对点的文件传 ...

  9. java字符串 直接能网络传输吗_atitit.二进制数据无损转字符串网络传输

    atitit.二进制数据无损转字符串网络传输 1. gbk的网络传输问题,为什么gbk不能使用来传输二进制数据 gbk会造成信息丢失 由于有些字符在gbk字符集中找不到对应的字符,所以默认使用编码63 ...

  10. 网络传输模型(概念)

    网络传输的参考模型有两种,一种是OSI(Open System InetConnection)参考模型,其有七层,另一种是TCP/IP参考模型,被减压成四层.OSI模型在当下以基本被TCP/IP模型所 ...

最新文章

  1. Swift3.0语言教程字符串转换为数字值
  2. Java assert
  3. jquery调用asp.net 页面后台方法
  4. CommonJs、AMD、CMD模块化规范
  5. 蓝色起源8月25日进行无人飞行,携带实验设备等上天
  6. mysql连表查询最大值_SQL 两个表联合查询记录中取最大值
  7. 传输表空间--使用Rman方式
  8. tar -xf_【图】兼具优雅与运动 抢先实拍改款捷豹XF
  9. Java测试-RestTemplate-@requestBody
  10. Oracle数据库常见版本
  11. .gen格式文件读取,完成兰伯特和墨卡托投影转换
  12. 电子电路学习笔记(15)——晶振
  13. linux md5检测工具下载,教你校验 Debian 软件包的MD5
  14. python 妹子图抓取
  15. 智能家居DIY之智能吸顶灯
  16. 用r求f分布的临界值
  17. 【python】python编译器以及安装
  18. Chained Predictions Using Convolutional Neural Networks
  19. 时序分析应用案例-【工具篇】用EVIEWS处理时间序列
  20. 头歌实训项目【学生信息转换】

热门文章

  1. 347,猜数字大小 II
  2. face++ 行驶证OCR识别
  3. java随机生成迷宫游戏地图_java随机生成迷宫(图的深度优先遍历)
  4. 什么是项目管理?怎么管?(一)
  5. 保定2021高考学校成绩查询,2021年保定高考成绩排名查询,成绩什么时候可以查询...
  6. 新浪微博分享错误代码列表
  7. ctf web 的一些writeup jwt以及黑客游戏
  8. iOS集成twitter分享
  9. Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be forced)
  10. 计算机操作系统产生的先后顺序,任务调度优先级