搭建http服务器_怎样搭建http服务器「如何搭建http服务器」

  作者

  本文由焕然一璐投稿,博客地点:https://www.apkbus.com/myspaceblog-904275.html

  媒介

  小巴士在文末Debug时间板块有题目哟,欢迎各人积极批评复兴。Android开辟中网络编程是必不可少的,不接入互联网的APP就没有红利可言。废话不多说了,下面请先看Android中网络哀求的进化图:

  

  HttpURLConnection,ApacheHTTPClient,Volley到如今的OKHttp,可谓天外有天,人外有人。为什么OKHttp会这么火呢,信托下面的先容会告诉你答案。

  OKHttp的简介

  起首,给出OKHttp的项目地点:https://github.com/square/okhttp

  Android为我们提供了两种HTTP交互的方式:HttpURLConnection和ApacheHTTPClient,固然两者都支持HTTPS,流的上传和下载,设置超时,IPv6和毗连池,已充足满意我们各种HTTP哀求的需求。但更高效的利用HTTP可以让您的应用运行更快、更节流流量。而OkHttp库就是为此而生。OkHttp是一个高效的HTTP库:

  1.支持SPDY,共享同一个Socket来处理惩罚同一个服务器的全部哀求

  2.假如SPDY不可用,则通过毗连池来镌汰哀求延时

  3.无缝的支持GZIP来镌汰数据流量

  1.缓存相应数据来镌汰重复的网络哀求

  2.一样平常的get哀求

  3.一样平常的post哀求

  4.基于Http的文件上传

  5.文件下载

  6.加载图片

  7.支持哀求回调,直接返回对象、对象聚集

  8.支持session的保持

  OkHttp会从很多常用的毗连题目中主动规复。假如您的服务器设置了多个IP地点,当第一个IP毗连失败的时间,会主动实行下一个IP。OkHttp还处理惩罚了署理服务器题目和SSL握手失败题目。(并发)利用OkHttp无需重写您程序中的网络代码。OkHttp实现了险些和java.net.HttpURLConnection一样的API。假如您用了ApacheHttpClient,则OkHttp也提供了一个对应的okhttp-apache模块。从上面的简单先容中可以知道,固然在编程上面并不会简便很多,但是OKHttp内部的一些功能可以或许资助我们主动完成一些很复杂的操纵,笔者个人以为最大的卖点就是大大节流用户的流量。

  OKHttp的根本利用

  1、在Gradle中引入CardView的依靠库。

  compile'com.squareup.okhttp:okhttp:3.8.0'

  2、OKHttp在利用之前,起首要相识下面几个比力核心的类以及它的功能。

OkHttpClient客户端对象

Request是OkHttp中访问的哀求,Post哀求中必要包罗RequestBody

Builder是辅助类,用于生产对象

Response即OkHttp中的相应,相应中可以得到返回是否乐成,返回数据

MediaType数据范例,用来表明是JSON等一系列格式

RequestBody哀求数据,在Post哀求中用到

搭建http服务器_如何搭建http服务器 搭建http服务器_怎样
搭建http服务器「如何搭建http服务器」 行业资讯

client.newCall(request).execute()是同步的哀求方法

client.newCall(request).enqueue(CallbackcallBack)是异步的哀求方法,但是Callback内里的代码是实行在子线程的,因此不能更新UI。

  3、OKHttp的根本利用步调(以POST方式从服务器取JSON数据为例)

创建OkHttpClient对象,官方文档要求我们最好利用单例模式,在后文对OKHttp举行封装的时间会提到。

假如是post哀求的话,必要通过FormEncodingBuilder创建RequestBody对象,指定必要post传进去的参数。get哀求则不消。

创建Request对象,这个对象是哀求对象,必要指定URL。post哀求的时间必要指定RequestBody对象,get哀求则不消。

调用OkHttpClient的newCall方法,把Request对象传进去,然后实行execute大概enqueue方法,两者的区别在上文已提到。在CallBack中的onResponse方法就可以做你必要做的事。onResponse回调的参数是response,一样平常环境下,比如我们盼望得到返回的字符串,可以通过response.body().string()获取;假如盼望得到返回的二进制字节数组,则调用response.body().bytes();假如你想拿到返回的inputStream,则调用response.body().byteStream()看到这,你大概会奇怪,竟然还能拿到返回的inputStream,看到这个最最少能意识到一点,这里支持大文件下载,有inputStream我们就可以通过IO的方式写文件。不外也阐明一个题目,这个onResponse实行的线程并不是UI线程。简直是的,假如你盼望操纵控件,还是必要利用handler等。

OkHttpClientclient=

newOkHttpClient();RequestBodybody=

newFormEncodingBuilder().add(

"type",

"1").build();

Request

request=

new

Request.Builder().url(Constants.URL_BANNER).post(body).build();client.newCall(

request).enqueue(

newCallback(){@Override

  publicvoidonFailure(Requestrequest,IOExceptione){}@Override

  publicvoidonResponse(Responseresponse)throwsIOException{

  if(response.isSuccessful()){android.os.Messagemsg=newMessage();msg.what=1;msg.obj=response.body().string();mHandler.sendMessage(msg);}}});

  这里只是一个简单post哀求,从服务器获取数据的先容,至于get哀求只不外是去掉RequestBody对象而已。至于怎样向服务器提交数据,可以在认识上面的根本用法之后查阅官方的WIKI(GitHub的先容文档)。

  OKHttp的简单封装

  回顾上面的代码,试想一下假如每次哀求都写这么多重复代码,如许会严峻低落开辟服从,因此必要对OKHttp举行封装。对代码举行封装是我们最为面向对象程序员的根本素养,镌汰重复代码,低落维护难度以及本钱。

  GitHub上也有对OKHttp举行过封装,叫做OKHttpUtils。不外这里我们本身动手,一起来学习一下怎样举行封装。具体的留意点有下面几点:

  1、起首,OKHttp官方要求我们最好用单例模式去利用OKHttpClient类的,因此我们自界说一个OKHttpHelper类,而且利用单例模式。

  2、对get以及post方法举行封装,重要的头脑是把共同的代码抽取出来,比方代码中被抽取出来的request方法。

  3、对外公开一些静态方法,包罗get和post方法等。

搭建http服务器_如何搭建http服务器 搭建http服务器_怎样
搭建http服务器「如何搭建http服务器」 行业资讯

  4、Callback基类,对OKHttp的回调举行封装。这个类用内里有一个type,是方便回调中利用Gson对JSON举行分析的封装。利用Callback的时间只必要在泛型中传入雷同Data、ListData即可以方便地利用JSON。

  5、由于原来的回调不在主线程,因此我们必要利用Handler来将回调放入主线程。

  别的的可以参照代码,有具体解释。

  /***这个类用来辅助OKHttp*/publicclassOkHttpHelper{/***采取单例模式利用OkHttpClient*/privatestaticOkHttpHelpermOkHttpHelperInstance;

  privatestaticOkHttpClientmClientInstance;

  privateHandlermHandler;

  privateGsonmGson;/***单例模式,私有构造函数,构造函数内里举行一些初始化*/privateOkHttpHelper(){mClientInstance=newOkHttpClient();mClientInstance.setConnectTimeout(10,TimeUnit.SECONDS);mClientInstance.setReadTimeout(10,TimeUnit.SECONDS);mClientInstance.setWriteTimeout(30,TimeUnit.SECONDS);mGson=newGson();mHandler=newHandler(Looper.getMainLooper());}/***获取实例**@return*/publicstaticOkHttpHelpergetinstance(){

  if(mOkHttpHelperInstance==null){

  synchronized(OkHttpHelper.class){

  if(mOkHttpHelperInstance==null){mOkHttpHelperInstance=newOkHttpHelper();}}}returnmOkHttpHelperInstance;}/***封装一个request方法,不管post大概get方法中都会用到*/publicvoidrequest(finalRequestrequest,finalBaseCallbackcallback){//在哀求之前所做的事,比如弹出对话框等callback.onRequestBefore();mClientInstance.newCall(request).enqueue(newCallback(){

  @OverridepublicvoidonFailure(Requestrequest,IOExceptione){//返回失败callbackFailure(request,callback,e);}@OverridepublicvoidonResponse(Responseresponse)throwsIOException{

  if(response.isSuccessful()){//返回乐成回调StringresString=response.body().string();

  if(callback.mType==String.class){//假如我们必要返回String范例callbackSuccess(response,resString,callback);}else{//假如返回的是其他范例,则利用Gson去分析try{Objecto=mGson.fromJson(resString,callback.mType);callbackSuccess(response,o,callback);}catch(JsonParseExceptione){e.printStackTrace();callbackError(response,callback,e);}}}else{//返回错误callbackError(response,callback,null);}}});}/***在主线程中实行的回调**@paramresponse*@paramresString*@paramcallback*/privatevoidcallbackSuccess(finalResponseresponse,finalObjecto,finalBaseCallbackcallback){mHandler.post(newRunnable(){

  @Overridepublicvoidrun(){callback.onSuccess(response,o);}});}/***在主线程中实行的回调*@paramresponse*@paramcallback*@parame*/privatevoidcallbackError(finalResponseresponse,finalBaseCallbackcallback,finalExceptione){mHandler.post(newRunnable(){

  @Overridepublicvoidrun(){callback.(response,response.code(),e);}});}/***在主线程中实行的回调*@paramrequest*@paramcallback*@parame*/privatevoidcallbackFailure(finalRequestrequest,finalBaseCallbackcallback,finalExceptione){mHandler.post(newRunnable(){

  @Overridepublicvoidrun(){callback.onFailure(request,e);}});}/***对外公开的get方法**@paramurl*@paramcallback*/publicvoidget(Stringurl,BaseCallbackcallback){Requestrequest=buildRequest(url,null,HttpMethodType.GET);request(request,callback);}/***对外公开的post方法**@paramurl*@paramparams*@paramcallback*/publicvoidpost(Stringurl,MapString,Stringparams,BaseCallbackcallback){Requestrequest=buildRequest(url,params,HttpMethodType.POST);request(request,callback);}/***构建哀求对象**@paramurl*@paramparams*@paramtype*@return*/privateRequestbuildRequest(Stringurl,MapString,Stringparams,HttpMethodTypetype){Request.Builderbuilder=newRequest.Builder();builder.url(url);

  if(type==HttpMethodType.GET){builder.get();}elseif(type==HttpMethodType.POST){builder.post(buildRequestBody(params));}returnbuilder.build();}/***通过Map的键值对构建哀求对象的body**@paramparams*@return*/privateRequestBodybuildRequestBody(MapString,Stringparams){FormEncodingBuilderbuilder=newFormEncodingBuilder();

  if(params!=null){

  for(Map.EntryString,Stringentity:params.entrySet()){builder.add(entity.getKey(),entity.getValue());}}returnbuilder.build();}/***这个罗列用于指明是哪一种提交方式*/enumHttpMethodType{GET,POST}}

  回调的封装

  packagecom.nan.cnshop.http;importcom.google.gson.internal.$Gson$Types;importcom.squareup.okhttp.Request;importcom.squareup.okhttp.Response;importjava.lang.reflect.ParameterizedType;importjava.lang.reflect.Type;/***根本的回调*/publicabstractclassBaseCallbackT{/***type用于方便JSON的分析*/publicTypemType;/***把type转换成对应的类,这里不消看明白也行。**@paramsubclass*@return*/staticTypegetSuperclassTypeParameter(Class?subclass){Typesuperclass=subclass.getGenericSuperclass();

  if(superclassinstanceofClass){

  thrownewRuntimeException("Missingtypeparameter.");}ParameterizedTypeparameterized=(ParameterizedType)superclass;

  return$Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);}/***构造的时间得到type的class*/publicBaseCallback(){mType=getSuperclassTypeParameter(getClass());}/***哀求之前调用*/publicabstractvoidonRequestBefore();

  /***哀求失败调用(网络题目)**@paramrequest*@parame*/publicabstractvoidonFailure(Requestrequest,Exceptione);

  /***哀求乐成而且没有错误的时间调用**@paramresponse*@paramt*/publicabstractvoidonSuccess(Responseresponse,Tt);

  /***哀求乐成但是有错误的时间调用,比方Gson分析错误等**@paramresponse*@paramerrorCode*@parame*/publicabstractvoid(Responseresponse,interrorCode,Exceptione);}OKHttp封装之后的利用

  如下面的代码所示。起首得到OkHttpHelper的单例,然后调用get方法就可以了。由于继承了Gson,因此必要在BaseCallback的泛型中传入JSON对应的数据范例,笔者这里是ListBanner。末了在onSuccess方法中做我们想要做的事变就可以了。

  mHttpHelper=OkHttpHelper.getinstance();mHttpHelper.get(Constants.URL_BANNER,newBaseCallbackListBanner(){

  @OverridepublicvoidonRequestBefore(){}@OverridepublicvoidonFailure(Requestrequest,Exceptione){}@OverridepublicvoidonSuccess(Responseresponse,ListBannerbanners){initBanners(banners);}@Overridepublicvoid(Responseresponse,interrorCode,Exceptione){}});

  是不是以为封装之后OKHttp的利用变得很简单呢,这就是封装的强大之处,好了本日的条记到此为止。

  PS:这里只先容了OKHttp的get和post利用先容,别的的利用比方文件下载上传以及对应的代码封装请本身去完成~(≧▽≦)/~啦啦啦。全文尚有BaseCallback和OkHttpHelper的代码,欢迎阅读原文查察。

  Debug时间

  

  假如完全没了良好的第三方库简直令人抓狂,说说你对哪些良好的第三方库相知恨晚呢?它们给你带来了哪些便利?

  答复认真的风趣的,小巴士会分享出来,开启无敌脑洞吧~别的,给安卓巴士公众号背景发送“报名交友”+你的接洽方式(企鹅号/微信号),颠末筛选就可以得到小巴士独家专访吸引更多妹子关注,帮你早日脱单,具体详情见此篇《这位程序员哥哥着实我觊觎你好久了》。

你可能想看:

关键词:

客户评论

我要评论