Java中关于httpClient的用法总结
httpClient是apache开发的一个用于http传输的工具包,用起来非常方便,封装了底层协议,提供了一些简单可用的api以供调用。
快速开始:
-
创建一个http客户端:
private static CloseableHttpClient client = HttpClients.createDefault();
-
创建一个httpPost用于模拟http的post请求:
HttpPost httpPost = new HttpPost("http://localhost:8080/getDetails"); RequestConfig requestConfig = RequestConfig.custom() .setSocketTimeout(1000) .setConnectTimeout(1000) .build(); httpPost.setConfig(requestConfig); httpPost.addHeader("Content-Type", "application/json"); //一个实体类,它从字符串中获得内容并填充到实体类中,json代表json字符串 StringEntity entity = new StringEntity(json,ContentType.APPLICATION_JSON); httpPost.setEntity(entity);
-
创建一个HttpResponse用来接收响应:
//这里用CloseableHttpResponse而不用HttpResponse是因为前者继承了Closeable接口 //在后面会调用其继承的close()方法来关闭response CloseableHttpResponse response = null;
-
执行http请求:
response = client.execute(httpPost);
-
获得响应数据并处理数据:
//获得响应状态行 StatusLine statusLine = response.getStatusLine(); if (statusLine != null){ int code = statusLine.getStatusCode(); //请求成功 if(code == 200) { //这里不用EntityUtils.toString(final HttpEntity entity)方法的原因: //官方api强烈建议禁用此方法:除非entity来自受信任的网站并且实体内容长度有限 //至于为什么这样,本人还没有研究清楚,可能是EntityUtils.toString方法里面 //直接利用entity.getContent()方法获得inputStream,然后将inputStream关闭, //导致如果entity不是repeatable的,则就不能再次访问entity的内容 // String rev = EntityUtils.toString(response.getEntity()); HttpEntity responseEntity = response.getEntity(); if (responseEntity != null){ //读取响应内容 String rev = JsonUtil.readToString(responseEntity.getContent(),"utf-8"); //关闭inputStream流 EntityUtils.consume(responseEntity); //将响应转换成json格式 JSONObject jsonObject = JSON.parseObject(rev); if (jsonObject != null && StringUtils.equals(String.valueOf(jsonObject.get("code")), "200")){ logger.info("【" + systemId + "】" + "系统应答结果:" + String.valueOf(jsonObject.get("msg"))); result = true; }else if (jsonObject != null) logger.error("【" + systemId + "】" + "系统应答结果:" + String.valueOf(jsonObject.get("msg"))); } } }