首页 > Web开发 > 详细

关于使用HttpURLConnetion发送get请求

时间:2016-07-16 02:23:14      阅读:361      评论:0      收藏:0      [点我收藏+]

?? 前几天使用HttptUrlConnection调用SpringBoot框架下的接口时遇到了一点超出预期的东西。

?? 想必大家都知道,为了安全起见,都会在单点登录中使用tonken类似的验证,很不幸,我也遇到了,在使用post请求服务器时需要一个验证码,并且这个验证码是有服务器给Post请求的,无法使用手工拼接。然后我不得不使用get方法来调用接口。然后,并没有预想的顺利!

public class HttpClient {
??? private static Logger logger = Logger.getLogger(HttpClient.class);
??? /**
??? ?* @param url=ip+?+para
??? ?* @param method POST 或者GET
??? ?* @param charset 编码格式
??? ?* @return
??? ?*/
??? public static String getHttpConnection(String url, String method, String charset) {
??? ???
??? ??? String message = ""; // 返回信息
??? ??? OutputStream os = null; // 输出流
??? ??? StringBuffer sb = null; // 字符串缓冲流
??? ??? BufferedReader br = null; // 缓冲字符串输入流
??? ??? HttpURLConnection conn = null;
??? ???
??? ??? try {
??? ??? ??? // 创建HTTP的URL对象
??? ??? ??? URL getURL = new URL(url);
??? ??? ??? // 获取一个 HttpURLConnection 链接对象
??? ??? ??? conn = (HttpURLConnection) getURL.openConnection();
??? ??? ??? // 使用 java.net.URL 链接进行输出时,须将DoOutput标志设true
??? ??? ??? conn.setDoOutput(true);
??? ??? ??? // 设置通用的请求属性
??? ??? ??? // conn.setRequestProperty("ContentType","text/xml;charset=UTF-8");
??? ??? ??? // 用 get 方式传递数据
??? ??? ??? conn.setRequestMethod(method);
??? ??? ??? // 设置链接超时时间 5秒
??? ??? ??? conn.setConnectTimeout(60 * 1000);
??? ??? ??? // 设置读取超时时间 20秒
??? ??? ??? conn.setReadTimeout(20 * 1000);
??? ??? ??? // 取得输出流
??? ??? ??? os = conn.getOutputStream();
??? ??? ??? // 设置输出流格式 UTF-8
??? ??? ??? os.write(message.getBytes(charset));
??? ??? ??? // 接口调用后,获取返回的输入流,并把返回的流转换为字符串String
??? ??? ??? br = new BufferedReader(new InputStreamReader( conn.getInputStream(), charset) );
??? ??? ??? sb = new StringBuffer();
??? ??? ??? while (br.ready()) {
??? ??? ??? ??? sb.append(br.readLine());
??? ??? ??? }
??? ??? ??? message = sb.toString();
??? ??? ??? logger.info("HttpClient请求返回的字符串:" + message);
??? ??? ??? System.out.println("HttpClient请求返回的字符串:" + message);
??? ??? ??? return message;
??? ??? } catch (Exception e) {
??? ??? ??? logger.error("连接HTTP出现异常,请排查! message:" + e.getMessage());
??? ??? ??? e.printStackTrace();
??? ??? ??? return message;
??? ??? } finally {
??? ??? ??? try {
??? ??? ??? ??? if (os != null) {
??? ??? ??? ??? ??? os.flush();
??? ??? ??? ??? ??? os.close();
??? ??? ??? ??? }
??? ??? ??? ??? br.close();
??? ??? ??? ??? conn.disconnect();// 断开连接
??? ??? ??? } catch (IOException e) {
??? ??? ??? ??? e.printStackTrace();
??? ??? ??? }
??? ??? }
??? }
}

??? 对于代码不多做解释。这个方法一开始是用于Post请求的,对于没有tonken验证的程序也可以正常调用接口,但是当我把method的值设为GET时,这个请求任然是一个Post请求。找了网上各种资历,找了大牛~~任然没找到病原所在!于是,自己开了断点,最后找到症结所在,竟然是它:os = conn.getOutputStream();

os.write(message.getBytes(charset));

  一开始也很纳闷,这是为什么。自己看了一下,这个输出流到底是干嘛用的:众所周知POST请求和GET请求的区别,这个输出流就是用来设置参数的!然而,get请求的参数都在地址后面,以?分隔,用&连接,只有post请求才有单独存放参数的空间。

  到此,问题很明显了,在设置这个输出流的时候你就已经告诉HttpURLConnection你要发送的是POST请求!所以,最终的结果就是你期待的GEt请求变为了POST请求!

  然后把输出流干掉,GET请求成功!

  

  最后说一个自己发现的小问题,就是这个GET请求,当你连续发送多次时会出现数据丢失的现象:目标接口返回的数据是{"status":"1","message":"请求成功"},但是HttpURLConnection.getInputStream(),的值却是""!我在一直寻找原因,但是到现在也没有发现!如果有朋友知道原因何在,希望能告知!

关于使用HttpURLConnetion发送get请求

原文:http://yuanlaipz.iteye.com/blog/2311139

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!