`
tonysmith
  • 浏览: 175027 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用Java发送GET、POST请求

Web 
阅读更多
使用Java发送GET、POST请求
——节选自《疯狂Java讲义》
URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接。程序可以通过URLConnection实例向该URL发送请求、读取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)远程资源变为可用,程序可以访问远程资源的头字段、或通过输入流读取远程资源的数据。
在建立和远程资源的实际连接之前,程序可以通过如下方法来设置请求头字段:
qsetAllowUserInteraction:设置该URLConnection的allowUserInteraction请求头字段的值。
qsetDoInput:设置该URLConnection的doInput请求头字段的值。
qsetDoOutput:设置该URLConnection的doOutput请求头字段的值。
qsetIfModifiedSince:设置该URLConnection的ifModifiedSince请求头字段的值。
qsetUseCaches:设置该URLConnection的useCaches请求头字段的值。
除此之外,还可以使用如下方法来设置、或增加通用头字段:
qsetRequestProperty(String key, String value):设置该URLConnection的key请求头字段的值为value。如下代码所示:
conn.setRequestProperty("accept" , "*/*")
qaddRequestProperty(String key, String value):为该URLConnection的key请求头字段的增加value值,该方法并不会覆盖原请求头字段的值,而是将新值追加到原请求头字段中。
当远程资源可用之后,程序可以使用以下方法用于访问头字段和内容:

qObject getContent():获取该URLConnection的内容。
qString getHeaderField(String name):获取指定响应头字段的值。
qgetInputStream():返回该URLConnection对应的输入流,用于获取URLConnection响应的内容。
qgetOutputStream():返回该URLConnection对应的输出流,用于向URLConnection发送请求参数。
注意:如果既要使用输入流读取URLConnection响应的内容,也要使用输出流发送请求参数,一定要先使用输出流,再使用输入流。
getHeaderField方法用于根据响应头字段来返回对应的值。而某些头字段由于经常需要访问,所以Java提供了以下方法来访问特定响应头字段的值:
qgetContentEncoding:获取content-encoding响应头字段的值。
qgetContentLength:获取content-length响应头字段的值。
qgetContentType:获取content-type响应头字段的值。
qgetDate():获取date响应头字段的值。
qgetExpiration():获取expires响应头字段的值。
qgetLastModified():获取last-modified响应头字段的值。
下面程序示范了如何向Web站点发送GET请求、POST请求,并从Web站点取得响应的示例。

/**
 * @author TONY
 *
 */
public class TestGetPost {
    /**
     * 向指定URL发送GET方法的请求
     *
     * @param url
     *            发送请求的URL
     * @param param
     *            请求参数,请求参数应该是name1=value1&name2=value2的形式。
     * @return URL所代表远程资源的响应
     */
    public String sendGet(String url, String param) {
        String result = "";
        BufferedReader in = null;
        try {
            String urlName = url + "?" + param;
            URL realUrl = new URL(urlName);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
            // 建立实际的连接
            conn.connect();
            // 获取所有响应头字段
            Map<String, List<String>> map = conn.getHeaderFields();
            // 遍历所有的响应头字段
            for (String key : map.keySet()) {
                System.out.println(key + "--->" + map.get(key));
            }
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(
                    new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += "\n" + line;
            }
        } catch (Exception e) {
            System.out.println("发送GET请求出现异常!" + e);
            e.printStackTrace();
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 向指定URL发送POST方法的请求
     *
     * @param url
     *            发送请求的URL
     * @param param
     *            请求参数,请求参数应该是name1=value1&name2=value2的形式。
     * @return URL所代表远程资源的响应
     */
    public String sendPost(String url,String param) {   
        String result = "";
        String urlName = url+"?"+param;       
       
        URL realUrl;
        try {
            realUrl = new URL(urlName);       
            URLConnection conn;
       
            conn = realUrl.openConnection();
       
       
            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
           
            conn.connect();
           
            OutputStream out = conn.getOutputStream();
            out.write("".getBytes());
            out.flush();
            out.close();
                   
            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line = "";
            while ((line = reader.readLine())!= null){
                result += "\n" + line;
            }
       
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return result;
    }

// 提供主方法,测试发送GET请求和POST请求
    public static void main(String args[]) {
        // 发送GET请求
        String s = TestGetPost.sendGet("http://localhost:8888/abc/login.jsp",
                null);
        System.out.println(s);
        // 发送POST请求
        String s1 = TestGetPost.sendPost("http://localhost:8888/abc/a.jsp",
                "user=李刚&pass=abc");
        System.out.println(s1);

    }
}

上面程序中发送GET请求时只需将请求参数放在URL字符串之后,以?隔开,程序直接调用URLConnection对象的connect方法即可,如程 序中sendGet方法中粗体字代码所示;如果程序需要发送POST请求,则需要先设置doIn和doOut两个请求头字段的值,再使用 URLConnection对应的输出流来发送请求参数即可,如程序中sendPost方法中粗体字代码所示。
不管是发送GET请求,还是发送POST请求,程序获取URLConnection响应的方式完全一样:如果程序可以确定远程响应是字符流,则可以使用字符流来读取;如果程序无法确定远程响应是字符流,则使用字节流读取即可。
注意:上面程序中发送请求的两个URL是笔者在本机部署的Web应用,关于如何创建Web应用、编写JSP页面请参考笔者所著的《轻量级J2EE企业应用 实战》。由于程序可以使用这种方式直接向服务器发送请求——相当于提交Web应用中的登陆表单页,这样就可以让程序不断地变换用户名、密码来提交登陆请 求,直到返回登陆成功,这就是所谓的暴力破解。

分享到:
评论

相关推荐

    使用java发送get和post请求实践

    在 Java 中发送 GET 和 POST 请求是非常常见的操作,今天我们将通过使用 Apache HttpClient 库来实现这些操作。 什么是 Apache HttpClient 库? Apache HttpClient 库是 Apache 软件基金会提供的一个开源库,用于...

    java HttpClient 发送GET请求和带有表单参数的POST请求教程例子

    ### Java HttpClient 发送GET请求和带有表单参数的POST请求详解 ...通过上述示例和解释,你应该能够理解和掌握如何使用Java HttpClient库来发送GET和POST请求,这对于开发Web应用程序或与API接口交互至关重要。

    java实现get请求post请求,文件传输

    java实现get请求post请求,文件传输 /** * 发送https请求 * @param requestUrl 请求地址 * @param requestMethod 请求方式(GET、POST) * @param outputStr 提交的数据 * @return 返回微信服务器响应的信息 ...

    java发送http/https请求(get/post)代码

    本文将详细讲解如何使用Java发送GET和POST请求,以及涉及的HTTPS安全连接。 首先,理解HTTP和HTTPS的区别至关重要。HTTP(超文本传输协议)是一种用于分发超媒体信息的应用层协议,而HTTPS(超文本传输安全协议)是...

    java发送http/https请求(get/post)Demo,亲测可用

    这里我们将深入探讨如何使用Java发送GET和POST请求,以及处理JSON数据。 首先,让我们关注GET请求。GET请求主要用于从服务器获取资源,其参数通常包含在URL中。在Java中,可以使用`HttpURLConnection`类或者第三方...

    后台模拟发送GET和POST请求

    本文将深入探讨如何利用Java的HttpClient库在后台模拟发送GET和POST请求,以及如何处理中文乱码问题。 首先,我们来理解GET和POST两种请求方法。GET请求通常用于获取服务器上的资源,它将参数附加到URL中,具有可...

    java 发送get ,post请求,高效便捷,并发性强,原生代码

    java发送get,post请求,可以实现与后台交互,代码便捷高效,是原生代码,支持并发性;代码结构清晰易懂,容易上手;

    Java发送post,get请求

    java模拟HTTP发送post和get请求工具类,使用httpClient类

    java发送get或post请求源码

    这里我们将介绍如何使用这两个类以及`java.io`包中的相关类来构建GET和POST请求。 1. **发送GET请求**: GET请求通常用于获取资源,参数包含在URL中。以下是一个简单的示例: ```java import java.io....

    https的get和post请求,去除ssl校验的java工具类

    java的get和post请求,获取json的工具类,https时会存在ssl校验的问题,工具会自动去除ssl校验。

    java通过HTTP调用接口(Get请求和Post请求)

    java调用HTTP接口(Get请求和Post请求)

    java后台实现 get post 提交.zip

    在Java中,我们通常使用`java.net.URL`和`java.net.HttpURLConnection`来发送GET请求。以下是一个简单的示例: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net....

    HttpClient(用CloseableHttpClient发送get/post请求)

    HttpClient(用CloseableHttpClient发送get/post请求)

    java 实现get,post请求

    本篇文章将详细介绍如何在Java中实现GET和POST请求,以及相关的知识点。 首先,我们要了解GET和POST的区别。GET请求通常用于获取资源,其参数附加在URL后面,是可见的,且对数据长度有限制,一般不超过2KB。而POST...

    java发送post和get请求源码及jar包

    这两个例子展示了如何使用Java内置的HttpURLConnection类发送GET和POST请求。然而,对于更复杂的场景,如管理cookies、重定向、超时控制等,使用Apache HttpClient或OkHttp等第三方库可能会更方便和强大。 在实际...

    Java发送HTTP请求GET/POST测试

    在Java中,我们可以使用`java.net.URL`和`java.net.HttpURLConnection`类来发送GET请求。首先创建URL对象,然后通过openConnection()方法获取HttpURLConnection实例,设置请求方法为GET,并通过connect()方法建立...

    java使用url发送post和get请求:HttpConnUtils.jar

    - POST请求用于向服务器发送数据,通常用于表单提交、文件上传等场景。数据包含在请求体中。 - `HttpConnUtils.jar`的`sendPostRequest()`方法可能接收URL、请求参数和可能的请求头。它使用`setDoOutput(true)`...

    java 发送https 请求 证书

    3. **发送HTTPS请求**:现在你可以使用HttpClient发送GET或POST请求了: ```java HttpGet request = new HttpGet("https://your.server.com/path"); HttpResponse response = httpClient.execute(request); int ...

    httpclient用法,发送get和post请求,设置header

    httpclient的用法,发送get请求和post请求,设置header

    HttpClient模拟get,post请求并发送请求参数(json等)

    // 执行POST请求 // 返回响应对象 } } ``` 通过以上介绍,我们可以看出HttpClient是一个强大的工具,可以帮助开发者轻松地进行HTTP请求。无论是在测试API接口,还是在集成外部服务,HttpClient都是一个值得信赖...

Global site tag (gtag.js) - Google Analytics