retrofit使用套路

单独使用retrofit大概就是3个东西,一个model。一个interface用来定义每一个请求。还有就是调用的地方

调用在MainActivity里

首先根据需要是否添加gson转换器,需要的话对这个转换器进行一些设置,并在生成retrofit时添加

然后根据需要是否添加okhttp客户端,需要的话进行一些设置,并在生成retrofit时添加

然后就是生成retrofit

再然后根据retrofit生成interface实例

再然后interface实例调用自己的方法生成Call<Bean> 类型的对象

再然后就是用call去请求

MainActivity:

package com.yyy.retrofitdemo;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import okhttp3.OkHttpClient;
import okhttp3.internal.Platform;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

/**http://retrofit.devwiki.net/param
 * 添加retrofitlog崩溃是因为依赖的包不对。
 * log信息不是打印到logcat。而是控制台
 */
public class MainActivity extends Activity {
    /**
     * base要以/结尾是一种规范
     */
    public static final String BASE_URL = "http://retrofit.devwiki.net/";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //为了以防你需要调整json里面的一些格式,比如,Date Format。你可以创建一个Gson 对象并把它传递给GsonConverterFactory.create()
        Gson gson = new GsonBuilder()
                .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
                .create();
        //经过测试: baseUrl必须设置,如果 声明接口时@GET使用了完整的url路径,那么baseUrl就会被忽略,否则就是拼接url

        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient httpClient = new OkHttpClient.Builder().addInterceptor(logging).build();
//        OkHttpClient httpClient = new OkHttpClient();
// add your other interceptors …

// add logging as last interceptor
//        httpClient.interceptors().add(logging);
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)//在这里可以添加 Gson转换器等
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(httpClient)
                .build();

        LoginInterface loginInterface = retrofit.create(LoginInterface.class);
        Call<LoginData> call = loginInterface.get("POST" , "30:D6:C9:F9:06:11");

        //同步请求....
//        try {
//            Response<ResponseBody> bodyResponse = call.execute();
//            String body = bodyResponse.body().string();//获取返回体的字符串
//            Log.e("MainActivity", "");
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//            new Thread(runnable).start();

        //异步请求....
        call.enqueue(new Callback<LoginData>() {
            @Override
            public void onResponse(Call<LoginData> call, Response<LoginData> response) {
                try {
                    LoginData loginData = response.body();//获取返回体的字符串
                    Log.e("MainActivity", "");
                } catch (Exception e) {
                    e.printStackTrace();
                }
                Log.e("MainActivity", "");
            }

            @Override
            public void onFailure(Call<LoginData> call, Throwable t) {
                Log.e("MainActivity", "");
            }
        });
    }
}

LoginData:

package com.yyy.retrofitdemo;

/**
 * Created by yqr on 2016/11/14 0014.
 */

public class LoginData {


    /**
     * code : 10001
     * desc : success
     * data : {"id":"dddd","type":"POST"}
     */

    private int code;
    private String desc;
    private DataBean data;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public DataBean getData() {
        return data;
    }

    public void setData(DataBean data) {
        this.data = data;
    }

    public static class DataBean {
        /**
         * id : dddd
         * type : POST
         */

        private String id;
        private String type;

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getType() {
            return type;
        }

        public void setType(String type) {
            this.type = type;
        }
    }
}

LoginInterface:

package com.yyy.retrofitdemo;

/**
 * Created by yqr on 2016/11/14 0014.
 */

import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Query;

/**
 *    @GET("param")里面不用/开头是一种规范
 *    使用@Query会直接把参数加到请求地址后面拼接起来
 *    使用@Filed不会拼接。。同时使用@Field时需要在方法上加上 @FormUrlEncoded
 *    两者可以混合使用
 *    测试时。post请求不管使用@Query还是@Filed,都能得到正确的返回。
 *    get请求大都使用的@Query传参
 *    详细讲解:http://www.jianshu.com/p/7687365aa946
 * Created by yqr on 2016/11/10 0010.
 */
//http://192.168.2.199/training/teacher/teacherLogin?user=30:D6:C9:F9:06:11
public interface LoginInterface {
    /**
     * 这样写的header是静态的。动态的header可以写在下面定义的方法里使用@Header
     */
//    @Headers(
//            "type: POST"//这样添加hearderkey-value。多个header写成数组形式用大括号包起来
//    )
    @POST("param")
//这里是拼接baseUrl后面的地址。
//    Call<ResponseBody> get();//不需要转化成javaBean所以用ResponseBody
    Call<LoginData> get(@Header("type") String type , @Query("id") String id);
    //@Path是加参数
    //不需要转化成javaBean所以用ResponseBody
    //Call<T> get();//必须是这种形式,这是2.0之后的新形式
//我这里需要返回网页内容,不需要转换成Json数据,所以用了ResponseBody;
//你也可以使用Call<GsonBean> get();这样的话,需要添加Gson转换器...后续介绍
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值