一,基础的的应用
1.1,get的无参请求
@Test public void doGet() throws Exception { //创建一个httpclient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); //创建一个GET对象 HttpGet get = new HttpGet("http://www.sogou.com"); //执行请求 CloseableHttpResponse response = httpClient.execute(get); //取响应的结果 int statusCode = response.getStatusLine().getStatusCode(); System.out.println(statusCode); HttpEntity entity = response.getEntity(); String string = EntityUtils.toString(entity, "utf-8"); System.out.println(string); //关闭httpclient response.close(); httpClient.close(); }
1.2,get的带参请求
public void doGetWithParam() throws Exception{ //创建一个httpclient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); //创建一个uri对象 URIBuilder uriBuilder = new URIBuilder("http://www.sogou.com/web"); uriBuilder.addParameter("query", "花千骨"); HttpGet get = new HttpGet(uriBuilder.build()); //执行请求 CloseableHttpResponse response = httpClient.execute(get); //取响应的结果 int statusCode = response.getStatusLine().getStatusCode(); System.out.println(statusCode); HttpEntity entity = response.getEntity(); String string = EntityUtils.toString(entity, "utf-8"); System.out.println(string); //关闭httpclient response.close(); httpClient.close(); }
1.3,post的无参请求
public void doPost() throws Exception { CloseableHttpClient httpClient = HttpClients.createDefault(); //创建一个post对象 HttpPost post = new HttpPost("http://localhost:8082/httpclient/post.action"); //执行post请求 CloseableHttpResponse response = httpClient.execute(post); String string = EntityUtils.toString(response.getEntity()); System.out.println(string); response.close(); httpClient.close(); }
1.4.1,post的带参请求
public void doPostWithParam() throws Exception{ CloseableHttpClient httpClient = HttpClients.createDefault(); //创建一个post对象 HttpPost post = new HttpPost("http://localhost:8082/httpclient/post.action"); //创建一个Entity。模拟一个表单 List<NameValuePair> kvList = new ArrayList<>(); kvList.add(new BasicNameValuePair("username", "张三")); kvList.add(new BasicNameValuePair("password", "123")); //包装成一个Entity对象 StringEntity entity = new UrlEncodedFormEntity(kvList, "utf-8"); //设置请求的内容 post.setEntity(entity); //执行post请求 CloseableHttpResponse response = httpClient.execute(post); String string = EntityUtils.toString(response.getEntity()); System.out.println(string); response.close(); httpClient.close(); }
1.4.2,post的请求服务器8082的写法
@RequestMapping(value="/httpclient/post", method=RequestMethod.POST, produces=MediaType.TEXT_PLAIN_VALUE+";charset=utf-8") @ResponseBody public String testPost(String username, String password) { String result = "username:" + username + "\tpassword:" + password; System.out.println(result); return "username:" + username + ",password:" + password; }
二,httpclient的工具封装
2.1,get的带参和无参的工具类
public static String doGet(String url, Map<String, String> param) { // 创建Httpclient对象 CloseableHttpClient httpclient = HttpClients.createDefault(); String resultString = ""; CloseableHttpResponse response = null; try { // 创建uri URIBuilder builder = new URIBuilder(url); if (param != null) { for (String key : param.keySet()) { builder.addParameter(key, param.get(key)); } } URI uri = builder.build(); // 创建http GET请求 HttpGet httpGet = new HttpGet(uri); // 执行请求 response = httpclient.execute(httpGet); // 判断返回状态是否为200 if (response.getStatusLine().getStatusCode() == 200) { resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (response != null) { response.close(); } httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } return resultString; } public static String doGet(String url) { return doGet(url, null); }
2.2,post的带参和无参的工具类 (参数的数据类型是map)
public static String doPost(String url, Map<String, String> param) { // 创建Httpclient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; String resultString = ""; try { // 创建Http Post请求 HttpPost httpPost = new HttpPost(url); // 创建参数列表 if (param != null) { List<NameValuePair> paramList = new ArrayList<>(); for (String key : param.keySet()) { paramList.add(new BasicNameValuePair(key, param.get(key))); } // 模拟表单 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList); httpPost.setEntity(entity); } // 执行http请求 response = httpClient.execute(httpPost); resultString = EntityUtils.toString(response.getEntity(), "utf-8"); } catch (Exception e) { e.printStackTrace(); } finally { try { response.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return resultString; } public static String doPost(String url) { return doPost(url, null); }
2.3,post的带参的请求(参数类型是json格式的数据)
public static String doPostJson(String url, String json) { // 创建Httpclient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; String resultString = ""; try { // 创建Http Post请求 HttpPost httpPost = new HttpPost(url); // 创建请求内容 StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); httpPost.setEntity(entity); // 执行http请求 response = httpClient.execute(httpPost); resultString = EntityUtils.toString(response.getEntity(), "utf-8"); } catch (Exception e) { e.printStackTrace(); } finally { try { response.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return resultString; }
三,项目中的案例解析 (调用其它公司的图像识别为例)
3.1,调用的服务层的方法(第一个参数不一样,说明识别的证件不一样)
private OcrServer ocrServer = null; @Override public Map<String, Object> idCardRecognize(MultipartFile imageFile) { return ocrServer.pictureRecognition("IdCard", imageFile); } @Override public Map<String, Object> bankCardRecognize(MultipartFile imageFile) { return ocrServer.pictureRecognition("BankCard", imageFile); } @Override public Map<String, Object> veCardRecognize(MultipartFile imageFile) { return ocrServer.pictureRecognition("VeCard", imageFile); } @Override public Map<String, Object> driverCardRecognize(MultipartFile imageFile) { return ocrServer.pictureRecognition("DriverCard", imageFile); } @Override public Map<String, Object> businessLicenseRecognize(MultipartFile imageFile) { return ocrServer.pictureRecognition("BusinessLicense", imageFile); } @Override public Map<String, Object> ocrRecognize(String recotype, MultipartFile imageFile) { return ocrServer.pictureRecognition(recotype, imageFile); } public void setOcrServer(OcrServer ocrServer) { this.ocrServer = ocrServer; }
3.2,参数的封装,url的确定
public Map<String, Object> pictureRecognition(String recotype, MultipartFile imageFile) { long begin = System.currentTimeMillis(); String result = null; // 文件输入流 FileInputStream fs = null; try { String configValue = cpConfigService.getValueByConfigKey("ocr_server_config", "{'uri':'http://cloud.exocr.com/recognize','username':'test','password':'test'}"); Map<String, String> configMap = JsonUtils.json2Map2(configValue); String postUrl = configMap.get("uri"); // 服务地址 Map<String, String> postParam = new HashMap<String, String>(10); postParam.put("username", configMap.get("username")); // 用户名, 公有云测试可使用’test’ postParam.put("password", configMap.get("password")); // 密码,公有云测试可使用 ’test’ postParam.put("recotype", recotype); // BankCard postParam.put("encoding", "utf-8"); // 返回结果的文字编码方式,取值包括:utf-8, 默认值 gb2312 postParam.put("head_portrait", "0"); // 是否返回头像(base64格式),只对身份证识别有效,取值范围:0,默认,不返回头像 1,则返回身份证的头像照片 postParam.put("crop_image", "0"); // 是否返回切边(base64格式),取值:0, 默认,不返回切边图 1, 返回切边图 postParam.put("b64", "1"); // 输入图片是否为base64格式,取值:0, 默认,二进制格式 1, base64格式 // base64编码图像 String base64 = new String(Base64.encodeBase64(imageFile.getBytes())); postParam.put("image", base64); // 待识别的图像,可以是二进制也可以是base64格式 result = HttpUtil.postUrlAsString(postUrl, postParam, null, "utf-8"); logger.info("OCR识别结果{}", result); } catch (Exception e) { logger.error("OCR识别异常:", e); StringBuilder sb = new StringBuilder(); sb.append("{'Error':'99','Details':'OCR识别异常:"); sb.append(e.getMessage()).append("'}"); result = sb.toString(); } finally { if (null != fs) { try { fs.close(); } catch (IOException e) { logger.error("File input stream close exception:", e); } } } // 记录接口调用耗时 logger.info("OCR服务调用耗时{},识别类型{}", System.currentTimeMillis() - begin, recotype); try { return JsonUtils.json2Map(result); } catch (Exception e) { logger.error("json to map exception:", e); } return null; }
在这里假如没有特殊的请求的话完全可以 result = HttpUtil.postUrlAsString(postUrl, postParam, null, "utf-8")调用工具类的方法了返回的结果就是了。
public static String postUrlAsString(String url, Map<String, String> params, Map<String, String> reqHeader, String encode) throws Exception { // 开始时间 long t1 = System.currentTimeMillis(); // 获得HttpPost对象 HttpPost httpPost = getHttpPost(url, params, encode); // 发送请求 String result = executeHttpRequest(httpPost, reqHeader, encode); // 结束时间 long t2 = System.currentTimeMillis(); // 调试信息 logger.debug("url:" + url); logger.debug("params:" + params.toString()); logger.debug("reqHeader:" + reqHeader); logger.debug("encode:" + encode); logger.debug("result:" + result); logger.debug("consume time:" + ((t2 - t1))); // 返回结果 return result; }
3.3,httppost对象的获取
private static HttpPost getHttpPost(String url, Map<String, String> params, String encode) throws UnsupportedEncodingException { HttpPost httpPost = new HttpPost(url); if (params != null) { List<NameValuePair> form = new ArrayList<NameValuePair>(); for (String name : params.keySet()) { form.add(new BasicNameValuePair(name, params.get(name))); } UrlEncodedFormEntity entity = new UrlEncodedFormEntity(form, encode); httpPost.setEntity(entity); } return httpPost; }
3.4,把获取到的参数传递给httppost对象
private static String executeHttpRequest(HttpUriRequest request, Map<String, String> reqHeader, String encode) throws Exception { HttpClient client = null; String result = null; try { // 创建HttpClient对象 client = new DefaultHttpClient(); // 设置连接超时时间 client.getParams().setParameter( CoreConnectionPNames.CONNECTION_TIMEOUT, 60); // 设置Socket超时时间 client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 36600); // 设置请求头信息 if (reqHeader != null) { for (String name : reqHeader.keySet()) { request.addHeader(name, reqHeader.get(name)); } } // 获得返回结果 HttpResponse response = client.execute(request); // 如果成功 if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { encode = StringUtils.isNotEmpty(encode) ? encode : DEFAULT_ENCODE; result = EntityUtils.toString(response.getEntity(), encode); } else { StringBuffer errorMsg = new StringBuffer(); errorMsg.append("httpStatus:"); errorMsg.append(response.getStatusLine().getStatusCode()); errorMsg.append(response.getStatusLine().getReasonPhrase()); errorMsg.append(", Header: "); Header[] headers = response.getAllHeaders(); for (Header header : headers) { errorMsg.append(header.getName()); errorMsg.append(":"); errorMsg.append(header.getValue()); } logger.error("HttpResonse Error:" + errorMsg); result = "{'Error':'98','Details':'" + errorMsg.toString() + "'}"; } } catch (Exception e) { logger.error("http连接异常", e); throw new Exception("http连接异常"); } finally { try { client.getConnectionManager().shutdown(); } catch (Exception e) { logger.error("finally HttpClient shutdown error", e); } } return result; }