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();
        }

    输出

  • 相关阅读:
    curl库使用文件传输
    linux 命令
    第三方库交叉编译
    指针越界
    GetWindowRect GetClientRect
    libevent
    C#关闭窗体
    C# log日志窗口
    C++同一时刻仅允许一个实例,包含多用户的场景。
    C# 引用类型
  • 原文地址:https://www.cnblogs.com/crazylqy/p/4180429.html
Copyright © 2011-2022 走看看