Android Retrofit 网络框架的使用

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'
不要忘记添加网络权限喔 <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 照搬过来的。
 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样式,其他不同类型数据根据后台要求进行适当的调用,祝大家代码写的越来越好。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值