這是個人學習筆記!!!個人學習筆記!!!
Retrofit通過大範圍註解解化Http請求。使用Picasso處理圖片,依賴okHttp實現。
一.創建對象,網絡請求方式,獲取回調方法...
1.創建Retrofit對象
//創建retrofit,通過GsonConverterFactory.create爲Retrofit添加Gson支持 Retrofit retrofit=new Retrofit.Builder() .client(new OkHttpClient()) .addConverterFactory(GsonConverterFactory.create()) //設置數據解析器 //baseUrl一定以/爲結束 .baseUrl("http://...") //設置網絡請求url地址 .build();
處理用Gson來處理,轉換。
這種方式是最簡單的創建方式。
Retrofit是用okHttp來實現的,也可以自定義okHttp來進行網絡請求
例子如下:
//可以自定義okHttp,用Retrofit來請求網絡 private void setOkHttpClient(){ final OkHttpClient client = new OkHttpClient(); client.interceptors().add(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Response response = chain.proceed(chain.request()); // Do anything with response here return response; } Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://...") .client(client) .addConverterFactory(GsonConverterFactory.create()) .build(); }); }
2.網絡請求的接口 *接口中每個方法的參數都需要使用註解標註,否則會報錯
public interface NetWorkService { //定義請求接口 @GET("openapi.do?keyfrom=Yanzhikai&key=2032414398&type=data&doctype=json&version=1.1&q=car") Call<String> getData();//getData()接收網絡請求數據的方法 <String>是接收數據的類型 }
*Retrofit把網絡請求的Url分成了兩個部分。
第一部分:是這裏的@GET裏面的內容
public interface NetWorkService { //定義請求接口 @GET("openapi.do?keyfrom=Yanzhikai&key=2032414398&type=data&doctype=json&version=1.1&q=car") Call<String> getData();//getData()接收網絡請求數據的方法 <String>是接收數據的類型 }
第二部分:是在創建Retrofit實例的時候,通過baseUrl設置的
//創建retrofit,且讓ResponseBody用gson轉化爲json Retrofit retrofit=new Retrofit.Builder() .client(new OkHttpClient()) .addConverterFactory(GsonConverterFactory.create(gson)) .baseUrl("http://....") .build();
推薦組合完整url的方式是: baseUrl=目錄形式 url=相對路徑
baseUrl=http://host:port/good/ url=apath
完整Url:http://host:port/good/url
標籤:@HTTP 他的作用是可以替換@GET @POST @PUT @DELETE @HEAD這些註解。
//1.網絡請求的方法 2.網絡請求地址路徑 3.是否有請求體 @HTTP(method = "post",path = "blog/{id}",hasBody = false) Call<ResponseBody> getData(@Path("id") int id); //{id}表示是一個變量 method的值Retrofit不會做處理,要自行確保正確
@FormUrlEncoded :發送編碼表單數據。每個鍵值對需要用@Filed來註解鍵,隨後的對象需要提供值。
@POST("/form") @FormUrlEncoded //表明這是個表單格式的請求 Call<ResponseBody> testFormUrlEncoded1(@Field("userName") String userName,@Field("age")int age);
在Retrofit中的用法:
NetWorkService mNetWorkService=retrofit.create(NetWorkService.class); Call<ResponseBody> mcall=mNetWorkService.testFormUrlEncoded1("Jack",10);
@Multipart:發送編碼表單數據。適用於有文件上傳的上傳場景。
@POST("/form") @Multipart Call<ResponseBody> testMultipart( @Part("userName")ResponseBody name, @Part("age")ResponseBody age, @Part MultipartBody.Part file);
實際用法:
MediaType textType = MediaType.parse("text/plain"); ResponseBody userName=ResponseBody.create(textType,"Rose"); ResponseBody age=ResponseBody.create(textType,"19"); MultipartBody.Part filePart=MultipartBody.Part.createFormData("file","info.txt",file); Call<ResponseBody> callPart=mNetWorkService.testMultipart(userName,age,filePart);
二.網絡請求參數
1.@Header&@Headers
作用:添加請求頭&添加不固定的請求頭
/** * @Header用於添加不固定的請求頭 @Headers用於添加固定的請求頭 * @Header作用於方法的參數 @Headers作用於方法 */ //@Header @GET("user") Call<User> getUser(@Header("Authorization")String authorization); //@Headers @Headers("Authorization:authorization") @GET("user") Call<String> getUser();
2.@body
作用:以post方式傳遞自定義數據類型給服務器
*若提交的是一個Map,作用相當於@Field
map要經過FormBody.Builder類處理成符合OkHttp格式的表單
//@body爲Map FormBody.Builder formBuild=new FormBody.Builder(); formBuild.add("key","value");
3.@Field&FieldMap
作用:發送Post時提交請求的表單字段
//@Field和FormUrlEncoded配合使用 @POST("/form") @FormUrlEncoded //將後面的name1的取值作爲name的值 Call<ResponseBody> testFormUrl(@Field("name")String name1,@Field("height")float height);
//FieldMap
//map的key作爲表單的鍵 @POST("/form") @FormUrlEncoded Call<ResponseBody> testFormUrlOfMap(@FieldMap Map<Object,Object> map);
在類中具體的使用
//Field具體使用 Call<ResponseBody> callField=netWorkService.testFormUrlOfField("Jack",1.2f);
//FieldMap具體使用 Map<Object,Object> mapFiled=new HashMap<Object, Object>(); mapFiled.put("name","Jack"); mapFiled.put("height","1.80"); Call<ResponseBody> callFieldMap=netWorkService.testFormUrlOfMap(mapFiled);
4.@Part&PartMap
作用:發送post請求時提交請求的表單字段
與Field的功能相似,但是它的參數類型更加多。它包括了數據流,所以它適用於有文件上傳的情況。
A.@Part
@POST("/form") @Multipart Call<ResponseBody> testMultipart( @Part("userName")ResponseBody name, @Part("age")ResponseBody age, @Part MultipartBody.Part file);
B.@PartMap
@POST("/form") @Multipart //PartMap註解支持map對象 Call<ResponseBody> testPartMap(@PartMap Map<String,Object> map,@Part("name")String userName, @Part MultipartBody.Part file);
具體使用:
@Part
ResponseBody name = null; ResponseBody age=null; //Part&PartMap具體使用 MultipartBody.Part filedMap=MultipartBody.Part.createFormData("file","test.txt",file1); Call<ResponseBody> callPart=netWorkService.testMultipart(name,age,filedMap);
@PartMap
Map<Object,Object> mapPartMap=new HashMap<Object, Object>(); mapFiled.put("name","Jack"); mapFiled.put("height","1.80"); Call<ResponseBody> callPartMap=netWorkService.testPartMap(mapPartMap,"Jack",filedMap);
5.@Query&@QueryMap
作用:用於Get方法的參數查詢(Query = Url 中 ‘?’ 後面的 key-value)
eq:url=http://www.aa.com/?type=android 這裏的@Query=type
@GET("/") Call<String> query(@Query("type")String type);
6.@Path
作用:Url地址的缺省值
//@Path @GET("users/{user}/respos") Call<ResponseBody> getPath(@Path("user")String user);//path那裏的user會替換掉{user}的值
7.@Url
作用:直接傳入一個Url的變量,用於Url設置
@GET Call<ResponseBody> testUrlAndQuery(@Url String url);//有@url註解的時候,@GET傳入的Url就可以省略
基本的註解符號大全,解釋+作用
三.Retrofit對象內的各種對象解析
Retrofit對象創建過程如下
Gson gson=new GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm:ss").create(); //創建retrofit,且讓ResponseBody用gson轉化爲json Retrofit retrofit=new Retrofit.Builder() .client(new OkHttpClient()) .addConverterFactory(GsonConverterFactory.create(gson)) .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//支持RxJava平臺 .baseUrl("") .build();
1.關於數據解析器(convert)
Retrofit支持多種數據解析方式。使用時記得在build中添加依賴庫。依賴庫如下。
數據解析器 | Gradle依賴 |
---|---|
Gson | com.squareup.retrofit2:converter-gson:2.0.2 |
Jackson | com.squareup.retrofit2:converter-jackson:2.0.2 |
Simple XML | com.squareup.retrofit2:converter-simplexml:2.0.2 |
Protobuf | com.squareup.retrofit2:converter-protobuf:2.0.2 |
Moshi | com.squareup.retrofit2:converter-moshi:2.0.2 |
Wire | com.squareup.retrofit2:converter-wire:2.0.2 |
Scalars | com.squareup.retrofit2:converter-scalars:2.0.2 |
//網絡請求接口實例 NetWorkService netWork=retrofit.create(NetWorkService.class);//NetWorkService是網絡請求接口 Call<String> callNetWork=netWork.getCall();//getCall是NetWorkService裏面的方法
在NetWorkService裏面的getCall()方法
@GET("ajax.php?a=fy&f=auto&t=auto&w=hello%20world") Call<String> getCall();
4.(異步/同步)發送網絡請求
封裝了數據轉換,線程切換的操作
<1>異步
//網絡請求接口實例 NetWorkService netWork=retrofit.create(NetWorkService.class); Call<String> callNetWork=netWork.getCall(); //異步發送網絡請求 callNetWork.enqueue(new Callback<String>() { @Override public void onResponse(Call<String> call, retrofit2.Response<String> response) { response.body().show();//請求處理,輸出結果 } @Override public void onFailure(Call<String> call, Throwable t) { Log.i("t","連接失敗"); } });
<2>同步
//同步發送網絡請求 try { Response<Reception> response=call.execute(); } catch (IOException e) { e.printStackTrace(); }
5.處理返回數據
從上面的例子都可以看出來,結果是根據Response類的body()返回的數據來進行處理。
最後我們把上面這些步驟串聯起來,發送並處理一個異步網絡請求。(NetWorkService是一個接口,裏面是選擇網絡請求方式,以及一些url地址,參數等)。
private void goRetrofitDemo(){ //創建Retrofit對象 Retrofit retrofit=new Retrofit.Builder() .baseUrl("http://fanyi.youdao.com") .addConverterFactory(GsonConverterFactory.create()) .build(); //創建網絡請求接口實例 NetWorkService netWorkServiceInterface=retrofit.create(NetWorkService.class); //對發出請求進行封裝 Call<String> callNet=netWorkServiceInterface.getCall(); //異步發出網絡請求 callNet.enqueue(new Callback<String>() { @Override public void onResponse(Call<String> call, retrofit2.Response<String> response) { response.body().toString();//處理返回結果 } @Override public void onFailure(Call<String> call, Throwable t) { } }); }