关于使用HttpURLConnetion发送get请求

   前几天使用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(),的值却是""!我在一直寻找原因,但是到现在也没有发现!如果有朋友知道原因何在,希望能告知!

猜你喜欢

转载自yuanlaipz.iteye.com/blog/2311139
今日推荐