Android网络请求框架Retrofit详解

介绍:

Retrofit 是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp做网络请求。本文使用Retrofit2.0.0版本进行实例演示。

使用Retrofit可以进行GET,POST,PUT,DELETE等请求方式。

同步请求:需要在子线程中完成,会阻塞主线程。

Response response = call.execute().body();

异步请求:请求结果在主线程中回调,可以在onResponse()回调方法进行更新UI。

call.enqueue(Callback callback)

使用步骤:

(1) 创建工程,添加jar:

compile 'com.squareup.retrofit2:retrofit:2.0.0' compile 'com.squareup.retrofit2:converter-gson:2.0.0' //这两个jar版本要一致,否则会有冲突

(2) 创建业务请求接口,具体代码如下

/** * 创建业务请求接口 */ public interface IUserService { /** * GET请求 */ @GET("Servlet/UserServlet") Call<User> getUser(@Query("email") String email); /** * POST请求 */ @FormUrlEncoded @POST("UserServlet") Call<User> postUser(@Field("name") String name, @Field("email") String email); }

解释说明:

@GET注解表示GET请求,@Query表示请求参数,将会以key=value(@Query注解参数名称为key,调用传进来的值为value)的方式拼接在url后面.

@POST注解表示POST请求,@FormUrlEncoded将会自动将请求参数的类型设置为application/x-www-form-urlencoded,@FormUrlEncoded注解不能用于Get请求。@Field注解将每一个请求参数都存放至请求体中,还可以添加encoded参数,该参数为boolean型,具体的用法为:
@Field(value = "password", encoded = true) String pwd
encoded参数为true的话,key-value-pair将会被编码,即将中文和特殊字符进行编码转换.

(3)创建Retrofit对象

Retrofit retrofit = new Retrofit.Builder() .baseUrl(Constant.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); IUserService iUserService = retrofit.create(IUserService.class);

解释说明:

baseUrl()方法制定网络请求的固定绝对地址,一般包括请求协议(如Http)、域名或IP地址、端口号。
创建Retrofit实例时,若没有配置addConverterFactory(GsonConverterFactory.create())将会回调出JSON字符串,配置了将会回调实体对象。

支持的JSON解析库:

Gson: compile ‘com.squareup.retrofit2:converter-gson:2.0.1'
Jackson: compile ‘com.squareup.retrofit2:converter-jackson:2.0.1'
Moshi: compile ‘com.squareup.retrofit2:converter-moshi:2.0.1'
Protobuf: compile ‘com.squareup.retrofit2:converter-protobuf:2.0.1'
Wire: compile ‘com.squareup.retrofit2:converter-wire:2.0.1'
Simple XML: compile ‘com.squareup.retrofit2:converter-simplexml:2.0.1'
Scalars (primitives, boxed, and String): compile ‘com.squareup.retrofit2:converter-scalars:2.0.1'

(4) 调用请求方法,并得到Call实例

Call<ResponseBody> call = iUserService.getUser(xing-java@foxmail.com);

(5) 使用Call实例完成同步或异步请求

/** * 发送GET请求 */ private void getRequest() { Retrofit retrofit = new Retrofit.Builder() .baseUrl(Constant.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); IUserService iUserService = retrofit.create(IUserService.class); Call<User> call = iUserService.getUser("xing-java@foxmail.com"); call.enqueue(new Callback<User>() { @Override public void onResponse(Call<User> call, Response<User> response) { Log.i("MainActivity", "response = " + response); User user = response.body(); resTxtView.setText(user.toString()); } @Override public void onFailure(Call<User> call, Throwable t) { } }); }

请求方式:

(1)GET 请求:

GET 请求返回 JSON 字符串:

GET 请求返回实体对象:

(2) POST发送表单:

/** * 发送POST请求 */ private void postRequest() { Retrofit retrofit = new Retrofit.Builder() .baseUrl(Constant.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); IUserService iUserService = retrofit.create(IUserService.class); Call<User> call = iUserService.postUser("star.tao", "xing-java@foxmail.com"); call.enqueue(new Callback<User>() { @Override public void onResponse(Call<User> call, Response<User> response) { } @Override public void onFailure(Call<User> call, Throwable throwable) { } });

服务端接收到的结果:

(3)文件上传:

private void uploadFile() { Retrofit retrofit = new Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create()) .baseUrl(Constant.BASE_URL) .build(); IUserService iUserService = retrofit.create(IUserService.class); File file = new File("/sdcard/s.png"); RequestBody fileRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file); MultipartBody.Part multipartBody = MultipartBody.Part.createFormData("upload_file", file.getName(), fileRequestBody); String desc = "this is file description"; RequestBody descRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), desc); Call<ResponseBody> call = iUserService.uploadFile(descRequestBody, multipartBody); call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { Log.i("debug", "upload success"); } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { } }); }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-11-08 19:17:17

Android网络请求框架Retrofit详解的相关文章

Android 网络请求框架Volley实例详解

Android 网络请求框架Volley实例详解 首先上效果图 Logcat日志信息on Reponse Volley特别适合数据量不大但是通信频繁的场景,像文件上传下载不适合! 首先第一步 用到的RequetQueue RequestQueue.Java RequestQueue请求队列首先得先说一下,ReuqestQueue是如何对请求进行管理的...RequestQueue是对所有的请求进行保存...然后通过自身的start()方法开启一个CacheDispatcher线程用于缓存调度,开

Android的搜索框架实例详解_Android

基础知识 Android的搜索框架将代您管理的搜索对话框,您不需要自己去开发一个搜索框,不需要担心要把搜索框放什么位置,也不需要担心搜索框影响您当前的界面.所有的这些工作都由SearchManager类来为您处理(以下简称"搜索管理器"),它管理的Android搜索对话框的整个生命周期,并执行您的应用程序将发送的搜索请求,返回相应的搜索关键字. 当用户执行一个搜索,搜索管理器将使用一个专门的Intent把搜索查询的关键字传给您在配置文件中配置的处理搜索结果的Activity.从本质上讲

Android的搜索框架实例详解

基础知识 Android的搜索框架将代您管理的搜索对话框,您不需要自己去开发一个搜索框,不需要担心要把搜索框放什么位置,也不需要担心搜索框影响您当前的界面.所有的这些工作都由SearchManager类来为您处理(以下简称"搜索管理器"),它管理的Android搜索对话框的整个生命周期,并执行您的应用程序将发送的搜索请求,返回相应的搜索关键字. 当用户执行一个搜索,搜索管理器将使用一个专门的Intent把搜索查询的关键字传给您在配置文件中配置的处理搜索结果的Activity.从本质上讲

网络请求框架 Retrofit 2 使用入门

本文讲的是网络请求框架 Retrofit 2 使用入门, 你将要创造什么 Retrofit 是什么? Retrofit 是一个用于 Android 和 Java 平台的类型安全的网络请求框架.Retrofit 通过将 API 抽象成 Java 接口而让我们连接到 REST web 服务变得很轻松.在这个教程里,我会向你介绍如何使用这个 Android 上最受欢迎和经常推荐的网络请求库之一. 这个强大的库可以很简单的把返回的 JSON 或者 XML 数据解析成简单 Java 对象(POJO).GE

Android网络请求框架之Retrofit实践

网络访问框架经过了从使用最原始的AsyncTask构建简单的网络访问框架(甚至不能称为框架),后来使用开源的android-async-http库,再到使用google发布的volley库,一直不懈的寻找更好的解决方案,到现在也没找到,不过据行业所说,Retrofit算是行业比较牛逼的开源请求框架了吧,也算找 到了一些更好的方案,在这里做些记录,也做共享. 下面是我们常用的mvp模式的运行模型: Retrofit:Square提供的开源产品,为Android平台的应用提供一个类型安全的REST客

android 网络请求库volley方法详解_Android

使用volley进行网络请求:需先将volley包导入androidstudio中 File下的Project Structrue,点加号导包   volley网络请求步骤:       1. 创建请求队列       RequestQueue queue = Volley.newRequestQueue(this);       2.创建请求对象(3种)                            StringRequest request = new StringRequest("

android 网络请求库volley方法详解

使用volley进行网络请求:需先将volley包导入androidstudio中 File下的Project Structrue,点加号导包 volley网络请求步骤: 1. 创建请求队列       RequestQueue queue = Volley.newRequestQueue(this); 2.创建请求对象(3种) StringRequest request = new StringRequest("请求方法","请求的网络地址","成功的网

android 线程池配合网络请求框架

问题描述 android 线程池配合网络请求框架 android一些比较常用的网络请求框架如Xutils,volley,内部有线程池吗?如果没有,如何配合自己编写的线程池进行网络请求? 解决方案 Volley是有的,参考:http://www.zhihu.com/question/24695486

Android Http请求框架二:xUtils 框架网络请求

一:对Http不了解的请看 Android Http请求框架一:Get 和 Post 请求   二.正文 1.xUtils 下载地址     github 下载地址  : https://github.com/wyouflf/xUtils   2.关于网络请求的方法 package com.jike.shanglv.NetAndJson; import java.io.File; import com.lidroid.xutils.HttpUtils; import com.lidroid.xu