2024年10月httpclient(closeablehttpclient httpclient 线程安全吗)

 更新时间:2024-10-12

  ⑴httpclient(closeablehttpclienthttpclient线程安全吗

  ⑵closeablehttpclienthttpclient线程安全吗

  ⑶安全的、httpclient总结:一、基本知识准备()构建URI工具类,URIBuilder()HttpResponse类,可以添加Header信息获取所有Header信息的方法,调用HeaderIterator接口HeaderIteratorit=response.headerIterator(“Set-Cookie“);while(it.hasNext()){System.out.println(it.next());}()HttpEntity内容实体可以被装入Request和Response中..只有独立的entity才可以被重复调用.当请求需要entityHttpEntity.writeTo(OutputStream)从响应中解析entityHttpEntity.getContent()HttpEntity.getContentType()HttpEntity.getContentLength()HttpEntity.getContentEncoding()对entity进行解析可采用流的方式或者调用EntityUtils,但后者有长度的限制利用BufferedEntity可以将entity缓存到本地磁盘,用来进行多次读取.创建entity信息时需要指定meta信息,包括contentType()可以调用ResponseHandler写入响应统一处理二、常用策略keep-Alieve策略:自定义ConnectionKeepAliveStrategy重定向策略:LaxRedirectStrategy三、资源分配当CloseableHttpClient不再需要,并且不再连接管理的范围,需要调用CloseableHttpClient.close()方法将其关闭..四、HttpClient状态管理、在HTTP上下文中,很多有逻辑关系的请求都可以放入到同一个session中..HttpClient本身线程HttpContext包含任意的键值对,因此线程不安全..通常建议每个线程拥有自己的上下文、自动恢复机制----》HttpRequestRetryHandlerHttpRequestRetryHandlermyRetryHandler=newHttpRequestRetryHandler(){publicbooleanretryRequest(IOExceptionexception,intexecutionCount,HttpContextcontext){if(executionCount》=){//Donotretryifovermaxretrycountreturnfalse;}if(exceptioninstanceofInterruptedIOException){//Timeoutreturnfalse;}if(exceptioninstanceofUnknownHostException){//Unknownhostreturnfalse;}if(exceptioninstanceofConnectTimeoutException){//Connectionrefusedreturnfalse;}if(exceptioninstanceofSSLException){//SSLhandshakeexceptionreturnfalse;}HttpClientContextclientContext=HttpClientContext.adapt(context);HttpRequestrequest=clientContext.getRequest();booleanidempotent=!(requestinstanceofHttpEntityEnclosingRequest);if(idempotent){//Retryiftherequestisconsideredidempotentreturntrue;}returnfalse;}};CloseableHttpClienthttpclient=HttpClients.custom().setRetryHandler(myRetryHandler).build();、多线程中的应用AtomicInteger,,,,待研究...从连接管理器中获取连接()通过HttpClientConnectionManager来管理一个连接HttpClientContextcontext=HttpClientContext.create();HttpClientConnectionManagerconnMrg=newBasicHttpClientConnectionManager();HttpRouteroute=newHttpRoute(newHttpHost(“));//获取新的连接.这里可能耗费很多时间ConnectionRequestconnRequest=connMrg.requestConnection(route,null);//秒超时HttpClientConnectionconn=connRequest.get(,TimeUnit.SECONDS);try{//如果创建连接失败if(!conn.isOpen()){//establishconnectionbasedonitsrouteinfoconnMrg.connect(conn,route,,context);//andmarkitasroutepleteconnMrg.routeplete(conn,route,context);}//进行自己的操作.}finally{connMrg.releaseConnection(conn,null,,TimeUnit.MINUTES);}通过更复杂的PoolingHttpClientConnectionManager来管理多个连接,适合多线程中的请求PoolingHttpClientConnectionManagercm=newPoolingHttpClientConnectionManager();//将最大连接数增加到cm.setMaxTotal();//将每个路由基础的连接增加到cm.setDefaultMaxPerRoute();//将目标主机的最大连接数增加到HttpHostlocalhost=newHttpHost(“);cm.setMaxPerRoute(newHttpRoute(localhost),);CloseableHttpClienthttpClient=HttpClients.custom().setConnectionManager(cm).build();示例---------------------------------PoolingHttpClientConnectionManagercm=newPoolingHttpClientConnectionManager();CloseableHttpClienthttpClient=HttpClients.custom().setConnectionManager(cm).build();//URL列表数组StringurisToGet={“为每个url创建一个线程,GetThread是自定义的类GetThreadthreads=newGetThread[urisToGet.length];for(inti=;i《threads.length;i++){HttpGethttpget=newHttpGet(urisToGet[i]);threads[i]=newGetThread(httpClient,httpget);}//启动线程for(intj=;j《threads.length;j++){threads[j].start();}//jointhethreadsfor(intj=;j《threads.length;j++){threads[j].join();}自定义类GetThreadstatilassGetThreadextendsThread{privatefinalCloseableHttpClienthttpClient;privatefinalHttpContextcontext;privatefinalHttpGethttpget;publicGetThread(CloseableHttpClienthttpClient,HttpGethttpget){this.httpClient=httpClient;this.context=HttpClientContext.create();this.httpget=httpget;}Overridepublicvoidrun(){try{CloseableHttpResponseresponse=httpClient.execute(httpget,context);try{HttpEntityentity=response.getEntity();}finally{response.close();}}catch(ClientProtocolExceptionex){//Handleprotocolerrors}catch(IOExceptionex){//HandleI/Oerrors}}}注意:即使httpclient可以被多线程访问,仍建议每个httpclient采用自己的context、publicstatilassIdleConnectionMonitorThreadextendsThread{privatefinalHttpClientConnectionManagerconnMgr;privatevolatilebooleanshutdown;publicIdleConnectionMonitorThread(HttpClientConnectionManagerconnMgr){super();this.connMgr=connMgr;}Overridepublicvoidrun(){try{while(!shutdown){synchronized(this){wait();//关闭失效的连接connMgr.closeExpiredConnections();//可选的,关闭秒内不活动的连接connMgr.closeIdleConnections(,TimeUnit.SECONDS);}}}catch(InterruptedExceptionex){//terminate}}publicvoidshutdown(){shutdown=true;synchronized(this){notifyAll();}}}

  ⑷如何接收httpclient发送的请求

  ⑸客户端向服务器发送数据份两种情况SSL单向验证SSL双向验证.SSL单向验证代码:Java代码importjava.io.IOException;importjava.util.HashMap;importjava.util.Map;import.apache.mons.httpclient.HttpClient;import.apache.mons.httpclient.HttpException;import.apache.mons.httpclient.HttpStatus;import.apache.mons.httpclient.NameValuePair;import.apache.mons.httpclient.methods.PostMethod;import.apache.mons.httpclient.params.HttpClientParams;import.apache.mons.httpclient.params.HttpMethodParams;import.apache.mons.logging.Log;import.apache.mons.logging.LogFactory;publilassClientSendData{staticLoglog=LogFactory.getLog(ClientSendData.class);privateStringUrl;//初始化数据publilientSendData(){Url=““;}publicStringsendData(Stringdata){StringreceivedData=null;try{MapparamsData=newHashMap();paramsData.put(“data“,data);receivedData=send(Url,paramsData);}catch(Exceptione){e.printStackTrace();}returnreceivedData;}publicstaticStringsend(Stringurl,MapparamsMap){Stringresult=null;PostMethodpostMethod=null;HttpClienthttpClient=newHttpClient();httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,“utf-“);postMethod=newPostMethod(url);if(paramsMap!=null&¶msMap.size()》){NameValuePairdatas=newNameValuePair[paramsMap.size()];intindex=;for(Stringkey:paramsMap.keySet()){datas[index++]=newNameValuePair(key,paramsMap.get(key));}postMethod.setRequestBody(datas);}HttpClientParamshttparams=newHttpClientParams();httparams.setSoTimeout();postMethod.setParams(httparams);try{intstatusCode=httpClient.executeMethod(postMethod);if(statusCode==HttpStatus.SC_OK){result=postMethod.getResponseBodyAsString();log.info(“发送功“);}else{log.error(“httpresponsestatusis“+statusCode);}}catch(HttpExceptione){log.error(“errorurl=“+url,e);}catch(IOExceptione){log.error(“errorurl=“+url,e);}finally{if(postMethod!=null){postMethod.releaseConnection();}}returnresult;}publicstaticvoidmain(Stringargs){ClientSendDatat=newClientSendData();t.sendData(“测试SSL单项连接向服务端发送数据!“);}}能现异.java..ConnectException:Connectionrefused:connect服务器没启.javax..ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIXpathbuildingfailed服务端证书信解决办见篇文章.java..SocketException:Softwarecausedconnectionabort:recvfailed由于服务端配置SSL双向认证客户端发送数据按照服务器单向认证发送即没客户端证书信息起发送给服务端..apache.mons.httpclient.NoHttpResponseException般服务端防火墙原拦截客户端请求另外服务端负载重现问题.javax..ssl.SSLHandshakeException:Remotehostclosedconnectionduringhandshake由于服务端配置SSL双向认证客户端发送数据按照服务器单向认证发送即没客户端证书信息起发送给服务端服务端验证客户端证书发现客户端没证书断握手连接.SSL双向验证双向验证暂知道何用HTTPCLIENT发送数据需要双向验证发送数据参考我另外文章另外知道HTTPCLIENT何双向验证发送数据恳请指教

  ⑹如何使用httpclient访问网络

  ⑺使用ApacheHttpClient访问网络

  ⑻package?.szy.news.service;import?java.util.ArrayList;import?java.util.List;import?.apache.http.HttpResponse;import?.apache.http.HttpStatus;import?.apache.http.client.HttpClient;import?.apache.http.client.entity.UrlEncodedFormEntity;import?.apache.http.client.methods.HttpGet;import?.apache.http.client.methods.HttpPost;import?.apache.http.impl.client.DefaultHttpClient;import?.apache.http.message.BasiameValuePair;import?.apache.http.params.BasicHttpParams;import?.apache.http.params.HttpConnectionParams;import?.apache.http.params.HttpParams;import?.apache.http.protocol.HTTP;import?.apache.http.util.EntityUtils;import?.json.JSONObject;import?.szy.news.model.Parameter;/**?*以同步方式发送Http请求?*/public?class?SyncHttp{ /** ?*?通过GET方式发送请求 ?*?param?url?URL地址 ?*?param?params?参数 ?*?return? ?*?throws?Exception ?*/ public?String?httpGet(String?url,?String?params)?throws?Exception {??? String?response?=?null;?//返回信息 //拼接请求URL if?(null!=params&&!params.equals(““)) { url?+=?“?“?+?params; } ??? int?timeoutConnection?=?;?? int?timeoutSocket?=?;?? HttpParams?httpParameters?=?new?BasicHttpParams(); //?Set?the?timeout?in?milliseconds?until?a?connection?is?established.?? ????HttpConnectionParams.setConnectionTimeout(httpParameters,?timeoutConnection); ????//?in?milliseconds?which?is?the?timeout?for?waiting?for?data.? ????HttpConnectionParams.setSoTimeout(httpParameters,?timeoutSocket);? //?构造HttpClient的实例 //??HttpClient?httpClient?=?new?DefaultHttpClient(); HttpClient?httpClient?=?new?DefaultHttpClient(httpParameters);?? //?创建GET方法的实例 HttpGet?httpGet?=?new?HttpGet(url); try {?????????? HttpResponse?httpResponse?=?httpClient.execute(httpGet); int?statusCode?=?httpResponse.getStatusLine().getStatusCode(); if?(statusCode?==?HttpStatus.SC_OK)?//SC_OK?=? { //?获得返回结果 response?=?EntityUtils.toString(httpResponse.getEntity()); JSONObject?jsonObject?=?new?JSONObject(response); } else { response?=?“返回码:“+statusCode; } }?catch?(Exception?e) { throw?new?Exception(e); }? return?response; } /** ?*?通过POST方式发送请求 ?*?param?url?URL地址 ?*?param?params?参数 ?*?return ?*?throws?Exception ?*/ public?String?httpPost(String?url,?List《Parameter》?params)?throws?Exception { String?response?=?null; int?timeoutConnection?=?;?? int?timeoutSocket?=?;?? //?Set?the?timeout?in?milliseconds?until?a?connection?is?established. HttpParams?httpParameters?=?new?BasicHttpParams();?? //?Set?the?default?socket?timeout?(SO_TIMEOUT).in?milliseconds?which?is?the?timeout?for?waiting?for?data.?? ????HttpConnectionParams.setConnectionTimeout(httpParameters,?timeoutConnection); ????HttpConnectionParams.setSoTimeout(httpParameters,?timeoutSocket);?? ????//?构造HttpClient的实例 //HttpClient?httpClient?=?new?DefaultHttpClient(); HttpClient?httpClient?=?new?DefaultHttpClient(httpParameters);?? ??? ??????????? HttpPost?httpPost?=?new?HttpPost(url); if?(params.size()》=) { //设置httpPost请求参数 httpPost.setEntity(new?UrlEncodedFormEntity(buildNameValuePair(params),HTTP.UTF_)); } //使用execute方法发送HTTP?Post请求,并返回HttpResponse对象 HttpResponse?httpResponse?=?httpClient.execute(httpPost); int?statusCode?=?httpResponse.getStatusLine().getStatusCode(); if(statusCode==HttpStatus.SC_OK) { //获得返回结果 response?=?EntityUtils.toString(httpResponse.getEntity()); } else { response?=?“返回码:“+statusCode; } return?response; } /** ?*?把Parameter类型集合转换成NameValuePair类型集合 ?*?param?params?参数集合 ?*?return ?*/ private?List《BasiameValuePair》?buildNameValuePair(List《Parameter》?params) { List《BasiameValuePair》?result?=?new?ArrayList《BasiameValuePair》(); for?(Parameter?param?:?params) { BasiameValuePair?pair?=?new?BasiameValuePair(param.getName(),?param.getValue()); result.add(pair); } return?result; }}

  ⑼HttpClient和HttpURLConnection的区别

  ⑽首先:在JDK的java.包中已经提供了访问HTTP协议的基本功能:HttpURLConnection。但是对于大部分应用程序来说,JDK库本身提供的功能还不够丰富和灵活。在Android中,androidSDK中集成了Apache的HttpClient模块,用来提供高效的、最新的、功能丰富的支持HTTP协议工具包,并且它支持HTTP协议最新的版本和建议。使用HttpClient可以快速开发出功能强大的Http程序。其次:HttpClient是个很不错的开源框架,封装了访问

  ⑾httpclient需要关闭吗

  ⑿需要用httpclient会为你管理cookie等东西,从而使得你保持登陆状态,你自己要注意的就是,登陆后要使用同一个httpclient对象

  ⒀httpclient怎么抓取最终跳转的网站数据

  ⒁.服务器认证(ServerAuthentication)HttpClient处理服务器认证几乎是透明的,仅需要开发人员提供登录信息(logincredentials)。登录信息保存在HttpState类的实例中,可以通过setCredentials(Stringrealm,Credentialscred)和getCredentials(Stringrealm)来获取或设置。HttpClient内建的自动认证,可以通过HttpMethod类的setDoAuthentication(booleandoAuthentication)方法关闭,而且这次关闭只影响HttpMethod当前的实例。.代理认证(proxyauthentication)除了登录信息需单独存放以外,代理认证与服务器认证几乎一致。用setProxyCredentials(Stringrealm,Credentialscred)和getProxyCredentials(Stringrealm)设、取登录信息。.认证方案(authenticationschemes)是HTTP中规定最早的也是最兼容的方案,遗憾的是也是最不安全的一个方案,因为它以明码传送用户名和密码。它要求一个UsernamePasswordCredentials实例,可以指定服务器端的访问空间或采用默认的登录信息。

  ⒂如何使用HttpClient

  ⒃HttpClient简单使用准备Apache官网下载HttpClient,下不了的点击这里,下载完后解压取lib文件夹中jar包导入到项目中在进行本例之前需要了解三个类HttpClient代表Http客户端里面定义了很多,然后用客户端对某一个服务器执行请求操作,可以得到一个http响应,这里响应结构如下消息状态行,消息头,消息实体Response=Status-Line*((general-header|response-header|entity-header)CRLF)CRLF[message-body]结构中的数据我已在本例运行结果中显示出来,请见上图,可以看出本例:对应结构消息状态行:HTTP/.OK消息响应头:Date:Tue,Jan::GMTServer:BWS/.Content-Length:Content-Type:text/html;charset=gbkCache-Control:privateExpires:Tue,Jan::GMTSet-Cookie:H_PS_PSSID=;path=/;domain=.baidu.Set-Cookie:BAIDUID=BBBFFEDBBDBBCFDF:FG=;expires=Tue,-Jan-::GMT;path=/;domain=.baidu.PP:CP=“OTIDSPCORIVAOURIND“Connection:Keep-Alive

  ⒄httpclient怎么使用请求超时后的重试

  ⒅这样应该可以吧,httpclient自带的HttpClientBuilder.create().setDefaultRequestConfig(config).setRetryHandler(newDefaultHttpRequestRetryHandler())//默认失败后重发次,可用别的构造方法指定重发次数.build();自己写的inti=;while(true){CloseableHttpResponseresponse=null;try{response=httpClient.execute(httpPost);}catch(Exceptione){if(i》){break;}i++;}if(esponse!=null){break;}}

  ⒆httpClient整个应用应该使用同一个实例么

  ⒇是整个应用使用同一个httpClient实例(写个单例工厂返回应用中唯一实例,还是应该每次做POST请求的时候new一个DefaultHttpClient对象?、做多线程并发POST时,该使用ThreadSafeClientConnManager还是普通默认的SingleClientConnManager?、在每次POST完成后,是否需要执行httpClient.getConnectionManager().shutdown()?

  ⒈如何使用HttpClient模拟浏览器GETPOST

  ⒉JAVA-用HttpClient来模拟浏览器GET,POST一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器,用来浏览页面查看信息或者提交一些数据等等。所访问的这些页面有的仅仅是一些普通的页面,有的需要用户登录后方可使用,或者需要认证以及是一些通过加密方式传输,例如HTTPS。目前我们使用的浏览器处理这些情况都不会构成问题。不过你可能在某些时候需要通过程序来访问这样的一些页面,比如从别人的网页中“偷”一些数据;利用某些站点提供的页面来完成某种功能,例如说我们想知道某个手机号码的归属地而我们自己又没有这样的数据,因此只好借助其他公司已有的网站来完成这个功能,这个时候我们需要向网页提交手机号码并从返回的页面中解析出我们想要的数据来。如果对方仅仅是一个很简单的页面,那我们的程序会很简单,本文也就没有必要大张旗鼓的在这里浪费口舌。但是考虑到一些服务授权的问题,很多公司提供的页面往往并不是可以通过一个简单的URL就可以访问的,而必须经过注册然后登录后方可使用提供服务的页面,这个时候就涉及到COOKIE问题的处理。我们知道目前流行的动态网页技术例如ASP、JSP无不是通过COOKIE来处理会话信息的。为了使我们的程序能使用别人所提供的服务页面,就要求程序首先登录后再访问服务页面,这过程就需要自行处理cookie,想想当你用java..HttpURLConnection来完成这些功能时是多么恐怖的事情啊!况且这仅仅是我们所说的顽固的WEB服务器中的一个很常见的“顽固”!再有如通过HTTP来上传文件呢?不需要头疼,这些问题有了“它”就很容易解决了!我们不可能列举所有可能的顽固,我们会针对几种最常见的问题进行处理。当然了,正如前面说到的,如果我们自己使用java..HttpURLConnection来搞定这些问题是很恐怖的事情,因此在开始之前我们先要介绍一下一个开放源码的项目,这个项目就是Apache开源组织中的本小节的例子演示向如何查询手机号码所在的城市,代码如下:/**//**Createdon--byLiudong*/packagehttp.demo;importjava.io.IOException;import.apache.mons.httpclient.*;import.apache.mons.httpclient.methods.*;/***//***提交参数演示*该程序连接到一个用于查询手机号码所属地的页面*以便查询号码段所在的省份以及城市*authorLiudong*/publilassSimpleHttpClient...{publicstaticvoidmain(Stringargs)throwsIOException...{HttpClientclient=newHttpClient();client.getHostConfiguration().setHost(“);HttpMethodmethod=getPostMethod();//使用POST方式提交数据client.executeMethod(method);//打印服务器返回的状态System.out.println(method.getStatusLine());//打印结果页面Stringresponse=newString(method.getResponseBodyAsString().getBytes(“_“));//打印返回的信息System.out.println(response);method.releaseConnection();}/***//***使用GET方式提交数据*return*/privatestaticHttpMethodgetGetMethod()...{returnnewGetMethod(“/simcard.php?simcard=“);}/***//***使用POST方式提交数据*return*/privatestaticHttpMethodgetPostMethod()...{PostMethodpost=newPostMethod(“/simcard.php“);NameValuePairsimcard=newNameValuePair(“simcard“,““);post.setRequestBody(newNameValuePair...{simcard});returnpost;}}

您可能感兴趣的文章:

相关文章