Retrofit简单封装使用--Post请求封装请求体、Get请求通过参数、map方式构建url

之前总结过Volley-OkHttp

Volley–OkHttp学习博客

今天来写写Retrofit的demo,简单封装下

Retrofit与okhttp共同出自于Square公司,retrofit就是对okhttp做了一层封装。把网络请求都交给给了Okhttp,我们只需要通过简单的配置就能使用retrofit来进行网络请求了,其主要作者是Android大神JakeWharton。

导包:

compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'io.reactivex:rxjava:1.1.6'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'

我通过http://apis.juhe.cn/mobile/get?phone=13429667914&key=safly这个进行测试

1、首先创建请求接口

   interface PostClickAppInfoServerParameter {
        @GET("mobile/get")
        Call<HttpResultJuHe> getJuheResult(@Query("phone") String phone,
                                                @Query("key") String key);
    }

以上的phone、key是请求参数的键,返回一个Call泛型接口

2、配置Retrofit

 protected RetrofitBase(){
        retrofit = new Retrofit.Builder()
                .baseUrl(BASEURL)
                .client(client())
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
    }

    private OkHttpClient client(){
        LauncherTrust launcherTrust = new LauncherTrust();
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS)
                .readTimeout(TIMEOUT,TimeUnit.MILLISECONDS)
                .sslSocketFactory(sslSocketFactory(launcherTrust),launcherTrust)
                .hostnameVerifier(new AllowAllHostnameVerifier())
                .build();
        return okHttpClient;
    }

addConverterFactory和addCallAdapterFactory说明可以支持Gson、Rxjava,Retrofit是进一步封装了OkHttp的代码

3、得到Call的实例,发起请求

    public void postClickAppInfoParameter(final MyCallback mCallback) {
        FactoryInters.PostClickAppInfoServerParameter server = retrofit.create(FactoryInters.PostClickAppInfoServerParameter.class);

        final Call<HttpResultJuHe> call = server.getJuheResult("13429667914", "safly");
        call.enqueue(new Callback<HttpResultJuHe>() {
            @Override
            public void onResponse(final Call<HttpResultJuHe> call, final Response<HttpResultJuHe> response) {
                Log.i(TAG, "response------------>" + response.body().toString());
                retroHttpHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        if (mCallback != null) {
                            mCallback.onSuccess(response.body());

                            if (call != null)
                                call.cancel();
                        }
                    }
                });

            }
            @Override
            public void onFailure(Call<HttpResultJuHe> call, Throwable t) {

                String message = t.getMessage();
                if (mCallback != null) {
                    mCallback.onFailture(message);
                }

            }
        });
    }

以上是添加请求参数的方法,请求参数还可以统一放在map中,以下的PostClickAppInfoParameterJsonBody是封装了请求体

public interface FactoryInters {

    interface PostClickAppInfoServerParameter {
        @GET("mobile/get")
        Call<HttpResultJuHe> getJuheResult(@Query("phone") String phone,
                                                @Query("key") String key);
    }

    interface PostClickAppInfoServerMap {
        @GET("mobile/get")
        Call<HttpResultJuHe> getJuheResult(@QueryMap Map<String, String> options);
    }

    ///api/v1.0/DeletePrivateContact
    interface PostClickAppInfoParameterJsonBody{
        @Headers({"Content-Type: application/json","Accept: application/json"})
        @POST("DeletePrivateContact")
        Call<HttpResult> getJuheResult(@Body HttpRequest request);
    }
}

让我们来看下测试请求http://apis.juhe.cn/mobile/get?phone=13429667914&key=safly的返回结果把:

HttpResultJuHe{resultcode='101', reason='错误的请求KEY!', result='null', error_code='10001'}

PostClickAppInfoServerMap这种方式是构建map集合如下:

  public void postClickAppInfoParameterMap(final MyCallback mCallback) {
        FactoryInters.PostClickAppInfoServerMap server = retrofit.create(FactoryInters.PostClickAppInfoServerMap.class);


        Map<String, String> options = new HashMap<>();
        options.put("phone", "13429667914");
        options.put("key", "safly");

        final Call<HttpResultJuHe> call = server.getJuheResult(options);

        call.enqueue(new Callback<HttpResultJuHe>() {
            @Override
            public void onResponse(final Call<HttpResultJuHe> call, final Response<HttpResultJuHe> response) {
                Log.i(TAG, "response------------>" + response.body().toString());

                retroHttpHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        if (mCallback != null) {
                            mCallback.onSuccess(response.body());

                            if (call != null)
                                call.cancel();
                        }
                    }
                });
            }

            @Override
            public void onFailure(Call<HttpResultJuHe> call, Throwable t) {

                String message = t.getMessage();
                if (mCallback != null) {
                    mCallback.onFailture(message);
                }

            }
        });
    }

postClickAppInfoParameterJsonBody
以下代码是构建请求体如下:

   public void postClickAppInfoParameterJsonBody(final MyCallback mCallback) {
        FactoryInters.PostClickAppInfoParameterJsonBody server = retrofit.create(FactoryInters.PostClickAppInfoParameterJsonBody.class);


        ArrayList<String> contact_ids = new ArrayList<>();
        contact_ids.add("1475920950100");

        HttpRequest httpRequest = new HttpRequest();
        httpRequest.setPhone_num("18612185929");
        httpRequest.setImei("123456789012345");
        httpRequest.setGodin_id("4c59396301ab6274bd7892f0b31df36e");
        httpRequest.setContact_ids(contact_ids);

        final Call<HttpResult> call = server.getJuheResult(httpRequest);
        call.enqueue(new Callback<HttpResult>() {
            @Override
            public void onResponse(final Call<HttpResult> call, final Response<HttpResult> response) {
                Log.i(TAG, "response------------>" + response.body().toString());

                retroHttpHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        if (mCallback != null) {
                            mCallback.onSuccess(response.body());

                            if (call != null)
                                call.cancel();
                        }
                    }
                });
            }
            @Override
            public void onFailure(Call<HttpResult> call, Throwable t) {

                String message = t.getMessage();
                if (mCallback != null) {
                    mCallback.onFailture(message);
                }
            }
        });
    }



———————以下是代码区—————————demo不传了代码直接贴了———————————-

配置文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.godinsec.db" >

    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>



封装Retrofit,内置OkHttp
RetrofitBase

package com.godinsec.db;

import org.apache.http.conn.ssl.AllowAllHostnameVerifier;

import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.concurrent.TimeUnit;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * Created by Safly on 2016/9/13.
 */

public abstract class RetrofitBase {
    private static final String BASEURL = "http://apis.juhe.cn/";
//    private static final String BASEURL = "http://x-phone.cn/api/v1.0/";

    private static final long TIMEOUT = 5 * 1000;

    protected Retrofit retrofit;


    protected RetrofitBase(){
        retrofit = new Retrofit.Builder()
                .baseUrl(BASEURL)
                .client(client())
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
    }

    private OkHttpClient client(){

        LauncherTrust launcherTrust = new LauncherTrust();

        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(TIMEOUT, TimeUnit.MILLISECONDS)
                .readTimeout(TIMEOUT,TimeUnit.MILLISECONDS)
                .sslSocketFactory(sslSocketFactory(launcherTrust),launcherTrust)
                .hostnameVerifier(new AllowAllHostnameVerifier())
                .build();
        return okHttpClient;
    }

    private SSLSocketFactory sslSocketFactory(LauncherTrust launcherTrust){

        try {
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null,new TrustManager[]{launcherTrust},new SecureRandom());
            return sslContext.getSocketFactory();
        } catch (NoSuchAlgorithmException | KeyManagementException e) {
            e.printStackTrace();
        }
        return null;
    }

    static class LauncherTrust implements X509TrustManager {

        @Override
        public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

        }
        @Override
        public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

        }
        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }
    }

}

RetrofitManger

package com.godinsec.db;

import android.os.Handler;
import android.os.Looper;
import android.util.Log;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import rx.Observable;


/**
 * {"resultcode":"101","reason":"错误的请求KEY!","result":null,"error_code":10001}
 */

public class RetrofitManger extends RetrofitBase {

    private static final String TAG = "RetrofitManger";
    private Handler retroHttpHandler;

    private RetrofitManger() {
        super();
        this.retroHttpHandler = new Handler(Looper.getMainLooper());
    }

    private static final class Factory {
        private static final RetrofitManger instance = new RetrofitManger();
    }

    public static RetrofitManger getInstance() {
        return Factory.instance;
    }

    interface MyCallback {
        void onSuccess(HttpResultJuHe result);

        void onFailture(String error);

        void onSuccess(HttpResult result);
    }


    /**
     * 添加参数方式
     */
    public void postClickAppInfoParameter(final MyCallback mCallback) {
        FactoryInters.PostClickAppInfoServerParameter server = retrofit.create(FactoryInters.PostClickAppInfoServerParameter.class);

        final Call<HttpResultJuHe> call = server.getJuheResult("13429667914", "safly");
        call.enqueue(new Callback<HttpResultJuHe>() {
            @Override
            public void onResponse(final Call<HttpResultJuHe> call, final Response<HttpResultJuHe> response) {
                Log.i(TAG, "response------------>" + response.body().toString());
                retroHttpHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        if (mCallback != null) {
                            mCallback.onSuccess(response.body());

                            if (call != null)
                                call.cancel();
                        }
                    }
                });

            }
            @Override
            public void onFailure(Call<HttpResultJuHe> call, Throwable t) {

                String message = t.getMessage();
                if (mCallback != null) {
                    mCallback.onFailture(message);
                }

            }
        });
    }

    /**
     * map方式
     */
    public void postClickAppInfoParameterMap(final MyCallback mCallback) {
        FactoryInters.PostClickAppInfoServerMap server = retrofit.create(FactoryInters.PostClickAppInfoServerMap.class);


        Map<String, String> options = new HashMap<>();
        options.put("phone", "13429667914");
        options.put("key", "safly");

        final Call<HttpResultJuHe> call = server.getJuheResult(options);

        call.enqueue(new Callback<HttpResultJuHe>() {
            @Override
            public void onResponse(final Call<HttpResultJuHe> call, final Response<HttpResultJuHe> response) {
                Log.i(TAG, "response------------>" + response.body().toString());

                retroHttpHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        if (mCallback != null) {
                            mCallback.onSuccess(response.body());

                            if (call != null)
                                call.cancel();
                        }
                    }
                });
            }

            @Override
            public void onFailure(Call<HttpResultJuHe> call, Throwable t) {

                String message = t.getMessage();
                if (mCallback != null) {
                    mCallback.onFailture(message);
                }

            }
        });
    }


    /**构建请求体方式
     * {"phone_num": "18612185929", "imei": "123456789012345", "godin_id": "4c59396301ab6274bd7892f0b31df36e", "contact_ids": ["1475920950100"]}
     */
    public void postClickAppInfoParameterJsonBody(final MyCallback mCallback) {
        FactoryInters.PostClickAppInfoParameterJsonBody server = retrofit.create(FactoryInters.PostClickAppInfoParameterJsonBody.class);


        ArrayList<String> contact_ids = new ArrayList<>();
        contact_ids.add("1475920950100");

        HttpRequest httpRequest = new HttpRequest();
        httpRequest.setPhone_num("18612185929");
        httpRequest.setImei("123456789012345");
        httpRequest.setGodin_id("4c59396301ab6274bd7892f0b31df36e");
        httpRequest.setContact_ids(contact_ids);

        final Call<HttpResult> call = server.getJuheResult(httpRequest);
        call.enqueue(new Callback<HttpResult>() {
            @Override
            public void onResponse(final Call<HttpResult> call, final Response<HttpResult> response) {
                Log.i(TAG, "response------------>" + response.body().toString());

                retroHttpHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        if (mCallback != null) {
                            mCallback.onSuccess(response.body());

                            if (call != null)
                                call.cancel();
                        }
                    }
                });
            }

            @Override
            public void onFailure(Call<HttpResult> call, Throwable t) {

                String message = t.getMessage();
                if (mCallback != null) {
                    mCallback.onFailture(message);
                }
            }
        });
    }
}

接口文件FactoryInters

package com.godinsec.db;

import java.util.Map;

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
import rx.Observable;

/**
 * Created by Safly on 2016/11/2.
 * {"resultcode":"101","reason":"错误的请求KEY!","result":null,"error_code":10001}
 *
 * http://apis.juhe.cn/mobile/get?phone=13429667914&key=safly
 *
 */

public interface FactoryInters {

    interface PostClickAppInfoServerParameter {
        @GET("mobile/get")
        Call<HttpResultJuHe> getJuheResult(@Query("phone") String phone,
                                                @Query("key") String key);
    }

    interface PostClickAppInfoServerMap {
        @GET("mobile/get")
        Call<HttpResultJuHe> getJuheResult(@QueryMap Map<String, String> options);
    }

    ///api/v1.0/DeletePrivateContact
    interface PostClickAppInfoParameterJsonBody{
        @Headers({"Content-Type: application/json","Accept: application/json"})
        @POST("DeletePrivateContact")
        Call<HttpResult> getJuheResult(@Body HttpRequest request);
    }
}


让我们来看下测试请求http://apis.juhe.cn/mobile/get?phone=13429667914&key=safly的返回结果把:

HttpResultJuHe{resultcode='101', reason='错误的请求KEY!', result='null', error_code='10001'}

对应的HttpResultJuHe

package com.godinsec.db;

/**
 * {"resultcode":"101","reason":"错误的请求KEY!","result":null,"error_code":10001}
 */

public final class HttpResultJuHe {
    private String resultcode;
    private String reason;
    private String result;
    private String error_code;

    public HttpResultJuHe(String resultcode, String reason, String result, String error_code) {
        this.resultcode = resultcode;
        this.reason = reason;
        this.result = result;
        this.error_code = error_code;
    }

    public HttpResultJuHe() {
    }

    public String getResultcode() {
        return resultcode;
    }

    public void setResultcode(String resultcode) {
        this.resultcode = resultcode;
    }

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }

    public String getError_code() {
        return error_code;
    }

    public void setError_code(String error_code) {
        this.error_code = error_code;
    }

    @Override
    public String toString() {
        return "HttpResultJuHe{" +
                "resultcode='" + resultcode + '\'' +
                ", reason='" + reason + '\'' +
                ", result='" + result + '\'' +
                ", error_code='" + error_code + '\'' +
                '}';
    }
}


封装请求体
http://x-phone.cn/api/v1.0/DeletePrivateContact

HttpResult{head=Head{statuscode='000009', statusmsg='device and user not match'}}

对应的HttpRequest

package com.godinsec.db;

import java.util.ArrayList;

/**
 * 删除联系人封装的请求体
 * {"phone_num": "18612185929", "imei": "123456789012345", "godin_id": "4c59396301ab6274bd7892f0b31df36e", "contact_ids": ["1475920950100"]}
 */
public class HttpRequest {
    private String phone_num;
    private String imei;
    private String godin_id;
    private ArrayList<String> contact_ids;

    public ArrayList<String> getContact_ids() {
        return contact_ids;
    }

    public void setContact_ids(ArrayList<String> contact_ids) {
        this.contact_ids = contact_ids;
    }

    public String getPhone_num() {
        return phone_num;
    }

    public void setPhone_num(String phone_num) {
        this.phone_num = phone_num;
    }

    public String getImei() {
        return imei;
    }

    public void setImei(String imei) {
        this.imei = imei;
    }

    public String getGodin_id() {
        return godin_id;
    }

    public void setGodin_id(String godin_id) {
        this.godin_id = godin_id;
    }

    @Override
    public String toString() {
        return "HttpRequest{" +
                "phone_num='" + phone_num + '\'' +
                ", imei='" + imei + '\'' +
                ", godin_id='" + godin_id + '\'' +
                ", contact_ids=" + contact_ids +
                '}';
    }
}

对应的封装请求参数HttpRequest

package com.godinsec.db;

import java.util.ArrayList;

/**
 * 删除联系人封装的请求体
 * {"phone_num": "18612185929", "imei": "123456789012345", "godin_id": "4c59396301ab6274bd7892f0b31df36e", "contact_ids": ["1475920950100"]}
 */
public class HttpRequest {
    private String phone_num;
    private String imei;
    private String godin_id;
    private ArrayList<String> contact_ids;

    public ArrayList<String> getContact_ids() {
        return contact_ids;
    }

    public void setContact_ids(ArrayList<String> contact_ids) {
        this.contact_ids = contact_ids;
    }

    public String getPhone_num() {
        return phone_num;
    }

    public void setPhone_num(String phone_num) {
        this.phone_num = phone_num;
    }

    public String getImei() {
        return imei;
    }

    public void setImei(String imei) {
        this.imei = imei;
    }

    public String getGodin_id() {
        return godin_id;
    }

    public void setGodin_id(String godin_id) {
        this.godin_id = godin_id;
    }

    @Override
    public String toString() {
        return "HttpRequest{" +
                "phone_num='" + phone_num + '\'' +
                ", imei='" + imei + '\'' +
                ", godin_id='" + godin_id + '\'' +
                ", contact_ids=" + contact_ids +
                '}';
    }
}

最后看主界面MainActivity

package com.godinsec.db;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.util.ArrayList;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RetrofitManger.getInstance().postClickAppInfoParameter(new RetrofitManger.MyCallback() {
            @Override
            public void onSuccess(HttpResultJuHe result) {
                Log.i("MainActivity", "response------------>" + result.toString());
            }

            @Override
            public void onFailture(String error) {

            }

            @Override
            public void onSuccess(HttpResult result) {

            }
        });

        RetrofitManger.getInstance().postClickAppInfoParameterMap(new RetrofitManger.MyCallback() {
            @Override
            public void onSuccess(HttpResultJuHe result) {
                Log.i("MainActivity", "response------------>" + result.toString());
            }

            @Override
            public void onFailture(String error) {

            }

            @Override
            public void onSuccess(HttpResult result) {

            }
        });

        RetrofitManger.getInstance().postClickAppInfoParameterJsonBody(new RetrofitManger.MyCallback() {
            @Override
            public void onSuccess(HttpResultJuHe result) {

            }

            @Override
            public void onFailture(String error) {

            }

            @Override
            public void onSuccess(HttpResult result) {
                Log.i("MainActivity", "response------------>" + result.toString());
            }
        });



    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值