Retrofit網絡請求參數註解,@Path、@Query、@Post、Body等總結(超級實用)以及以Json格式和form-data格式提交數據

我總結的不是很全,這位博主介紹的十分詳細;超級實用

https://blog.csdn.net/guohaosir/article/details/78942485

Retrofit 以Json格式提交數據 (模擬登錄功能)

1、ApiService

    /**
     * 登錄
     */
    @Headers("Content-Type:application/json")
    @POST("user/login")
    Observable<ResponseBody> login(@Body RequestBody requestBody);

2、創建一個Bean類

public class UserBean {
    private String nickname;
    private String password;

    public UserBean(String nickname, String password) {
        this.nickname = nickname;
        this.password = password;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

3、將Bean類通過Gson轉爲json體

Gson gson = new Gson();
HashMap<String, String> map = new HashMap<>();
map.put("nickname", "123456");
map.put("password, "abcdefg");
String requestBody = gson.toJson(map);

//  此時的jsonBody打印出來的結果
//  {"password":"abcdefg","nickname":"123456"}

4、Retrofit請求頭是否攜帶  如果請求帶請求頭 用方法一,如果不帶請求頭 用方法二,請求頭需要添加的數據根據需求自行添加

1、不帶請求頭
 private void useRetrofit(String url) {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        apiServices = retrofit.create(ApiService.class);
    }
2、帶請求頭

 private void useHeaderRetrofit(String url) {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.addInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request original = chain.request();
                Request request = original.newBuilder()
                        .addHeader("Content-Type", "application/json;charset=utf-8")
                        .build();

                return chain.proceed(request);
            }
        });
        OkHttpClient client = builder.build();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(client)
                .build();
        apiServices = retrofit.create(ApiService.class);
    }

5、網絡請求的代碼

RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), requestBody);
        Observable<ResponseBody> responseBodyObservable = apiServices.login(body);
        responseBodyObservable.observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Observer<ResponseBody>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d("TAG", "e:" + e);
                    }

                    @Override
                    public void onNext(ResponseBody responseBody) {

                        try {
                            String string = responseBody.string();
                            Log.d("TAG", string);
                            callBack.onSuccess((T) string);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                });

Retrofit 以form-data格式提交數據 (模擬登錄功能)

1、ApiService

1、當數據量大的情況下用方法1  推薦此方法   處理數據時方便一些
    /**
     * 登錄
     */
    @Multipart
    @POST("users/login")
    Observable<ResponseBody> phoneLogin(@PartMap Map<String, RequestBody> requestBodyMap);

2、當數據量小的情況下用方法2
    /**
     * 登錄
     */
    @Multipart
    @POST("users/login")
    Call<JsonObject> phoneLogin(@Part("nickname") RequestBody username, @Part("password")  RequestBody password);

2、轉爲form-data

    /**
     * 轉換爲 form-data
     *
     * @param requestDataMap
     * @return
     */
    public static Map<String, RequestBody> generateRequestBody(Map<String, String> requestDataMap) {
        Map<String, RequestBody> requestBodyMap = new HashMap<>();
        for (String key : requestDataMap.keySet()) {
            RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"),
                    requestDataMap.get(key) == null ? "" : requestDataMap.get(key));
            requestBodyMap.put(key, requestBody);
        }
        return requestBodyMap;
    }

3、Retrofit請求頭是否攜帶  如果請求帶請求頭 用方法一,如果不帶請求頭 用方法二

1、不帶請求頭
 private void useRetrofit(String url) {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        apiServices = retrofit.create(ApiService.class);
    }
2、帶請求頭

 private void useHeaderRetrofit(String url) {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.addInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request original = chain.request();
                Request request = original.newBuilder()
                        .addHeader("Content-Type", "application/json;charset=utf-8")
                        .build();

                return chain.proceed(request);
            }
        });
        OkHttpClient client = builder.build();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(client)
                .build();
        apiServices = retrofit.create(ApiService.class);
    }

4、網絡請求的代碼

 Map<String, String> formMaildata = new HashMap<>();
        formMaildata.put("nickname", "123456");
        formMaildata.put("password", "abcdef");
        Map<String, RequestBody> stringRequestBodyMap = generateRequestBody(formMaildata);

//此時stringRequestBodyMap打印出來的結果
//{password=abcdef, nickname=123456}

        Observable<ResponseBody> responseBodyObservable = apiServices.login(stringRequestBodyMap);
        responseBodyObservable.observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Observer<ResponseBody>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d("TAG", "e:" + e);

                    }

                    @Override
                    public void onNext(ResponseBody responseBody) {

                        try {
                            String string = responseBody.string();
                            Log.d("TAG", string);
//                            callBack.onSuccess((T) string);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                });

May everyone be happy every day and everything go well!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章