Java使用HttpClient实现Post请求实例
基于项目需求,想要实现Post消息推送,故采用HttpClient组件进行实现,相关代码如下(注:程序采用的httpclient和httpcore依赖包的版本为4.2.5):
importorg.apache.http.Header; importorg.apache.http.HttpResponse; importorg.apache.http.HttpStatus; importorg.apache.http.client.HttpClient; importorg.apache.http.client.methods.HttpPost; importorg.apache.http.entity.StringEntity; importorg.apache.http.impl.client.DefaultHttpClient; importorg.apache.http.params.CoreConnectionPNames; importjava.util.UUID; importnet.sf.json.JSONObject; importjava.nio.charset.Charset; publicstaticbooleanhttpPostWithJson(JSONObjectjsonObj,Stringurl,StringappId){ booleanisSuccess=false; HttpPostpost=null; try{ HttpClienthttpClient=newDefaultHttpClient(); //设置超时时间 httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,2000); httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,2000); post=newHttpPost(url); //构造消息头 post.setHeader("Content-type","application/json;charset=utf-8"); post.setHeader("Connection","Close"); StringsessionId=getSessionId(); post.setHeader("SessionId",sessionId); post.setHeader("appid",appid); //构建消息实体 StringEntityentity=newStringEntity(jsonObj.toString(),Charset.forName("UTF-8")); entity.setContentEncoding("UTF-8"); //发送Json格式的数据请求 entity.setContentType("application/json"); post.setEntity(entity); HttpResponseresponse=httpClient.execute(post); //检验返回码 intstatusCode=response.getStatusLine().getStatusCode(); if(statusCode!=HttpStatus.SC_OK){ LogUtil.info("请求出错:"+statusCode); isSuccess=false; }else{ intretCode=0; StringsessendId=""; //返回码中包含retCode及会话Id for(Headerheader:response.getAllHeaders()){ if(header.getName().equals("retcode")){ retCode=Integer.parseInt(header.getValue()); } if(header.getName().equals("SessionId")){ sessendId=header.getValue(); } } if(ErrorCodeHelper.IAS_SUCCESS!=retCode){ //日志打印 LogUtil.info("errorreturncode,sessionId:"sessendId"\t"+"retCode:"+retCode); isSuccess=false; }else{ isSuccess=true; } } }catch(Exceptione){ e.printStackTrace(); isSuccess=false; }finally{ if(post!=null){ try{ post.releaseConnection(); Thread.sleep(500); }catch(InterruptedExceptione){ e.printStackTrace(); } } } returnisSuccess; } //构建唯一会话Id publicstaticStringgetSessionId(){ UUIDuuid=UUID.randomUUID(); Stringstr=uuid.toString(); returnstr.substring(0,8)+str.substring(9,13)+str.substring(14,18)+str.substring(19,23)+str.substring(24); }
Ps:在使用Hadoop集群进行发送POST请求时,遇到"java.lang.NoSuchFieldError:INSTANCE"的问题,此类问题一般是"jar包冲突"的问题所致,但奇怪的是本地的pom.xml设置的依赖包中有该字段,相关的httpclient依赖包如下:
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.4.1</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.4.1</version> </dependency>
随后在网上查找了一翻,找到问题的缘由,原因在于Hadoop集群运行程序时,首先会加载自己相关目录下的jar包,在自己目录下如果未找到,才会加载程序运行时指定的jar包,随查找了Hadoop集群中相关Jar包路径,发现httpclient的相关依赖包为4.2.5,因此将pom.xml配置文件也更新为该版本,程序则运行通过.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。