Java使用HttpClient实现Post请求实例

作者:mengrennwpu 时间:2022-05-22 08:37:43 

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

来源:http://www.cnblogs.com/mengrennwpu/p/6418114.html

标签:httpclient,java
0
投稿

猜你喜欢

  • @Autowired注解注入的xxxMapper报错问题及解决

    2022-10-01 10:31:02
  • 一文带你深入了解Java泛型

    2022-02-10 05:38:02
  • Spring Boot中lombok的安装与使用详解

    2021-08-26 14:50:38
  • Android自定义ProgressDialog加载图片

    2022-07-28 22:08:39
  • Java如何利用状态模式(state pattern)替代if else

    2021-08-15 09:31:08
  • DUCC配置平台实现一个动态化线程池示例代码

    2023-11-28 12:07:39
  • Java三目运算中隐藏的自动拆装箱

    2023-11-29 10:47:10
  • 三种Java自定义DNS解析器方法与实践

    2022-01-13 10:12:11
  • 优化SpringBoot程序启动速度的实现

    2023-09-28 13:04:52
  • Android 中TextView中跑马灯效果的实现方法

    2023-08-07 01:39:46
  • emoji表情与unicode编码互转的实现(JS,JAVA,C#)

    2023-02-07 06:07:48
  • Java数字格式类(NumberFormat类和DecimalFormat类)用法详解

    2022-11-14 14:54:02
  • Flutter Widgets MediaQuery控件屏幕信息适配

    2023-06-29 04:48:21
  • android实现双日期选择控件(可隐藏日,只显示年月)

    2023-05-09 12:59:10
  • java编程约瑟夫问题实例分析

    2022-04-05 22:32:08
  • java实现简单的加减乘除计算器

    2022-11-14 01:25:59
  • C#SuperSocket的搭建并配置启动总结

    2022-01-25 15:16:24
  • Java Swing JLabel标签的使用方法

    2021-09-16 05:48:13
  • C#实现动态创建接口并调用的实例

    2021-11-12 16:38:17
  • Java毕业设计实战之线上水果超市商城的实现

    2021-09-15 19:23:01
  • asp之家 软件编程 m.aspxhome.com