Java使用HttpClient实现Post请求实例

作者:袖梨 2022-06-29

基于项目需求,想要实现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(JSONObject jsonObj,String url,String appId){

booleanisSuccess =false;

HttpPost post =null;

try{

HttpClient httpClient =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");

String sessionId = getSessionId();

post.setHeader("SessionId", sessionId);

post.setHeader("appid", appid);

// 构建消息实体

StringEntity entity =newStringEntity(jsonObj.toString(), Charset.forName("UTF-8"));

entity.setContentEncoding("UTF-8");

// 发送Json格式的数据请求

entity.setContentType("application/json");

post.setEntity(entity);

HttpResponse response = httpClient.execute(post);

// 检验返回码

intstatusCode = response.getStatusLine().getStatusCode();

if(statusCode != HttpStatus.SC_OK){

LogUtil.info("请求出错: "+statusCode);

isSuccess =false;

}else{

intretCode =0;

String sessendId ="";

// 返回码中包含retCode及会话Id

for(Header header : 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("error return code, sessionId: "sessendId"t"+"retCode: "+retCode);

isSuccess =false;

}else{

isSuccess =true;

}

}

}catch(Exception e) {

e.printStackTrace();

isSuccess =false;

}finally{

if(post !=null){

try{

post.releaseConnection();

Thread.sleep(500);

}catch(InterruptedException e) {

e.printStackTrace();

}

}

}

returnisSuccess;

}

// 构建唯一会话Id

publicstaticString getSessionId(){

UUID uuid = UUID.randomUUID();

String str = 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依赖包如下:  

代码如下 复制代码

org.apache.httpcomponents

httpclient

4.4.1

org.apache.httpcomponents

httpcore

4.4.1

随后在网上查找了一翻,找到问题的缘由,原因在于Hadoop集群运行程序时,首先会加载自己相关目录下的jar包,在自己目录下如果未找到,才会加载程序运行时指定的jar包,随查找了Hadoop集群中相关Jar包路径,发现httpclient的相关依赖包为4.2.5,因此将pom.xml配置文件也更新为该版本,程序则运行通过.

相关文章

精彩推荐