• 使用Java发送http请求,不使用第三方库


    HTTP协议是现在互联网广泛使用的数据传输协议,几乎任何一种编程语言都实现了这个协议。Java语言是做web应用(服务器端应用)的强大语言。不过,现在我们使用Java语言来做客户端,发送http请求到服务器,并获取服务器的响应结果。

    目前,绝大多数人都会使用第三方的框架,比如Apache的httpclient,在高版本的java中甚至内置了一个轻量级的http客户端类,但我这次使用原生的方式去发送,不依赖任何第三方的东西,使用JavaSE就可以完成。

    • Java发送http请求需要使用一个叫URL的类,他的构造方法可以接受一个网址,就是我们想要发送请求的地址。
    • 然后,通过这个URL的实例,就可以打开一个连接。
    • 之后,通过这个连接可以读写数据。
    • 最后,关闭数据读写连接。

    下面,展示代码,并附上说明:

        public String httpRequest(String url) throws Exception {
            URL httpUrl = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
            
            // 设置http请求头,content-type为你发送请求参数的数据格式,目前来说application/json用的比较多,常用的三种
            // 1.application/json 2.application/x-www-form-urlencoded 3.multipart/form-data; boundary=xxxxxxx
            // 第一种,就是使用json的格式发送请求参数,类似{"name":"xxx","age":18},第二种使用urlencode的形式发送请求参数
            // 类似name=xxx&age=18,第三种就比较复杂点了,可以支持上传文件,本次不做示例展示
            connection.setRequestProperty("content-type", "application/x-www-form-urlencoded");
    //        connection.setRequestProperty("content-type", "application/json;charset=utf-8"); // json格式发送数据
    //        connection.setRequestProperty("content-type", "multipart/form-data; boundary=xxxxxxx"); // 表单数据发送
            
            // 必须设置setDoOutput为true才能向请求中写数据,post请求必须设置true,如果是GET请求,下面前两行可以省略
            connection.setDoOutput(true);
            connection.setRequestMethod("POST"); 
            connection.connect();
            
            // 获取数据写入流,如果是GET请求,这里不需要,因为GET请求不需要写数据
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
            bufferedWriter.write("name=xxx&age=18");
    //        bufferedWriter.write("{"name":"xxx","age":18}"); // json格式发送
            // 写完数据一定要flush
            bufferedWriter.flush();
            bufferedWriter.close();
    StringBuilder content
    = new StringBuilder(); if (connection.getResponseCode() == 200) { // 获取数据读取流 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String str; while ((str = bufferedReader.readLine()) != null) { content.append(str); } bufferedReader.close(); return content.toString(); } else { System.err.println(connection.getResponseCode()); } return ""; }

    以上代码,只要稍作调整,就可以完成GET POST PUT DELETE等http请求,非常简单。

    最后,贴出常用的请求最精简代码:

        /**
         * 发送get请求
         * @param url
         * @return
         * @throws Exception
         */
        public String get(String url) throws Exception {
            URL httpUrl = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
            StringBuilder content = new StringBuilder();
            if (connection.getResponseCode() == 200) {
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String str;
                while ((str = bufferedReader.readLine()) != null) {
                    content.append(str);
                }
                bufferedReader.close();
                return content.toString();
            } else {
                System.err.println(connection.getResponseCode());
            }
            return "";
        }
        
        /**
         * 发送post请求,请求参数为urlencode格式
         * @param url
         * @param params 类似 name=xxx&age=18
         * @return
         * @throws Exception
         */
        public String post(String url, String params) throws Exception {
            URL httpUrl = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
            connection.setRequestProperty("content-type", "application/x-www-form-urlencoded");
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");
            connection.connect();
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
            bufferedWriter.write(params);
            bufferedWriter.flush();
            bufferedWriter.close();
            StringBuilder content = new StringBuilder();
            if (connection.getResponseCode() == 200) {
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String str;
                while ((str = bufferedReader.readLine()) != null) {
                    content.append(str);
                }
                bufferedReader.close();
                return content.toString();
            } else {
                System.err.println(connection.getResponseCode());
            }
            return "";
        }
        
        /**
         * 发送post请求,请求参数为json格式
         * @param url
         * @param params 类似 {"name":"xxx","age":18}
         * @return
         * @throws Exception
         */
        public String postJson(String url, String params) throws Exception {
            URL httpUrl = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
            connection.setRequestProperty("content-type", "application/json;charset=utf-8");
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");
            connection.connect();
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
            bufferedWriter.write(params);
            bufferedWriter.flush();
            bufferedWriter.close();
            StringBuilder content = new StringBuilder();
            if (connection.getResponseCode() == 200) {
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String str;
                while ((str = bufferedReader.readLine()) != null) {
                    content.append(str);
                }
                bufferedReader.close();
                return content.toString();
            } else {
                System.err.println(connection.getResponseCode());
            }
            return "";
        }
  • 相关阅读:
    【LeetCode刷题系列
    【redis 学习系列】API的理解与使用(二)
    【C++】undered_map的用法总结(1)
    【LeetCode刷题系列
    【LeetCode刷题系列
    【LeetCode刷题系列
    【redis 学习系列】API的理解与使用(一)
    【redis 学习系列】安装-配置-卸载Redis
    【centos】/usr/bin与/usr/local/bin的区别
    ROC AUC
  • 原文地址:https://www.cnblogs.com/shizqiang/p/12986249.html
Copyright © 2020-2023  润新知