一聚教程网:一个值得你收藏的教程网站

热门教程

Java使用HttpClient实现Post请求实例

时间:2022-06-29 01:40:52 编辑:袖梨 来源:一聚教程网

基于项目需求,想要实现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配置文件也更新为该版本,程序则运行通过.

热门栏目