Retrofit2整体教程(包你走向幸福人生)
现在主流网络框架retrofit已经火了很久了,没用的速度走起,本文章给大家提供详细的讲解,欢迎参考,如有疑问请速度告知老铁,一起探讨喔。
一: 首先就是配置文件的配置
如果单纯使用retrofit 2的话可以查看官方文档 https://github.com/square/retrofit
也就是需要配置
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.okhttp3:logging-interceptor:+'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.okhttp3:logging-interceptor:+'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
不要忘记添加网络权限喔 <uses-permission android:name="android.permission.INTERNET" />
二:网络工具类配置和封装
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Created by xfc
*
*/
public class RetrofitUtil {
public static final long DEFAULT_TIMEOUT = 15;
/**
* 提交数据
*/
public static ApiService setForm() {
Gson gson = new GsonBuilder()
//配置你的Gson
.setDateFormat("yyyy-MM-dd hh:mm:ss")
.create();
OkHttpClient client = null;
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
LogUtil.eLength("提交数据", message);
}
});
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
client = new OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Config.URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
ApiService apiService = retrofit.create(ApiService.class);
return apiService;
}
/**
* 提交文件设置(多文件上传)
*/
public static Map<String, RequestBody> setFile(Map<String, Object> map, String filename, File file) {
Map<String, RequestBody> fileUpload = new HashMap<>();
MediaType textType = MediaType.parse("text/plain");
for (Map.Entry<String, Object> entry : map.entrySet()) {
fileUpload.put(entry.getKey().toString(), RequestBody.create(textType, entry.getValue().toString()));
}
RequestBody fileio = RequestBody.create(MediaType.parse("application/octet-stream"), file);
LogUtil.eLength("文件名", fileio + "");
fileUpload.put("file\"; filename=\"" + filename, fileio);
return fileUpload;
}
/**
* 单个文件上传
*/
public static MultipartBody.Part setFile(File file) {
//构建requestbody
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
//将resquestbody封装为MultipartBody.Part对象
//string name 为对应上传的字段名
MultipartBody.Part body = MultipartBody.Part.createFormData("myfiles", file.getName(), requestFile);
return body;
}
/**
* 提交json设置
*/
public static RequestBody setBodyjson(String bodyjson) {
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), bodyjson);
return body;
}
}
Config.URL为其ip也就是baseUlr,Retrofit2 的baseUlr 必须以 /(斜线) 结束,不然会抛出一个IllegalArgumentException,所以如果你看到别的教程没有以 / 结束,那么多半是直接从Retrofit 1.X 照搬过来的。
三:接下来就是数据调用了,睁开大眼仔细查看喔
这只是一个demo样式,其他不同类型数据根据后台要求进行适当的调用,祝大家代码写的越来越好。
ApiService 为接口定义
二:接口定义 ApiService
这是封装好的各个意义数据调用接口
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.PartMap;
import retrofit2.http.QueryMap;
import retrofit2.http.Url;
/**
* Created by xfc
*
*/
public interface ApiService {
/**
* get 请求方式
* map 作为参数
*/
@GET()
Call<ResponseBody> getMap(@Url String url, @QueryMap Map<String, Object> map);
/**
* get 请求方式
* 参数直接拼接
*/
@GET()
Call<ResponseBody> getParameter(@Url String url);
/**
* 表单数据提交
* Map的key作为表单的键
*/
@FormUrlEncoded
@POST()
Call<ResponseBody> formMap(@Url String url, @FieldMap(encoded = true) Map<String, Object> map);
/**
* 表单数据提交
* Map的key作为表单的键
*/
@POST()
Call<ResponseBody> uploadjson(@Url String url, @Body RequestBody jsonBody);
/**
* 进行文件上传
*/
@POST()
@Multipart
Call<ResponseBody> fileUpload(@Url String url, @PartMap Map<String, RequestBody> args);
/**
* 基本数据提交(比如json)
*/
@POST()
Call<ResponseBody> setData(@Url String url, @Body String string);
@Multipart
@POST()
Call<ResponseBody> fileUpload(@Url String url, @Part MultipartBody.Part file);
}
三:接下来就是数据调用了,睁开大眼仔细查看喔
//参数放入集合
Map<String, Object> map = new HashMap<>();
//post请求方式数据传入 Config.getToGoBuy调用方法名
RetrofitUtil.setForm().formMap(Config.getToGoBuy, map).enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
这只是一个demo样式,其他不同类型数据根据后台要求进行适当的调用,祝大家代码写的越来越好。