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配置文件也更新为该版本,程序则运行通过.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。