单独使用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 * 添加retrofit的log崩溃是因为依赖的包不对。 * 且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"//这样添加hearder。key-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转换器...后续介绍 }