当前位置: 移动技术网 > IT编程>开发语言>Java > Java使用HttpClient实现Post请求实例

Java使用HttpClient实现Post请求实例

2019年07月22日  | 移动技术网IT编程  | 我要评论

基于项目需求,想要实现post消息推送,故采用httpclient组件进行实现,相关代码如下(注:程序采用的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;
}

// 构建唯一会话id
public 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配置文件也更新为该版本,程序则运行通过.

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网