封装网络请求框架

总体流程 定接口请求—》失败成功方法    每一层都要实现接口写逻辑

1.先定义最外层接口Get和Post可以自己添加

public interface IHttpProcessor {

    //这是工作的接口
    //Post
    void Post(String url, Map<String,Object> params,ICallBack callBack);
    //Get
    void Get(String url, Map<String,Object> params,ICallBack callBack);
    //Del
    //Update
}


2.在定义一个失败成功接口

interface ICallBack {
    //这里代表网络请求的行为
    void onSuccess(String result);
    void onFailure(String erren);
}

3.然后从成功开始解析字符串 失败的话就不用写了因为不需要解析

//这些就是网络请求的规范
//这个目的就是将网络层的数据String转换成Result这个泛型   达到成功解析的效果  当然retrofit底层已经封装好了
public abstract class HttpCallback<Result> implements ICallBack {
    @Override
    public void onSuccess(String result) {
        Gson gson = new Gson();
        Class<?> cls=analysisClazInfo(this);
        Result objectResult = (Result) gson.fromJson(result, cls);
        onSuccess(objectResult);
    }
    //这是为了将转变之后的返回值数据直接传到上面去    这是为了能够成功的将String类型数据转换成Result类型
    public abstract void onSuccess(Result result);

    public static Class<?> analysisClazInfo(Object object){
        Log.d("aaaaaa", "analysisClazInfo: "+object.getClass().toString());
        //得到object的超类
        Type genericSuperclass = object.getClass().getGenericSuperclass();
        Log.d("aaaaaa", "onSuccess: "+genericSuperclass.toString());
        //将超类强转成参数化类型得到实际真正的类型    整个继承类的类名列表
        Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass).getActualTypeArguments();
        Log.d("aaaaaa", "onSuccess: "+actualTypeArguments[0]);
        return (Class<?>) actualTypeArguments[0];
    }
}

4.然后写Get和Post这层代码         这一层是用的代理模式

//这一层就是代理层  将数据传递到真正工作的类     

//这里是代理层   为了将View层直接访问工作接口
public class HttpProxy implements IHttpProcessor {

    //公共需要的东西
    private static IHttpProcessor mIHttpProcessor = null;
    private Map<String,Object> mParams = null;
    private HttpProxy(){
        mParams=new HashMap<>();
    }
    //这只是个单利
    private static HttpProxy httpProxy;
    public static HttpProxy obtain(){
        synchronized (HttpProxy.class){
            if(httpProxy==null){
                httpProxy=new HttpProxy();
            }
        }
        return httpProxy;
    }
    public static void init(IHttpProcessor httpProcessor){
        mIHttpProcessor=httpProcessor;
    }


    @Override
    public void Post(String url, Map<String, Object> params, ICallBack callBack) {
        final String finalUrl = appendParams(url, params);
        mIHttpProcessor.Post(finalUrl,params,callBack);
    }

    @Override
    public void Get(String url, Map<String, Object> params, ICallBack callBack) {
        final String finalUrl = appendParams(url, params);
        mIHttpProcessor.Get(finalUrl,params,callBack);
    }
    //这是接口后面的字符串的拼接
    public static String appendParams(String url,Map<String,Object> params){
        if (params == null || params.isEmpty()){
            return url;
        }
        StringBuilder stringBuilder = new StringBuilder(url);
        //如果这个Url查到?符号的指数是零 那么表示没有就添加
        if (stringBuilder.indexOf("?")<=0) {
             stringBuilder.append("?");
        }else {//有的话就判断Url是不是?结尾的  如果不是就添加&字符
            if(!stringBuilder.toString().endsWith("?")){
                stringBuilder.append("&");
            }
        }
        for (Map.Entry<String,Object> entry : params.entrySet()) {
            stringBuilder.append(entry.getKey()).append("=").append(entry.getValue().toString());
        }
        return stringBuilder.toString();
    }
    //Url不允许有空格等字符,如果参数值有空格,需要此方法转换
    private static String encode(String str){
        try {
            return URLEncoder.encode(str,"utf-8");
        } catch (UnsupportedEncodingException e) {
            //针对不支持的编码时报错,utf-8应该支持
            Log.d("aaaaaa", "encode: "+e.toString());
            throw new RuntimeException(e);
        }
    }
}

5.最后一个就是工作类   就是从上面的那个类传递过来的        这里的话可以换框架

public class OkhttpProcessor implements IHttpProcessor {
    private OkHttpClient mOkHttpClient;
    private Handler myHandler;
    public OkhttpProcessor(){
        mOkHttpClient = new OkHttpClient();
        myHandler = new Handler();
    }
    @Override
    public void Post(String url, Map<String, Object> params, final ICallBack callBack) {
        Log.d("aaaaaa", "Post: ");
        RequestBody requestBody = appendBody(params);
        Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .header("User-Agent", "a")//这句话必须加  不然会报错  因为当时okhttp开发的时候没有考虑到中文服务器和编解码   后面的a代表中国的
                .build();
        mOkHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                //运行在主线程将数据传递出去
                myHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        callBack.onFailure(e.toString());
                    }
                });

            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                if(response.isSuccessful()){
                    final String result = response.body().string();
                    //运行在主线程将数据传递出去
                    myHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            callBack.onSuccess(result);
                        }
                    });
                }else {
                    //运行在主线程将数据传递出去
                    myHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            callBack.onFailure(response.toString());
                        }
                    });
                }
            }
        });
    }

    @Override
    public void Get(String url, Map<String, Object> params, ICallBack callBack) {

    }
    //body拼接
    private RequestBody appendBody(Map<String,Object> params){
        FormBody.Builder body = new FormBody.Builder();
        if(params == null || params.isEmpty()){
            return body.build();
        }
        for (Map.Entry<String,Object> entry:params.entrySet()) {
            body.add(entry.getKey(),entry.getValue().toString());
        }
        return body.build();
    }
}

6.gson的话就是实体类  你可以自己创建我这边也给你打包好了    一并奉上

public class gson {

    /**
     * postid : PHOT24LDT000100A
     * series :
     * clientadurl :
     * desc : 4月16日上午,四川达州的天空黑压压的,早晨9点却光线昏暗。达州人的朋友圈被黑云刷爆。
     * datatime : 2017-09-20 13:37:29
     * createdate : 2017-04-16 14:23:34
     * relatedids : []
     * scover : http://img3.cache.netease.com/photo/0001/2017-04-16/s_CI5B3HLG00AP0001.jpg
     * autoid :
     * url : http://news.163.com/photoview/00AP0001/2250173.html
     * creator : 耿旭娜
     * reporter :
     * photos : [{"timgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/t_CI5B3HLD00AP0001.jpg","photohtml":"http://news.163.com/photoview/00AP0001/2250173.html#p=CI5B3HLD00AP0001","newsurl":"#","squareimgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/400x400_CI5B3HLD00AP0001.jpg","cimgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/c_CI5B3HLD00AP0001.jpg","imgtitle":"","simgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/s_CI5B3HLD00AP0001.jpg","note":"4月16日上午,四川达州的天空黑压压的,早晨9点却光线昏暗。达州人的朋友圈被黑云刷爆。(来源:四川日报)","photoid":"CI5B3HLD00AP0001","imgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/CI5B3HLD00AP0001.jpg"},{"timgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/t_CI5B3HLE00AP0001.jpg","photohtml":"http://news.163.com/photoview/00AP0001/2250173.html#p=CI5B3HLE00AP0001","newsurl":"#","squareimgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/400x400_CI5B3HLE00AP0001.jpg","cimgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/c_CI5B3HLE00AP0001.jpg","imgtitle":"","simgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/s_CI5B3HLE00AP0001.jpg","note":"网友们纷纷调侃:这不是晚上么?有网友说:\u201c白天不懂夜的黑\u201d(来源:四川日报)","photoid":"CI5B3HLE00AP0001","imgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/CI5B3HLE00AP0001.jpg"},{"timgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/t_CI5B3HLF00AP0001.jpg","photohtml":"http://news.163.com/photoview/00AP0001/2250173.html#p=CI5B3HLF00AP0001","newsurl":"#","squareimgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/400x400_CI5B3HLF00AP0001.jpg","cimgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/c_CI5B3HLF00AP0001.jpg","imgtitle":"","simgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/s_CI5B3HLF00AP0001.jpg","note":"达州市气象台发布天气预报:16日有雷阵雨,雨量中到大雨,局地暴雨。(来源:四川日报)","photoid":"CI5B3HLF00AP0001","imgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/CI5B3HLF00AP0001.jpg"},{"timgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/t_CI5B3HLG00AP0001.jpg","photohtml":"http://news.163.com/photoview/00AP0001/2250173.html#p=CI5B3HLG00AP0001","newsurl":"#","squareimgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/400x400_CI5B3HLG00AP0001.jpg","cimgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/c_CI5B3HLG00AP0001.jpg","imgtitle":"","simgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/s_CI5B3HLG00AP0001.jpg","note":"4月16日上午,四川达州的天空黑压压的,早晨9点却光线昏暗。达州人的朋友圈被黑云刷爆。(来源:四川日报)","photoid":"CI5B3HLG00AP0001","imgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/CI5B3HLG00AP0001.jpg"},{"timgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/t_CI5B3HLH00AP0001.jpg","photohtml":"http://news.163.com/photoview/00AP0001/2250173.html#p=CI5B3HLH00AP0001","newsurl":"#","squareimgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/400x400_CI5B3HLH00AP0001.jpg","cimgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/c_CI5B3HLH00AP0001.jpg","imgtitle":"","simgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/s_CI5B3HLH00AP0001.jpg","note":"网友们纷纷调侃:这不是晚上么?有网友说:\u201c白天不懂夜的黑\u201d(来源:四川日报)","photoid":"CI5B3HLH00AP0001","imgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/CI5B3HLH00AP0001.jpg"},{"timgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/t_CI5B3HLI00AP0001.jpg","photohtml":"http://news.163.com/photoview/00AP0001/2250173.html#p=CI5B3HLI00AP0001","newsurl":"#","squareimgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/400x400_CI5B3HLI00AP0001.jpg","cimgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/c_CI5B3HLI00AP0001.jpg","imgtitle":"","simgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/s_CI5B3HLI00AP0001.jpg","note":"达州市气象台发布天气预报:16日有雷阵雨,雨量中到大雨,局地暴雨。(来源:四川日报)","photoid":"CI5B3HLI00AP0001","imgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/CI5B3HLI00AP0001.jpg"},{"timgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/t_CI5B3HLJ00AP0001.jpg","photohtml":"http://news.163.com/photoview/00AP0001/2250173.html#p=CI5B3HLJ00AP0001","newsurl":"#","squareimgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/400x400_CI5B3HLJ00AP0001.jpg","cimgurl":"http://img3.cache.netease.com/photo/0001/2017-04-16/c_CI5B3HLJ00AP0001.jpg","imgtitle":"","simgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/s_CI5B3HLJ00AP0001.jpg","note":"4月16日上午,四川达州的天空黑压压的,早晨9点却光线昏暗。达州人的朋友圈被黑云刷爆。(来源:四川日报)","photoid":"CI5B3HLJ00AP0001","imgurl":"http://img4.cache.netease.com/photo/0001/2017-04-16/CI5B3HLJ00AP0001.jpg"}]
     * setname : 四川达州雨前黑云压城 白昼如夜刷爆朋友圈
     * neteasecode :
     * cover : http://img4.cache.netease.com/photo/0001/2017-04-16/CI5B3HLG00AP0001.jpg
     * hideAd : false
     * commenturl : http://comment.news.163.com/photoview_bbs/PHOT24LDT000100A.html
     * source : 四川日报
     * settag : 四川,黑云,白昼
     * boardid : photoview_bbs
     * tcover : http://img3.cache.netease.com/photo/0001/2017-04-16/t_CI5B3HLG00AP0001.jpg
     * imgsum : 7
     */

    private String postid;
    private String series;
    private String clientadurl;
    private String desc;
    private String datatime;
    private String createdate;
    private String scover;
    private String autoid;
    private String url;
    private String creator;
    private String reporter;
    private String setname;
    private String neteasecode;
    private String cover;
    private boolean hideAd;
    private String commenturl;
    private String source;
    private String settag;
    private String boardid;
    private String tcover;
    private String imgsum;

    @Override
    public String toString() {
        return "gson{" +
                "postid='" + postid + '\'' +
                ", series='" + series + '\'' +
                ", clientadurl='" + clientadurl + '\'' +
                ", desc='" + desc + '\'' +
                ", datatime='" + datatime + '\'' +
                ", createdate='" + createdate + '\'' +
                ", scover='" + scover + '\'' +
                ", autoid='" + autoid + '\'' +
                ", url='" + url + '\'' +
                ", creator='" + creator + '\'' +
                ", reporter='" + reporter + '\'' +
                ", setname='" + setname + '\'' +
                ", neteasecode='" + neteasecode + '\'' +
                ", cover='" + cover + '\'' +
                ", hideAd=" + hideAd +
                ", commenturl='" + commenturl + '\'' +
                ", source='" + source + '\'' +
                ", settag='" + settag + '\'' +
                ", boardid='" + boardid + '\'' +
                ", tcover='" + tcover + '\'' +
                ", imgsum='" + imgsum + '\'' +
                ", relatedids=" + relatedids +
                ", photos=" + photos +
                '}';
    }

    private List<?> relatedids;
    private List<PhotosBean> photos;

    public String getPostid() {
        return postid;
    }

    public void setPostid(String postid) {
        this.postid = postid;
    }

    public String getSeries() {
        return series;
    }

    public void setSeries(String series) {
        this.series = series;
    }

    public String getClientadurl() {
        return clientadurl;
    }

    public void setClientadurl(String clientadurl) {
        this.clientadurl = clientadurl;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getDatatime() {
        return datatime;
    }

    public void setDatatime(String datatime) {
        this.datatime = datatime;
    }

    public String getCreatedate() {
        return createdate;
    }

    public void setCreatedate(String createdate) {
        this.createdate = createdate;
    }

    public String getScover() {
        return scover;
    }

    public void setScover(String scover) {
        this.scover = scover;
    }

    public String getAutoid() {
        return autoid;
    }

    public void setAutoid(String autoid) {
        this.autoid = autoid;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getCreator() {
        return creator;
    }

    public void setCreator(String creator) {
        this.creator = creator;
    }

    public String getReporter() {
        return reporter;
    }

    public void setReporter(String reporter) {
        this.reporter = reporter;
    }

    public String getSetname() {
        return setname;
    }

    public void setSetname(String setname) {
        this.setname = setname;
    }

    public String getNeteasecode() {
        return neteasecode;
    }

    public void setNeteasecode(String neteasecode) {
        this.neteasecode = neteasecode;
    }

    public String getCover() {
        return cover;
    }

    public void setCover(String cover) {
        this.cover = cover;
    }

    public boolean isHideAd() {
        return hideAd;
    }

    public void setHideAd(boolean hideAd) {
        this.hideAd = hideAd;
    }

    public String getCommenturl() {
        return commenturl;
    }

    public void setCommenturl(String commenturl) {
        this.commenturl = commenturl;
    }

    public String getSource() {
        return source;
    }

    public void setSource(String source) {
        this.source = source;
    }

    public String getSettag() {
        return settag;
    }

    public void setSettag(String settag) {
        this.settag = settag;
    }

    public String getBoardid() {
        return boardid;
    }

    public void setBoardid(String boardid) {
        this.boardid = boardid;
    }

    public String getTcover() {
        return tcover;
    }

    public void setTcover(String tcover) {
        this.tcover = tcover;
    }

    public String getImgsum() {
        return imgsum;
    }

    public void setImgsum(String imgsum) {
        this.imgsum = imgsum;
    }

    public List<?> getRelatedids() {
        return relatedids;
    }

    public void setRelatedids(List<?> relatedids) {
        this.relatedids = relatedids;
    }

    public List<PhotosBean> getPhotos() {
        return photos;
    }

    public void setPhotos(List<PhotosBean> photos) {
        this.photos = photos;
    }

    public static class PhotosBean {
        /**
         * timgurl : http://img3.cache.netease.com/photo/0001/2017-04-16/t_CI5B3HLD00AP0001.jpg
         * photohtml : http://news.163.com/photoview/00AP0001/2250173.html#p=CI5B3HLD00AP0001
         * newsurl : #
         * squareimgurl : http://img4.cache.netease.com/photo/0001/2017-04-16/400x400_CI5B3HLD00AP0001.jpg
         * cimgurl : http://img3.cache.netease.com/photo/0001/2017-04-16/c_CI5B3HLD00AP0001.jpg
         * imgtitle :
         * simgurl : http://img3.cache.netease.com/photo/0001/2017-04-16/s_CI5B3HLD00AP0001.jpg
         * note : 4月16日上午,四川达州的天空黑压压的,早晨9点却光线昏暗。达州人的朋友圈被黑云刷爆。(来源:四川日报)
         * photoid : CI5B3HLD00AP0001
         * imgurl : http://img4.cache.netease.com/photo/0001/2017-04-16/CI5B3HLD00AP0001.jpg
         */

        private String timgurl;
        private String photohtml;
        private String newsurl;
        private String squareimgurl;
        private String cimgurl;
        private String imgtitle;
        private String simgurl;
        private String note;
        private String photoid;
        private String imgurl;

        @Override
        public String toString() {
            return "PhotosBean{" +
                    "timgurl='" + timgurl + '\'' +
                    ", photohtml='" + photohtml + '\'' +
                    ", newsurl='" + newsurl + '\'' +
                    ", squareimgurl='" + squareimgurl + '\'' +
                    ", cimgurl='" + cimgurl + '\'' +
                    ", imgtitle='" + imgtitle + '\'' +
                    ", simgurl='" + simgurl + '\'' +
                    ", note='" + note + '\'' +
                    ", photoid='" + photoid + '\'' +
                    ", imgurl='" + imgurl + '\'' +
                    '}';
        }

        public String getTimgurl() {
            return timgurl;
        }

        public void setTimgurl(String timgurl) {
            this.timgurl = timgurl;
        }

        public String getPhotohtml() {
            return photohtml;
        }

        public void setPhotohtml(String photohtml) {
            this.photohtml = photohtml;
        }

        public String getNewsurl() {
            return newsurl;
        }

        public void setNewsurl(String newsurl) {
            this.newsurl = newsurl;
        }

        public String getSquareimgurl() {
            return squareimgurl;
        }

        public void setSquareimgurl(String squareimgurl) {
            this.squareimgurl = squareimgurl;
        }

        public String getCimgurl() {
            return cimgurl;
        }

        public void setCimgurl(String cimgurl) {
            this.cimgurl = cimgurl;
        }

        public String getImgtitle() {
            return imgtitle;
        }

        public void setImgtitle(String imgtitle) {
            this.imgtitle = imgtitle;
        }

        public String getSimgurl() {
            return simgurl;
        }

        public void setSimgurl(String simgurl) {
            this.simgurl = simgurl;
        }

        public String getNote() {
            return note;
        }

        public void setNote(String note) {
            this.note = note;
        }

        public String getPhotoid() {
            return photoid;
        }

        public void setPhotoid(String photoid) {
            this.photoid = photoid;
        }

        public String getImgurl() {
            return imgurl;
        }

        public void setImgurl(String imgurl) {
            this.imgurl = imgurl;
        }
    }
}

7.在使用前的话还需要初始化一下     创建一个类在app启动时知道执行里面的方法

public class MyAppcation extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //代理层和框架层建立连接
        HttpProxy.init(new OkhttpProcessor());
    }
}

8.然后在你的清单文件里面添加这一句



9.然后就可以正常使用   

public class MainActivity extends AppCompatActivity {
    private String url="http://c.3g.163.com/photo/api/set/0001%2F2250173.json";
    private HashMap<String,Object> params=new HashMap<String,Object>();
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView=findViewById(R.id.tv_show);


    }
    public void onClick(View view) {

        HttpProxy.obtain().Post(url,params,new HttpCallback<gson>(){
            @Override
            public void onFailure(String erren) {
                Log.d("aaaaaa", "onFailure: "+erren.toString());
            }

            @Override
            public void onSuccess(gson result) {
                textView.setText(result.toString());
            }
        });
    }
}


猜你喜欢

转载自blog.csdn.net/qq_15059163/article/details/80473989