正文前先来一波福利推荐:
福利一:
百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。
福利二:
毕业答辩以及工作上各种答辩,平时积累了不少精品PPT,现在共享给大家,大大小小加起来有几千套,总有适合你的一款,很多是网上是下载不到。
获取方式:
微信关注 精品3分钟 ,id为 jingpin3mins,关注后回复 百万年薪架构师 ,精品收藏PPT 获取云盘链接,谢谢大家支持!
------------------------正文开始---------------------------
demo1:几个不同的http请求方式总结:
-------------------------------------------------------------------------------------------------
Post新版本的请求方式:
基于的版本:
<!--<!– https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient –>--> <!--<dependency>--> <!--<groupId>org.apache.httpcomponents</groupId>--> <!--<artifactId>httpclient</artifactId>--> <!--<version>4.5.5</version>--> <!--</dependency>-->
// String uploadResponse = Request.Post(nodeAddress + "/" + bucketName + "/" + objectName) // .addHeader("x-nos-token", uploadToken) // .bodyByteArray(chunkData, 0, readLen) // .execute() // .returnContent() // .toString();
-------------------------------------------------------------------------------------------------
Post请求版本方式二:
// public static String doPost(String url, String token, byte[] chunk, int off, int len) // { // CloseableHttpClient httpClient = null; // CloseableHttpResponse httpResponse = null; // String result = ""; // // 创建httpClient实例 // httpClient = HttpClients.createDefault(); // // 创建httpPost远程连接实例 // HttpPost httpPost = new HttpPost(url); // // 配置请求参数实例 // RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 设置连接主机服务超时时间 // .setConnectionRequestTimeout(35000)// 设置连接请求超时时间 // .setSocketTimeout(60000)// 设置读取数据连接超时时间 // .build(); // // 为httpPost实例设置配置 // httpPost.setConfig(requestConfig); // // 设置请求头 // httpPost.addHeader("x-nos-token", token); // // 封装post请求参数 // // 为httpPost设置封装好的请求参数 // HttpEntity requestEntity = new ByteArrayEntity(chunk, 0, len); // httpPost.setEntity(requestEntity); // // try { // // httpClient对象执行post请求,并返回响应参数对象 // httpResponse = httpClient.execute(httpPost); // // 从响应对象中获取响应内容 // HttpEntity entity = httpResponse.getEntity(); // result = EntityUtils.toString(entity); // } catch (ClientProtocolException e) { // e.printStackTrace(); // } catch (IOException e) { // e.printStackTrace(); // } finally { // // 关闭资源 // if (null != httpResponse) { // try { // httpResponse.close(); // } catch (IOException e) { // e.printStackTrace(); // } // } // if (null != httpClient) { // try { // httpClient.close(); // } catch (IOException e) { // e.printStackTrace(); // } // } // } // return result; // }
-------------------------------------------------------------------------------------------------
Post请求版本方式二:
public static String sendPost(String url, String token, byte[] chunk, int off, int len) { // 创建httpClient实例对象 HttpClient httpClient = new HttpClient(); // 设置httpClient连接主机服务器超时时间:15000毫秒 httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(15000); // 创建post请求方法实例对象 PostMethod postMethod = new PostMethod(url); // 设置post请求超时时间 postMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 60000); postMethod.addRequestHeader("x-nos-token", token); try { //json格式的参数解析 RequestEntity entity = new ByteArrayRequestEntity(chunk); postMethod.setRequestEntity(entity); httpClient.executeMethod(postMethod); String result = postMethod.getResponseBodyAsString(); postMethod.releaseConnection(); return result; } catch (IOException e) { logger.info("POST请求发出失败!!!"); e.printStackTrace(); } return null; }
-------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------
GET请求方式一:
public static String doGet(String httpurl) { HttpURLConnection connection = null; InputStream is = null; BufferedReader br = null; // 返回结果字符串 String result = null; try { // 创建远程url连接对象 URL url = new URL(httpurl); // 通过远程url连接对象打开一个连接,强转成httpURLConnection类 connection = (HttpURLConnection) url.openConnection(); // 设置连接方式:get connection.setRequestMethod("GET"); // 设置连接主机服务器的超时时间:15000毫秒 connection.setConnectTimeout(15000); // 设置读取远程返回的数据时间:60000毫秒 connection.setReadTimeout(60000); // 发送请求 connection.connect(); // 通过connection连接,获取输入流 if (connection.getResponseCode() == 200) { is = connection.getInputStream(); // 封装输入流is,并指定字符集 br = new BufferedReader(new InputStreamReader(is, "UTF-8")); // 存放数据 StringBuffer sbf = new StringBuffer(); String temp = null; while ((temp = br.readLine()) != null) { sbf.append(temp); sbf.append("\r\n"); } result = sbf.toString(); } } catch (MalformedURLException e) { logger.error("非法地址格式异常..."); e.printStackTrace(); } catch (IOException e) { logger.error("Get请求中IO流出现异常"); e.printStackTrace(); } finally { // 关闭资源 if (null != br) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != is) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } connection.disconnect();// 关闭远程连接 } return result; }
-------------------------------------------------------------------------------------------------
过程问题记录:
在使用get请求的时候,如果URL中的请求参数包含了特殊字符,需要对特殊字符进行转义:
有些字符在URL中具有特殊含义,基本编码规则如下: 特殊含义 十六进制值 1.+ 表示空格(在 URL 中不能使用空格) %20 2./ 分隔目录和子目录 %2F 3.? 分隔实际的 URL 和参数 %3F 4.% 指定特殊字符 %25 5.# 表示书签 %23 6.& URL 中指定的参数间的分隔符 %26
解决方法:
//对鉴权参数做AES加密处理 requestId = java.net.URLEncoder.encode( AESCryptUtils.encode(requestId) ); data = java.net.URLEncoder.encode( AESCryptUtils.encode(data) ); action = java.net.URLEncoder.encode( AESCryptUtils.encode(action) ); String URL = AUTH_URL + "?" + "data=" + data + "&requestId=" + requestId + "&action=" + action;