Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1831|回复: 0

[网络编程学习]向指定URL发送GET/POST请求

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

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

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

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

       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/6/000417765.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 10:37 , Processed in 0.332250 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表