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

HTTPURLConnection 之 GET POST 学习

阅读更多

最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
在Java中可以使用HttpURLConnection发起这两种请求,了解此类,对于了解soap,和编写servlet的自动测试代码都有很大的帮助。
下面的代码简单描述了如何使用HttpURLConnection发起这两种请求,以及传递参数的方法:


public class HttpInvoker ...{

    public static final String GET_URL = "http://localhost:8080/welcome1";

    public static final String POST_URL = "http://localhost:8080/welcome1";

    public static void readContentFromGet() throws IOException ...{
        // 拼凑get请求的URL字串,使用URLEncoder.encode对特殊和不可见字符进行编码
        String getURL = GET_URL + "?username="
                + URLEncoder.encode("fat man", "utf-8");
        URL getUrl = new URL(getURL);
        // 根据拼凑的URL,打开连接,URL.openConnection函数会根据URL的类型,
        // 返回不同的URLConnection子类的对象,这里URL是一个http,因此实际返回的是HttpURLConnection
        HttpURLConnection connection = (HttpURLConnection) getUrl
                .openConnection();
        // 进行连接,但是实际上get request要在下一句的connection.getInputStream()函数中才会真正发到
        // 服务器
        connection.connect();
        // 取得输入流,并使用Reader读取
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                connection.getInputStream()));
        System.out.println("=============================");
        System.out.println("Contents of get request");
        System.out.println("=============================");
        String lines;
        while ((lines = reader.readLine()) != null) ...{
            System.out.println(lines);
        }
        reader.close();
        // 断开连接
        connection.disconnect();
        System.out.println("=============================");
        System.out.println("Contents of get request ends");
        System.out.println("=============================");
    }

    public static void readContentFromPost() throws IOException ...{
        // Post请求的url,与get不同的是不需要带参数
        URL postUrl = new URL(POST_URL);
        // 打开连接
        HttpURLConnection connection = (HttpURLConnection) postUrl
                .openConnection();
        // Output to the connection. Default is
        // false, set to true because post
        // method must write something to the
        // connection
        // 设置是否向connection输出,因为这个是post请求,参数要放在
        // http正文内,因此需要设为true
        connection.setDoOutput(true);
        // Read from the connection. Default is true.
        connection.setDoInput(true);
        // Set the post method. Default is GET
        connection.setRequestMethod("POST");
        // Post cannot use caches
        // Post 请求不能使用缓存
        connection.setUseCaches(false);
        // This method takes effects to
        // every instances of this class.
        // URLConnection.setFollowRedirects是static函数,作用于所有的URLConnection对象。
        // connection.setFollowRedirects(true);

        // This methods only
        // takes effacts to this
        // instance.
        // URLConnection.setInstanceFollowRedirects是成员函数,仅作用于当前函数
        connection.setInstanceFollowRedirects(true);
        // Set the content type to urlencoded,
        // because we will write
        // some URL-encoded content to the
        // connection. Settings above must be set before connect!
        // 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的
        // 意思是正文是urlencoded编码过的form参数,下面我们可以看到我们对正文内容使用URLEncoder.encode
        // 进行编码
        connection.setRequestProperty("Content-Type",
                "application/x-www-form-urlencoded");
        // 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,
        // 要注意的是connection.getOutputStream会隐含的进行connect。
        connection.connect();
        DataOutputStream out = new DataOutputStream(connection
                .getOutputStream());
        // The URL-encoded contend
        // 正文,正文内容其实跟get的URL中'?'后的参数字符串一致
        String content = "firstname=" + URLEncoder.encode("一个大肥人", "utf-8");
        // DataOutputStream.writeBytes将字符串中的16位的unicode字符以8位的字符形式写道流里面
        out.writeBytes(content);

        out.flush();
        out.close(); // flush and close
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                connection.getInputStream()));
        String line;
        System.out.println("=============================");
        System.out.println("Contents of post request");
        System.out.println("=============================");
        while ((line = reader.readLine()) != null) ...{
            System.out.println(line);
        }
        System.out.println("=============================");
        System.out.println("Contents of post request ends");
        System.out.println("=============================");
        reader.close();
        connection.disconnect();
    }

    /** *//**
     * @param args
     */
    public static void main(String[] args) ...{
        // TODO Auto-generated method stub
        try ...{
            readContentFromGet();
            readContentFromPost();
        } catch (IOException e) ...{
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
上面的readContentFromGet()函数产生了一个get请求,传给servlet一个username参数,值为"fat man"。
readContentFromPost()函数产生了一个post请求,传给servlet一个firstname参数,值为"一个大肥人"。
HttpURLConnection.connect函数,实际上只是建立了一个与服务器的tcp连接,并没有实际发送http请求。无论是post还是get,http请求实际上直到HttpURLConnection.getInputStream()这个函数里面才正式发送出去。

在readContentFromPost()中,顺序是重中之重,对connection对象的一切配置(那一堆set函数)都必须要在connect()函数执行之前完成。而对outputStream的写操作,又必须要在inputStream的读操作之前。这些顺序实际上是由http请求的格式决定的。

http请求实际上由两部分组成,一个是http头,所有关于此次http请求的配置都在http头里面定义,一个是正文content,在connect()函数里面,会根据HttpURLConnection对象的配置值生成http头,因此在调用connect函数之前,就必须把所有的配置准备好。

紧接着http头的是http请求的正文,正文的内容通过outputStream写入,实际上outputStream不是一个网络流,充其量是个字符串流,往里面写入的东西不会立即发送到网络,而是在流关闭后,根据输入的内容生成http正文。

至此,http请求的东西已经准备就绪。在getInputStream()函数调用的时候,就会把准备好的http请求正式发送到服务器了,然后返回一个输入流,用于读取服务器对于此次http请求的返回信息。由于http请求在getInputStream的时候已经发送出去了(包括http头和正文),因此在getInputStream()函数之后对connection对象进行设置(对http头的信息进行修改)或者写入outputStream(对正文进行修改)都是没有意义的了,执行这些操作会导致异常的发生。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pandazxx/archive/2007/06/18/1657109.aspx

 

分享到:
评论

相关推荐

    网络请求----HttpURLConnection的get,post和图片加载

    下面我们将深入探讨HttpURLConnection的get、post方法以及图片加载的相关知识点。 1. HttpURLConnection GET请求: GET请求是最基础的HTTP请求方法,常用于获取服务器上的资源。使用HttpURLConnection进行GET请求...

    androd httpurlconnection(工具类) get post t

    这个Demo主要展示了如何使用HTTPUrlConnection进行GET和POST请求,以及图片的下载操作。下面将详细讲解这些知识点。 首先,我们来看GET请求。GET是HTTP协议中最常见的请求方法,通常用于获取服务器上的资源。在...

    Http学习之使用HttpURLConnection发送post和get请求 android

    本篇文章主要聚焦于使用`HttpURLConnection`类...总结,本文介绍了使用`HttpURLConnection`在Android中发送GET和POST请求的基本步骤,以及需要注意的关键点。理解这些概念有助于开发者在构建网络功能时做出明智的选择。

    Android httpUrlConnection Post方式访问网络简单demo

    2. **设置请求方法**:默认情况下,`HttpURLConnection`会使用GET方法,但我们需要POST,所以需要调用`setRequestMethod("POST")`。 3. **允许输出**:POST请求需要向服务器发送数据,因此需要调用`setDoOutput...

    android使用Java原生httpUrlConnection进行get请求

    在Android开发中,Java的HttpURLConnection是用于网络通信的一个基础组件,它提供了HTTP协议的低级别接口,可以用来执行GET、POST以及其他HTTP方法。在这个场景下,我们将详细探讨如何使用Java原生的...

    Android中使用HttpURLConnection实现GET POST JSON数据与下载图片

    本文将详细介绍如何使用HttpURLConnection在Android中进行GET请求JSON数据、POST提交JSON数据以及下载图片。 1. GET请求JSON数据 GET请求是最基本的HTTP方法,用于从服务器获取资源。以下是一个使用...

    android使用HTTPURLconnection/get方法访问HTTP

    3. **设置请求方法**:默认情况下,`HttpURLConnection`使用POST方法,但我们需要设置为GET方法: ```java connection.setRequestMethod("GET"); ``` 4. **设置连接属性**:你可以根据需要设置一些连接属性,如...

    HttpURLConnectionTest_Get_Post(绝对可以用)

    在`HttpURLConnectionTest_Get_Post`这个项目中,可能包含了示例代码,演示了如何使用`HttpURLConnection`进行GET和POST操作。代码可能包括了如何处理请求头(如设置Content-Type、Accept等)、如何处理重定向、如何...

    HttpUtils Java get post 工具类

    "HttpUtils Java get post 工具类" 提供了便捷的方法来发送GET和POST请求,简化了网络请求的操作。以下是对这两个主要HTTP方法的详细解释以及如何在Java中实现它们。 **1. GET方法** GET是HTTP中最常见的请求方法,...

    安卓网络通信之通过GET和POST方式提交参数给web应用

    使用`HttpURLConnection`进行POST请求的流程与GET类似,但有几点不同: 1. 在设置请求方法为`POST`之后,需要使用`setDoOutput(true)`开启输出流。 2. 使用`getOutputStream()`获取输出流,然后写入要发送的数据。...

    HttpUrlConnection使用示例

    在Java编程中,`HttpURLConnection`是用于处理HTTP协议的标准API,它位于`java.net`包下...通过学习和实践这些示例,你可以更好地理解和掌握如何在Java中利用`HttpURLConnection`进行HTTP通信,尤其在处理POST请求时。

    java 实现get,post请求

    总结,Java实现HTTP的GET和POST请求主要依赖于`HttpURLConnection`类。GET请求简单,直接连接并读取响应;POST请求需要设置输出,并写入请求数据。在处理网络请求时,我们还需要关注网络状态、超时、重试策略等问题...

    java后台实现 get post 提交.zip

    在Java后端开发中,GET和POST是两种最常见的HTTP请求...如果你想要深入学习Java后端开发,理解并熟练运用GET和POST请求是非常基础且关键的一步。通过阅读和实践这些代码,你将能更好地掌握Java后台处理HTTP请求的方法。

    HttpURLConnection之基础

    在这个主题中,我们将深入探讨`HttpURLConnection`的基础知识,包括如何发送GET和POST请求。 ### 1. `HttpURLConnection`概述 `HttpURLConnection`继承自`java.net.URLConnection`,它是Java API中的一个抽象类,...

    service_java接口远程调用_get、post、带参数远程调用_

    可以使用`HttpURLConnection`或`HttpClient`模拟POST请求,但设置请求方法为GET: ```java HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); ...

    android基础 - POST GET

    一、POST与GET方法的区别 1. 工作原理: - GET:请求参数附加在URL后面,通过?分隔,再用&连接各个参数。这种方式限制了URL长度,不适合传递大量数据或敏感信息。 - POST:请求参数放在请求体中,不受URL长度...

    服务器端测试GET、POST

    对于Android前端,可以使用HttpURLConnection或OkHttp等库来发送GET和POST请求。在发送POST请求时,需设置请求体的字符编码,并在发送前添加请求头。在服务器端,比如使用Java的Servlet,需要正确解析请求体,确保...

    get 和post 实例

    在Android中,实现GET和POST请求,我们可以使用`HttpURLConnection`、`HttpClient`(已废弃但仍然可用)或者第三方库如Retrofit、Volley等。以下是一个基于HttpClient的简单示例: ```java // 创建HttpClient实例 ...

    android httpget post

    在实际应用中,POST请求相比GET请求通常能传输更多和更复杂的数据,因为GET请求的URL长度有限制,而POST数据则不受此限制。然而,POST请求不会被浏览器缓存,且可能在某些情况下留下访问记录,安全性相对较低。 ...

Global site tag (gtag.js) - Google Analytics