• JAVA URL请求


    使用Java发送GET、POST请求 ——节选自《疯狂Java讲义》
       URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接。程序可以通过URLConnection实例向该URL发送请求、读取URL引用的资源。

    通常创建一个和 URL 的连接,并发送请求、读取此 URL 引用的资源需要如下几个步骤:
    (1)通过调用URL对象openConnection()方法来创建URLConnection对象。
    (2)设置URLConnection的参数和普通请求属性。
    (3)如果只是发送GET方式请求,使用connect方法建立和远程资源之间的实际连接即可;如果需要发送POST方式的请求,需要获取URLConnection实例对应的输出流来发送请求参数。

    (4)远程资源变为可用,程序可以访问远程资源的头字段、或通过输入流读取远程资源的数据。

    在建立和远程资源的实际连接之前,程序可以通过如下方法来设置请求头字段:
    setAllowUserInteraction:设置该URLConnection的allowUserInteraction请求头字段的值。【如果为 true,则在允许用户交互(例如弹出一个验证对话框)的上下文中对此 URL 进行检查】
    setDoInput:设置该URLConnection的doInput请求头字段的值。【设置输入的内容】
    setDoOutput:设置该URLConnection的doOutput请求头字段的值。【设置输出的内容】
    setIfModifiedSince:设置该URLConnection的ifModifiedSince请求头字段的值。
    setUseCaches:设置该URLConnection的useCaches请求头字段的值。

    除此之外,还可以使用如下方法来设置、或增加通用头字段:
    setRequestProperty(String key, String value):设置该URLConnection的key请求头字段的值为value。如下代码所示:
    conn.setRequestProperty("accept" , "*/*")

    addRequestProperty(String key, String value):为该URLConnection的key请求头字段增加value值,该方法并不会覆盖原请求头字段的值,而是将新值追加到原请求头字段中。

    当远程资源可用之后,程序可以使用以下方法用于访问头字段和内容:

    Object getContent():获取该URLConnection的内容。
    String getHeaderField(String name):获取指定响应头字段的值。
    getInputStream():返回该URLConnection对应的输入流,用于获取URLConnection响应的内容。
    getOutputStream():返回该URLConnection对应的输出流,用于向URLConnection发送请求参数。

    注意:如果既要使用输入流读取URLConnection响应的内容,也要使用输出流发送请求参数,一定要先使用输出流,再使用输入流。
    getHeaderField方法用于根据响应头字段来返回对应的值。而某些头字段由于经常需要访问,所以Java提供了以下方法来访问特定响应头字段的值:
    getContentEncoding:获取content-encoding响应头字段的值。
    getContentLength:获取content-length响应头字段的值。
    getContentType:获取content-type响应头字段的值。
    getDate():获取date响应头字段的值。
    getExpiration():获取expires响应头字段的值。
    getLastModified():获取last-modified响应头字段的值。

    下面程序示范了如何向Web站点发送GET请求、POST请求,并从Web站点取得响应的示例。

    1. package com.pl;
    2. import java.io.BufferedReader;
    3. import java.io.IOException;
    4. import java.io.InputStreamReader;
    5. import java.io.PrintWriter;
    6. import java.net.URL;
    7. import java.net.URLConnection;
    8. import java.util.List;
    9. import java.util.Map;
    10. public class TestGetPost {
    11. /**
    12. * 向指定URL发送GET方法的请求
    13. *
    14. * @param url 发送请求的URL
    15. * @param param 请求参数,请求参数应该是name1=value1&name2=value2的形式。
    16. * @return URL所代表远程资源的响应
    17. */
    18. public static String sendGet(String url, String param) {
    19. String result = "";
    20. BufferedReader in = null;
    21. try {
    22. String urlName = url + "?" + param;
    23. URL realUrl = new URL(urlName);
    24. //打开和URL之间的连接
    25. URLConnection conn = realUrl.openConnection();
    26. //设置通用的请求属性
    27. conn.setRequestProperty("accept", "*/*");
    28. conn.setRequestProperty("connection", "Keep-Alive");
    29. conn.setRequestProperty("user-agent",
    30. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
    31. //建立实际的连接
    32. conn.connect();
    33. //获取所有响应头字段
    34. Map> map = conn.getHeaderFields();
    35. //遍历所有的响应头字段
    36. for (String key : map.keySet()) {
    37. System.out.println(key + "--->" + map.get(key));
    38. }
    39. //定义BufferedReader输入流来读取URL的响应
    40. in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    41. String line;
    42. while ((line = in.readLine()) != null) {
    43. result += "\n" + line;
    44. }
    45. } catch (Exception e) {
    46. System.out.println("发送GET请求出现异常!" + e);
    47. e.printStackTrace();
    48. }
    49. //使用finally块来关闭输入流
    50. finally {
    51. try {
    52. if (in != null) {
    53. in.close();
    54. }
    55. } catch (IOException ex) {
    56. ex.printStackTrace();
    57. }
    58. }
    59. return result;
    60. }
    61. /**
    62. * 向指定URL发送POST方法的请求
    63. *
    64. * @param url 发送请求的URL
    65. * @param param 请求参数,请求参数应该是name1=value1&name2=value2的形式。
    66. * @return URL所代表远程资源的响应
    67. */
    68. public static String sendPost(String url, String param) {
    69. PrintWriter out = null;
    70. BufferedReader in = null;
    71. String result = "";
    72. try {
    73. URL realUrl = new URL(url);
    74. //打开和URL之间的连接
    75. URLConnection conn = realUrl.openConnection();
    76. //设置通用的请求属性
    77. conn.setRequestProperty("accept", "*/*");
    78. conn.setRequestProperty("connection", "Keep-Alive");
    79. conn.setRequestProperty("user-agent",
    80. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
    81. //发送POST请求必须设置如下两行
    82. conn.setDoOutput(true);
    83. conn.setDoInput(true);
    84. //获取URLConnection对象对应的输出流
    85. out = new PrintWriter(conn.getOutputStream());
    86. //发送请求参数
    87. out.print(param);
    88. //flush输出流的缓冲
    89. out.flush();
    90. //定义BufferedReader输入流来读取URL的响应
    91. in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    92. String line;
    93. while ((line = in.readLine()) != null) {
    94. result += "\n" + line;
    95. }
    96. } catch (Exception e) {
    97. System.out.println("发送POST请求出现异常!" + e);
    98. e.printStackTrace();
    99. }
    100. //使用finally块来关闭输出流、输入流
    101. finally {
    102. try {
    103. if (out != null) {
    104. out.close();
    105. }
    106. if (in != null) {
    107. in.close();
    108. }
    109. } catch (IOException ex) {
    110. ex.printStackTrace();
    111. }
    112. }
    113. return result;
    114. }
    115. //提供主方法,测试发送GET请求和POST请求
    116. public static void main(String args[]) {
    117. //发送GET请求
    118. //ccs_3 TestGetPost
    119. String s = TestGetPost.sendGet("http://localhost:8888/abc/login.jsp", null);
    120. System.out.println(s);
    121. //发送POST请求
    122. String s1 = TestGetPost.sendPost("http://localhost:8888/abc/a.jsp", "user=李刚&pass=abc");
    123. System.out.println(s1);
    124. }
    125. }

       上面程序中发送GET请求时只需将请求参数放在URL字符串之后,以?隔开,程序直接调用URLConnection对象的connect方法即 可;如果程序需要发送POST请求,则需要先设置doIn和doOut两个请求头字段的值,再使用URLConnection对应的输出流来发送请求参数 即可。

        不管是发送GET请求,还是发送POST请求,程序获取URLConnection响应的方式完全一样:如果程序可以确定远程响应是字符流,则可 以使用字符流来读取;如果程序无法确定远程响应是字符流,则使用字节流读取即可。

    注意:上面程序中发送请求的两个URL是笔者在本机部署的Web应用,由于程序可以使用这种方式直接向服务器发送请求——相当于提交Web应用中的登陆表 单页,这样就可以让程序不断地变换用户名、密码来提交登陆请求,直到返回登陆成功,这就是所谓的暴力破解

  • 相关阅读:
    C++ Qt开发:如何使用信号与槽
    java毕业设计在线考试系统Mybatis+系统+数据库+调试部署
    vue+Vant,关闭Popup弹框,遮罩层并没有消失
    MySQL数据库基本操作-DQL-聚合查询
    流媒体分析之rtmp 协议封装
    Win10 OpenCV编译安装CUDA版本
    【编译原理】-- 第二章(二)(短语、简单短语、句柄、文法二义性、语法树、例题)
    C语言:结构体
    C++中使用R“()“标记符书写多行字符串
    markdown语法简述
  • 原文地址:https://blog.csdn.net/webxscan/article/details/133959180