zoukankan      html  css  js  c++  java
  • Http学习之使用HttpURLConnection发送post和get请求(2)

    接上节 Http学习之使用HttpURLConnection发送post和get请求

    本节深入学习post请求。

    上 节说道,post请求的OutputStream实际上不是网络流,而是写入内存,在getInputStream中才真正把写道流里面的内容作为正文与 根据之前的配置生成的http request头合并成真正的http request,并在此时才真正向服务器发送。

    HttpURLConnection.setChunkedStreamingMode 函数可以改变这个模式,设置了ChunkedStreamingMode后,不再等待OutputStream关闭后生成完整的http request一次过发送,而是先发送http request头,正文内容则是网路流的方式实时传送到服务器。实际上是不告诉服务器http正文的长度,这种模式适用于向服务器传送较大的或者是不容易 获取长度的数据,如文件。下面以一段代码讲解一下,请与Http学习之使用HttpURLConnection发送post和get请求中的readContentFromPost()函数作对比:

        public static void readContentFromChunkedPost() throws IOException {
            URL postUrl = new URL(POST_URL);
            HttpURLConnection connection = (HttpURLConnection) postUrl
                    .openConnection();
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setRequestMethod("POST");
            connection.setUseCaches(false);
            connection.setInstanceFollowRedirects(true);
            connection.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            /*
             * 与readContentFromPost()最大的不同,设置了块大小为5字节
             */
            connection.setChunkedStreamingMode(5);
            connection.connect();
            /*
             * 注意,下面的getOutputStream函数工作方式于在readContentFromPost()里面的不同
             * 在readContentFromPost()里面该函数仍在准备http request,没有向服务器发送任何数据
             * 而在这里由于设置了ChunkedStreamingMode,getOutputStream函数会根据connect之前的配置
             * 生成http request头,先发送到服务器。
             */
            DataOutputStream out = new DataOutputStream(connection
                    .getOutputStream());
            String content = "firstname=" + URLEncoder.encode("一个大肥人                                                                               " +
                    "                                          " +
                    "asdfasfdasfasdfaasdfasdfasdfdasfs", "utf-8");
            out.writeBytes(content); 
    
            out.flush();
            out.close(); // 到此时服务器已经收到了完整的http request了,而在readContentFromPost()函数里,要等到下一句服务器才能收到http请求。
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            
            out.flush();
            out.close(); // flush and close
            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();
        }

    输出

  • 相关阅读:
    MFC关闭子窗口 如何把父窗口也一起关闭
    VS2010创建动态链接库并且使用动态链接库DLL
    Linux文件处理命令
    Centos ftp服务器安装配置
    PHP数字价格格式化,保留两位小数
    PHP中file_put_contents追加和换行
    如何查看Laravel版本号的三种方法
    性能优化系列一:性能优化介绍与优化的范围
    只需两步获取任何微信小程序源码
    前端网页、php与mysql数据库字符编码(解决中文等乱码问题
  • 原文地址:https://www.cnblogs.com/crazylqy/p/4180429.html
Copyright © 2011-2022 走看看