首页 > 开发 > Java > 正文

Java使用HttpClient实现Post请求实例

2024-07-13 10:04:21
字体:
来源:转载
供稿:网友

基于项目需求,想要实现Post消息推送,故采用HttpClient组件进行实现,相关代码如下(注:程序采用的java/210843.html">httpclient和httpcore依赖包的版本为4.2.5):

import org.apache.http.Header;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.params.CoreConnectionPNames;import java.util.UUID;import net.sf.json.JSONObject;import java.nio.charset.Charset;public static boolean httpPostWithJson(JSONObject jsonObj,String url,String appId){  boolean isSuccess = false;    HttpPost post = null;  try {    HttpClient httpClient = new DefaultHttpClient();    // 设置超时时间    httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 2000);    httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 2000);          post = new HttpPost(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 = new StringEntity(jsonObj.toString(), Charset.forName("UTF-8"));    entity.setContentEncoding("UTF-8");    // 发送Json格式的数据请求    entity.setContentType("application/json");    post.setEntity(entity);          HttpResponse response = httpClient.execute(post);          // 检验返回码    int statusCode = response.getStatusLine().getStatusCode();    if(statusCode != HttpStatus.SC_OK){      LogUtil.info("请求出错: "+statusCode);      isSuccess = false;    }else{      int retCode = 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();      }    }  }  return isSuccess;}// 构建唯一会话Idpublic static String getSessionId(){  UUID uuid = UUID.randomUUID();  String str = uuid.toString();  return str.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配置文件也更新为该版本,程序则运行通过.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VeVb武林网。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表