Android OKhttp 封装get, post,put ,postjson,files等访问形式

本文介绍OkHttp在Android开发中的应用,包括在Android Studio中的配置与使用方法,以及作者分享的封装文件,涉及GET请求、POST请求、JSON处理、文件上传等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

移动端开发工程师数目庞大,移动开发中网络访问是必不可少的环节;支持安卓访问网络的框架有很多。okhttp 也是现在比较常用的框架,它的封装性比较强,也支持多中参数结构的访问。

今天主要说两个点  :1,,okhttp的使用 (Android studio中)

                                   2,分享本人一直在用的封装文件。

 

一,

    android studio中的使用:

          注:如果您使用的eclipse 或者 无法获取 google提供的库 可以选择下载  jar包导入使用  效果一样。

          下载地址:https://download.youkuaiyun.com/download/qq_36355271/10819313

                             https://download.youkuaiyun.com/download/qq_36355271/10819240

 

首先 as 在使用okhttp 的第一步  导入工具库:

  如下图  导入 

compile 'com.squareup.okhttp3:okhttp:3.6.0'
compile 'com.squareup.okio:okio:1.11.0'

  然后编译完成后即可

然后是我的 网络请求时的使用:

  下面方法是 get 方法的实例;

public OkHttpHelper okHttpHelper=new OkHttpHelper();
public void Http_(){
    String url= Sapo_Http.http_url+Sapo_Http.Login;
    okHttpHelper.get(url, null, new SpotsCallBack(context) {
        @Override
        public void onSuccess(Response response, Object o) {
            try {  //请求成功
                JSONObject jb=new JSONObject(o.toString());
                if(jb.getInt("code")==0){
                    UserTable ub=new UserTable();
                    ub.setNames(jb.getString("username"));
                    ub.setOrganCode(jb.getString("OrganCode"));
                    ub.setIds(jb.getString("UserId"));
                    ub.setPassword(password.getText().toString().trim());
                    if(ub.save()){
                        Intent in=new Intent(context,MainActivity.class);
                        startActivity(in);
                        finish();
                    }else {
                        Toast.makeText(context,"保存失败",Toast.LENGTH_SHORT).show();
                    }
                }else {
                    Toast.makeText(context,jb.getString("msg"),Toast.LENGTH_SHORT).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onError(Response response, int code, Exception e) {
            super.onError(response, code, e);  //请求失败回调
            Toast.makeText(context,"请检查网络",Toast.LENGTH_SHORT).show();
        }
    });

二,然后是这个方法用到的依赖工具文件:

  1,加载进度+异步监听 文件

public abstract class SpotsCallBack<T> extends BaseCallback<T> {


    private Context mContext;

    private SpotsDialog mDialog;

    public SpotsCallBack(Context context){

        mContext = context;

        initSpotsDialog();
    }



    private  void initSpotsDialog(){

        mDialog = new SpotsDialog(mContext,"拼命加载中...");

    }

    public  void showDialog(){
        mDialog.show();
    }

    public  void dismissDialog(){
        mDialog.dismiss();
    }


    public void setLoadMessage(int resId){
        mDialog.setMessage(mContext.getString(resId));
    }

    @Override
    public void onError(Response response, int code, Exception e) {
        dismissDialog();
    }

    @Override
    public void onFailure(Request request, Exception e) {
        dismissDialog();
    }

    @Override
    public void onBeforeRequest(Request request) {

        showDialog();
    }

    @Override
    public void onResponse(Response response) {
        dismissDialog();
    }
}

2,okhttp 封装文件   :

     包括 get post,postjson  postfiles等  直接调用传入相关参数即可:

public class OkHttpHelper {

    public static final String TAG = "OkHttpHelper";

    private static OkHttpHelper mInstance;//单例模式
    private OkHttpClient mHttpClient;
    private Gson mGson;
    public static final MediaType JSON_ = MediaType.parse("application/json; charset=utf-8");
    private Handler mHandler;


    static {
        mInstance = new OkHttpHelper();
    }

    public OkHttpHelper(){

        mHttpClient = new OkHttpClient();
        //设置几个超时时间
        mHttpClient = new OkHttpClient.Builder()//构建器
                .connectTimeout(1000, TimeUnit.SECONDS)//连接超时
                .writeTimeout(1000, TimeUnit.SECONDS)//写入超时
                .readTimeout(1000, TimeUnit.SECONDS)//读取超时
                .build();
        mGson = new Gson();
        mHandler = new Handler(Looper.getMainLooper());

    }

    ;

    /**
     * @return 唯一的OkHttpHelper对象
     */
    public static OkHttpHelper getInstance() {
        return mInstance;
    }

    /**
     * @param url      url
     * @param callback 自定义的callback
     */
    public void get(String url, String hander, BaseCallback callback) {


        Request request = buildGetRequest(url, hander);

        request(request, callback);

    }

    /**
     * @param url      请求的url地址
     * @param param    封装的参数
     * @param callback 自定义的callback
     */
    public void post(String url, String hander, Map<String, String> param, BaseCallback callback) {

        Request request = buildPostRequest(url, hander, param);
        request(request, callback);
    }

    public void postJson(String url, String hander, String paramJson, BaseCallback callback) {

        Request request = buildPostRequestJson(url, hander, paramJson);
        request(request, callback);
    }

    /**
     * 请求网络
     *
     * @param request
     * @param callback
     */

    public void request(final Request request, final BaseCallback callback) {

        callback.onBeforeRequest(request);

        mHttpClient.newCall(request).enqueue(new Callback() {

            @Override
            public void onFailure(Call call, IOException e) {
                callback.onFailure(request, e);
                if (request.body() == null) {
                    callbackError(callback, null, 404, null);
                    // callback.onError(null,404,new Exception());
                } else {
                    callbackError(callback, null, 404, null);
                }
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                callback.onResponse(response);

                if (response.isSuccessful()) {
                    String resultStr = response.body().string();
                    Log.d(TAG, "result=" + resultStr);

                    if (callback.mType == String.class) {
                        callbackSuccess(callback, response, resultStr);
                    } else {
                        try {
//                            Object obj = mGson.fromJson(resultStr, callback.mType);
                            callbackSuccess(callback, response, resultStr);
                        } catch (JsonParseException e) { // Json解析的错误
                            callback.onError(response, -1, e);
                        }
                    }
                } else {
                    //callback.onError(response,response.code(),new Exception());
                    callbackError(callback, response, -1, null);
                }
            }
        });


    }


    public static String getFilePath(final Context context, final Uri uri ) {
        if ( null == uri ) return null;

        final String scheme = uri.getScheme();
        String data = null;

        if ( scheme == null )
            data = uri.getPath();
        else if ( ContentResolver.SCHEME_FILE.equals( scheme ) ) {
            data = uri.getPath();
        } else if ( ContentResolver.SCHEME_CONTENT.equals( scheme ) ) {
            Cursor cursor = context.getContentResolver().query( uri, new String[] { MediaStore.Images.ImageColumns.DATA }, null, null, null );
            if ( null != cursor ) {
                if ( cursor.moveToFirst() ) {
                    int index = cursor.getColumnIndex( MediaStore.Images.ImageColumns.DATA );
                    if ( index > -1 ) {
                        data = cursor.getString( index );
                    }
                }
                cursor.close();
            }
        }
        return data;
    }

    public void post_upLoadFileduo(Context context, String url, List<pic> list_pic, BaseCallback callback) {

//        Request request = buildPostRequestJson(url,hander,paramJson);
//        request(request,callback);
        upLoadFile(context,url, list_pic, callback);
    }

    public void post_upLoadFile(Context context,String url, String filename, BaseCallback callback) {

//        Request request = buildPostRequestJson(url,hander,paramJson);
//        request(request,callback);
        upLoadFileduo(context,url, filename, callback);
    }

    private static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("application/x-www-form-urlencoded; charset=utf-8");//mdiatype 这个需要和服务端保持一致

    /**
     * 上传文件
     *
     * @param actionUrl 接口地址
     */
    public <T> void upLoadFile(Context context,String actionUrl, List<pic> list_pic, final BaseCallback<T> callBack) {
        callBack.onBeforeRequest(null);
        String requestUrl = actionUrl;
        //创建File

        //创建RequestBody
       // RequestBody body = RequestBody.create(MEDIA_TYPE_MARKDOWN, file);
        MultipartBody.Builder builder = new MultipartBody.Builder();
        builder.setType(MultipartBody.FORM);
        //builder.addFormDataPart("1",file);
        for (int i=0;i<list_pic.size()-1;i++){
            if(list_pic.get(i).getType1()==1) {
//            File file = new File(list_pic.get(i).getUill());
                File file = CompressHelper.getDefault(context).compressToFile(new File(list_pic.get(i).getUill()));
                builder.addFormDataPart("file", file.getName(), RequestBody.create

                        (MediaType.parse("application/octet-stream"), file));
            }
        }
        //文件...参数name指的是请求路径中所接受的参数...如果路径接收参数键值是fileeeee,s

        //构建
        MultipartBody body = builder.build();

        //创建Request
        final Request request = new Request.Builder().url(requestUrl).post(body).build();
        final Call call = mHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                callBack.onFailure(null, e);
                callbackError(callBack, null, -1, null);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                callBack.onResponse(response);
                if (response.isSuccessful()) {
                    String string = response.body().string();
                    Log.e(TAG, "response ----->" + string);
                    callbackSuccess(callBack, response, string);
                } else {
                    // failedCallBack("上传失败", callBack);
                    callbackError(callBack, response, -1, null);
                }
            }

        });
    }
    /**
     * 上传文件
     *
     * @param actionUrl 接口地址
     */
    public <T> void upLoadFileduo(Context context,String actionUrl, String filename, final BaseCallback<T> callBack) {
        callBack.onBeforeRequest(null);
        String requestUrl = actionUrl;
        //创建File
        File file = CompressHelper.getDefault(context).compressToFile(new File(filename));



        //创建RequestBody
        // RequestBody body = RequestBody.create(MEDIA_TYPE_MARKDOWN, file);
        MultipartBody.Builder builder = new MultipartBody.Builder();
        builder.setType(MultipartBody.FORM);
        //builder.addFormDataPart("1",file);

        //文件...参数name指的是请求路径中所接受的参数...如果路径接收参数键值是fileeeee,

//此处应该改变
        builder.addFormDataPart("file",file.getName(),RequestBody.create

                (MediaType.parse("application/octet-stream"),file));

        //构建
        MultipartBody body = builder.build();

        //创建Request
        final Request request = new Request.Builder().url(requestUrl).post(body).build();
        final Call call = mHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                callBack.onFailure(null, e);
                callbackError(callBack, null, -1, null);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                callBack.onResponse(response);
                if (response.isSuccessful()) {
                    String string = response.body().string();
                    Log.e(TAG, "response ----->" + string);
                    callbackSuccess(callBack, response, string);
                } else {
                    // failedCallBack("上传失败", callBack);
                    callbackError(callBack, response, -1, null);
                }
            }

        });
    }




    private void callbackSuccess(final BaseCallback callback, final Response response, final Object obj) {

        mHandler.post(new Runnable() {
            @Override
            public void run() {
                callback.onSuccess(response, obj);
            }
        });
    }


    private void callbackError(final BaseCallback callback, final Response response, final int code, final Exception e) {

        mHandler.post(new Runnable() {
            @Override
            public void run() {
                callback.onError(response, code, e);
            }
        });
    }


    private Request buildPostRequest(String url, String hander, Map<String, String> params) {

        return buildRequest(url, HttpMethodType.POST, hander, params, null);
    }

    private Request buildPostRequestJson(String url, String hander, String paramsJson) {

        return buildRequest(url, HttpMethodType.POST, hander, null, paramsJson);
    }

    private Request buildGetRequest(String url, String hander) {

        return buildRequest(url, HttpMethodType.GET, hander, null, null);
    }

    private Request buildRequest(String url, HttpMethodType methodType, String hander, Map<String, String> params, String paramsJson) {


        Request.Builder builder = new Request.Builder()
                .url(url);
        if (hander != null) {
            builder.addHeader("Authorization", hander)
                    .addHeader("Content-Type", "application/json");
        } else {
            builder.addHeader("Content-Type", "application/json");
        }
        if (methodType == HttpMethodType.POST) {
            RequestBody body = null;
            if (paramsJson != null) {
                body = RequestBody.create(JSON_, paramsJson);
            } else {
                body = builderFormData(params);
            }

            builder.post(body);
        } else if (methodType == HttpMethodType.GET) {
            builder.get();
        }


        return builder.build();
    }


    private RequestBody builderFormData(Map<String, String> params) {


        MultipartBody.Builder builder = new MultipartBody.Builder();

        if (params != null) {

            for (Map.Entry<String, String> entry : params.entrySet()) {

                builder.addFormDataPart(entry.getKey(), entry.getValue());
            }
        }

        return builder.build();

    }


    enum HttpMethodType {

        GET,
        POST,

    }


}

3 ,访问异步监听文件 :(进度条+监听  SpotsCallBack 继承此文件)

public abstract class BaseCallback <T> {


    public Type mType;

    static Type getSuperclassTypeParameter(Class<?> subclass)
    {
        Type superclass = subclass.getGenericSuperclass();
        if (superclass instanceof Class)
        {
            throw new RuntimeException("Missing type parameter.");
        }
        ParameterizedType parameterized = (ParameterizedType) superclass;
        return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
    }


    public BaseCallback()
    {
//       mType = getSuperclassTypeParameter(getClass());
    }



    public  abstract void onBeforeRequest(Request request);


    public abstract  void onFailure(Request request, Exception e) ;


    /**
     *请求成功时调用此方法
     * @param response
     */
    public abstract  void onResponse(Response response);

    /**
     *
     * 状态码大于200,小于300 时调用此方法
     * @param response
     * @param t
     * @throws IOException
     */
    public abstract void onSuccess(Response response,T t) ;

    /**
     * 状态码400,404,403,500等时调用此方法
     * @param response
     * @param code
     * @param e
     */
    public abstract void onError(Response response, int code,Exception e) ;

}

以上为我常用的安卓 okhttp 封装,使用非常简单,也有注册可读性较强  ,

希望对小伙伴有帮助,,个人开发笔记   ,,若有错误  欢迎留言评论。

 

 

转载请标明出处

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值