Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Retrofit 的使用詳解(下載 多文件上傳)

Retrofit 的使用詳解(下載 多文件上傳)

編輯:關於Android編程

Retrofit提供了5種內置的注解:GET、POST、PUT、DELETE和HEAD,在注解中指定的資源的相對URL

url與參數小總結

@GET("users/list")  

也可以在URL中指定查詢參數

@GET("users/list?sort=desc") 

請求的URL可以在函數中使用替換塊和參數進行動態更新,替換塊是{ and }包圍的字母數字組成的字符串,相應的參數必須使用相同的字符串被@Path進行注釋

@GET("group/{id}/users")  
Call> groupList(@Path("id") int groupId);  

准備工作:

Retrofit初始化

    public static ZoneApiInterface getClient(){
        Retrofit retrofit2 = new Retrofit.Builder()
                .baseUrl(Constant.ADDRESS_RetrofitClient)
                .addConverterFactory(GsonConverterFactory.create())
//                .client(ok.getClient())
                .build();
        return retrofit2.create(ZoneApiInterface.class);
    }

API接口

 public interface ZoneApiInterface {...}

callback回調

    static Callback callback =new Callback() {
        @Override
        public void onResponse(Call call, Response response) {
            System.out.println("url:"+  call.request().url()+"\t --->"+new Gson().toJson(response.body())+"\n\n");
        }
        @Override
        public void onFailure(Call call, Throwable t) {
            t.printStackTrace();
        }
    };

get請求

@Query
查詢參數既 url?後邊的

@GET("{user}")
 Call getZone(@Path("user") String user, @Query("name") String str);
getClient().getZone("log","Zone").enqueue(callback);

@QueryMap

 @GET("{user}")
Call getZone(@Path("user") String user, @QueryMap Map map);
retrofit2.Call call2 =  getClient().getZone("log", map);//返回的時候call 可以靈活運用

@Url

在Retrofit 2.0添加了一個新的注解:@Url,它允許我們直接傳入一個請求的URL。這樣以來我們可以將上一個請求的獲得的url直接傳入進來。方便了我們的操作。

@GET

Call getZoneUrl(@Url String str);
getClient().getZoneUrl("http://101.40.6.224:8089/Test/log"+"?a=1").enqueue(callback);

這個會無視 這裡寫圖片描述

POST

@Body
可以通過@Body注解指定一個對象作為Http請求的請求體

@POST("users/new")  
Call createUser(@Body User user);  

@Body map的時候

@POST(“{user}”)

 Call postZone(@Path("user") String user, @Body Map map);
  getClient().postZone("log", map).enqueue(callback);

upLoad

1.最標准的
@POST(“log”)

 Call postZoneFile( @Body MultipartBody mb);//upload最為標准的

File file = new File("D:\\psb.jpg");
File file2 = new File("D:\\mei.jpg");
        //多個文件上傳(已此為標准)  文件的時候item.isFormField()=false
        MultipartBody.Builder form = new MultipartBody.Builder();
        form.setType(MultipartBody.FORM);
        form.addFormDataPart("keyName","Zone");
        form.addFormDataPart("file","gaga.jpg", RequestBody.create(MediaType.parse("image/*"), file1));
        form.addFormDataPart("file2","meinv.jpg", RequestBody.create(MediaType.parse("image/*"), file));
        getClient().postZoneFile(form.build()).enqueue(callback);

2.Multipart官方的不太靠譜的 和上邊僅僅是服務器的標志 不一樣 item.isFormField()=true

       @Multipart
        @POST("log")
        Call sendFile(@Part(value = "myFile",encoding = "utf-8") RequestBody file);//upload
        @Multipart
        @POST ("log")
        Call sendFiles (@PartMap Map params);
      //另一種方式 不太靠譜的 和上邊僅僅是服務器的標志 不一樣 item.isFormField()=true
        HashMap mapFile = new HashMap<>();
        mapFile.put("keyName", RequestBody.create(MediaType.parse("text/x-markdown; charset=utf-8"),"Zone"));
        mapFile.put("file1",RequestBody.create(MediaType.parse("image/*"), file));
        getClient().sendFiles(mapFile).enqueue(callback);
//        _-------------單文件上傳 和第二一樣不標准-------------------
        getClient().sendFile(RequestBody.create(MediaType.parse("image/*"), file)).enqueue(callback);

download

 @GET
@Streaming
public Call down(@Url String url);//downLoad
static String downUrl = "http://down.360safe.com/360/inst.exe";
        //好使
        getClient().down(downUrl).enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                File file = new File("D:\\");
                if (file.exists()) {
                    System.out.println("you ");
                } else {
                    System.out.println("沒有");
                }
                try {
                    System.out.println(response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(Call call, Throwable t) {
            }
        });

Form encoded

我們可以使用@FormUrlEncoded注解來發送表單數據。使用 @Field注解和參數來指定每個表單項的Key,value為參數的值。

當我們有很多個表單參數時可以通過@FieldMap注解和Map對象參數來指定每個表單項的Key,value的值。
//@Field 這個應該和@body一樣什麼也能上傳文件吧沒嘗試

        @FormUrlEncoded
        @POST("log")
        Call formUrlEncoded(@Field("name") String name, @Field("password") String password);
        @FormUrlEncoded
        @POST("log")
        Call formUrlEncodedFile(@FieldMap Map map);
   private static void formUrlEncoded(Map map) {
        getClient().formUrlEncoded("ZoneForm", "123456").enqueue(callback);
        getClient().formUrlEncodedFile(map).enqueue(callback);
    }
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved