欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java 使用GET和POST方式提交HttpURLConnection请求

程序员文章站 2022-05-04 09:56:17
...

      Java调用接口进行获取对方服务器的数据在开发中特别常见,在实际开发过程中,很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信、天气等)或者测试自己写的接口。

      那么Java如何调用接口?==》通过 HttpURLConnection建立实际的连接,交换数据。

 

     URLEncoder 和 URLDecoder用于完成普通字符串和 application/x-www-form-urlencoded MIME字符串之间的相互转换.

在接收端,这样设置参数:编码:"UTF-8"

String content = "字段名1=" + URLEncoder.encode("字符串值1", "编码")+"&字段名2=" + URLEncoder.encode("字符串值2", "编码");

在接收端,这样获取参数:

String name = request.getParameter("account");
String pswd = request.getParameter("pswd"); 
System.out.println(new String(name.getBytes("iso-8859-1"),"UTF-8"));
System.out.println(new String(pswd.getBytes("iso-8859-1"),"UTF-8"));

 

一、 使用GET方式和POST提交HttpURLConnection请求

     这里简单创建两个springboot的项目 ,编码使用UTF-8,做测试

1、HttpURLUtil的模板工具类

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;


public class HttpURLUtil {
    /**
     * 向指定URL发送GET方法的请求
     *
     * @param url   发送请求的URL
     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @return URL 所代表远程资源的响应结果
     */
    public static String sendGet(String url, String param) {
        String result = "";
        BufferedReader in = null;
        HttpURLConnection connection = null;
        try {
            URL getUrl = new URL(url + "?" + param);
            // 打开和URL之间的连接
            connection = (HttpURLConnection) getUrl.openConnection();

            // 在connect之前,设置通用的请求属性
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            connection.setRequestProperty("Charsert", "UTF-8");

            // 配置本次连接的Content-type,form表单是"application/x-www-form-urlencoded",json是"application/json"等
            // 根据需求自己调整Content-type
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            // 设置连接主机服务器的超时时间:15000毫秒
            connection.setConnectTimeout(15000);
            // 设置读取远程返回的数据时间:60000毫秒
            connection.setReadTimeout(60000);
            // 设置连接方式:get
            connection.setRequestMethod("GET");
            // 建立实际的连接,注意connection.getOutputStream会隐含的进行connect。
            connection.connect();

            // 获取所有响应头字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 遍历所有的响应头字段
            for (String key : map.keySet()) {
                System.out.println(key + "--->" + map.get(key));
            }

            // 定义BufferedReader输入流来读取URL的响应
            if (connection.getResponseCode() == 200) {
                in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
                String line;
                while ((line = in.readLine()) != null) {
                    result += line;
                }
            }
        } catch (Exception e) {
            System.out.println("发送GET请求出现异常!" + e);
            e.printStackTrace();
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
                if (connection != null) {
                    //关闭连接
                    connection.disconnect();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 向指定 URL 发送POST方法的请求
     *
     * @param url   发送请求的 URL
     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @return 所代表远程资源的响应结果
     */
    public static String sendPost(String url, String param) {
        String result = "";
        PrintWriter out = null;
        BufferedReader in = null;
        HttpURLConnection connection = null;
        try {
            URL postUrl = new URL(url);
            // 打开和URL之间的连接
            connection = (HttpURLConnection) postUrl.openConnection();

            // 在connect之前,设置通用的请求属性
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            connection.setRequestProperty("Charsert", "UTF-8");

            connection.setConnectTimeout(15000);
            connection.setReadTimeout(60000);
            // 发送POST请求必须设置如下两行,参数要放在http正文内
            connection.setDoOutput(true);
            connection.setDoInput(true);
            // 默认是 GET方式
            connection.setRequestMethod("POST");
            // Post 请求不使用缓存
            connection.setUseCaches(false);
            // 配置本次连接的Content-type,form表单是"application/x-www-form-urlencoded",json是"application/json"等
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.connect();

            //1.获取URLConnection对象对应的输出流
            out = new PrintWriter(connection.getOutputStream());
            //2.中文有乱码的需要将PrintWriter改为如下
            //out=new OutputStreamWriter(conn.getOutputStream(),"UTF-8")
            // 发送请求参数
            out.print(param);
            // flush输出流的缓冲
            out.flush();

            // 定义BufferedReader输入流来读取URL的响应
            if (connection.getResponseCode() == 200) {
                in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
                String line;
                while ((line = in.readLine()) != null) {
                    result += line;
                }
            }
        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常!" + e);
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
                if (connection != null) {
                    //关闭连接
                    connection.disconnect();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return result;
    }

}

2、两个项目中的controller测试:

     中文乱码这里也做了数据

    @GetMapping("/sendHttpURL")
    @ResponseBody
    public String sendHttpURL() throws UnsupportedEncodingException {
        //发送 GET 请求
        String paramGet =  "v1=123456"+"&v2=" + URLEncoder.encode("发送 GET 请求", StandardCharsets.UTF_8.name());
        String s = HttpURLUtil.sendGet("http://127.0.0.1/sbt_javademo/receiveURLGet", paramGet);
        System.out.println(s);

        //发送 POST 请求
//        String paramPost =  "v3=45678"+"&v4=" + URLEncoder.encode("发送 POST 请求", StandardCharsets.UTF_8.name());
        String paramPost =  "v3=45678"+"&v4=发送 POST 请求";
        String sr = HttpURLUtil.sendPost("http://127.0.0.1/sbt_javademo/receiveURLPost", paramPost);
        System.out.println(sr);

        return s + "\n" + sr;
    }
    @GetMapping("/receiveURLGet")
    @ResponseBody
    public ResponseEntity<Map<String,Object>> receiveURLGet(String v1, String v2) {
        System.out.println("v1:" + v1 + " == v2:" + v2);
        Map<String, Object> map = new HashMap<>();
        map.put("code", 20000);
        map.put("data", "接受 GET 请求");
        return ResponseEntity.ok(map);
    }
    @PostMapping("/receiveURLPost")
    @ResponseBody
    public ResponseEntity<Map<String,Object>> receiveURLPost(HttpServletRequest request, String v3, String v4) {
        System.out.println("v3:" + v3 + " == v4:" + v4);
        Map<String, Object> map = new HashMap<>();
        map.put("code", 20000);
        map.put("data", "接受 POST 请求");
        return ResponseEntity.ok(map);
    }

3、结果内容:

     这里 Content-Type的类型,都使用的是表单“application/x-www-form-urlencoded”,根据需求自己调整

     Java 使用GET和POST方式提交HttpURLConnection请求

 

对于一些知识点进行整理和归纳,这样容易对比加深记忆,总结:

1)URL url= new URL(url);

2)获取connection,并设置相应的请求属性

3)特别注意设置对应的GET/POST请求方式,Content-Type的数据类型,参数的形式

4)建立实际的连接,通过输入输出流的方式交换数据

5)最后,关闭流和关闭连接connection。

 

二、请求及属性的一些知识点

     Java 使用GET和POST方式提交HttpURLConnection请求

1、HttpServletRequset和HttpServletResponse的知识点:

     Servlet的继承体系与HttpServletRequset和HttpServletResponse

2、Request的相关方法:

getContextPath():这个方法返回的是web应用映射的虚拟目录地址:如ServletDemo应用的虚拟目录是:/ServletDemo

getCookies():这个方法返回的是一个Cookies[],因为用户在请求的时候会携带很多的cookie,关于Cookie的相关知识

getHeader(String name)/getIntHeader(String name)/getDateHeader(String name):
这些方法是获取请求头信息的,只是针对不同的类型的,有字符串类型的,时间类型,数值类型的

getHeaderNames():这个方法是获取所有请求头的字段名称

getHeaders(String name):这个方法是获取一个请求头字段的所有值,因为有时候可能会有相同请求头字段信息,不会覆盖的

getMethod():这个方法是获取客户机的请求方法

getQueryString():这个方法是获取用户请求时的查询参数的,即url后面携带的参数

getRequestSessionId():这个方法是获取客户机在请求的时候携带的sessionid值,有关session的相关知识,后面会详解

getRequestURL():这个方法是获取客户机请求的url

getServletPath():这个方法返回的是请求的Servlet的映射路径,比如:ServletRequest映射的是是/ServletRequest

getServerName()/getServerPort():这两个方法是获取服务器的名称和端口号,比如localhost,8080

getSession()/getSession(boolean mode):这两个方法是获取一个session对象,相关之后在session篇会说到

getAttribute(String name):这个方法是从Request域中获取值

getAttributeNames():这个方法是获取Request域中获取所有的字段名称

getParameter(String name):这个方法是获取用户使用get/post方式携带的参数值

getParameterNames():这个方法是获取用户请求时携带的所有参数名称

getParameterMap():这个方法是获取用户请求时携带的参数名称和参数值,并将其组装成一个Map对象

getParameterValues():这个方法是获取用户请求携带的参数值,因为有时候一个参数名称可能对应多个值

setAttribute(String name,Object value):这个方法是设置Request域中的属性值

removeAttribute(String name):这个方法是删除Request域中的属性值

getInputStream()/getReader():
这个方法是获取用户请求的时候上传的输入流,比如我们在处理用户上传文件的时候。需要用到这个输入流

setCharacterEncoding(String name):这个方法是设置Request容器的编码

getRemoteAddr()/getRemoteHost():获取客户机的IP地址和主机名

getProctocol():获取协议名称

getRequestDispatcher(String path):获取一个转发对象RequestDispatcher,进行转发操作

3、常用的HTTP请求头与响应头(很详细,感谢作者):

     JavaWeb - 常用的HTTP请求头与响应头

 

ends~

相关标签: Java进阶