精华内容
下载资源
问答
  • URLConnection

    2015-07-28 15:03:20
    URLConnection
    String httpUrl = "http://apis.baidu.com/apistore/idservice/id";
    String httpArg = "id=420984198704207896";
    String jsonResult = request(httpUrl, httpArg);
    System.out.println(jsonResult);
    
    /**
     * @param urlAll
     *            :请求接口
     * @param httpArg
     *            :参数
     * @return 返回结果
     */
    public static String request(String httpUrl, String httpArg) {
        BufferedReader reader = null;
        String result = null;
        StringBuffer sbf = new StringBuffer();
        httpUrl = httpUrl + "?" + httpArg;
    
        try {
            URL url = new URL(httpUrl);
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            connection.setRequestMethod("GET");
            // 填入apikey到HTTP header
            connection.setRequestProperty("apikey",  "您自己的apikey");
            connection.connect();
            InputStream is = connection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            String strRead = null;
            while ((strRead = reader.readLine()) != null) {
                sbf.append(strRead);
                sbf.append("\r\n");
            }
            reader.close();
            result = sbf.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    


    http://apistore.baidu.com/apiworks/servicedetail/113.html

    展开全文
  • URLconnection

    2018-04-20 18:22:00
    URLconnection 开发中最常用的两种网络请求:  1、标准Java接口(java.NET) —-HttpURLConnection,可以实现简单的基于URL请求、响应功能; 2、Apache接口(org.appache.http)—-HttpClient,使用起来更方面更强大...

    URLconnection

    开发中最常用的两种网络请求:

      1、标准Java接口(java.NET) —-HttpURLConnection,可以实现简单的基于URL请求、响应功能; 
      2、Apache接口(org.appache.http)—-HttpClient,使用起来更方面更强大。

    本文重点是URLConnection:

    URLConnection继承体系如下

    URLConnection类本身依赖于Socket类实现网络连接。一般认为,URLConnection类提供了比Socket类更易于使用、更高级的网络连接抽象。

    抽象类 URLConnection 是所有类的超类,它代表应用程序和 URL 之间的通信链接。此类的实例可用于读取和写入此 URL 引用的资源。URLConnection 基于Http协议。通常,创建一个到 URL 的连接需要几个步骤:

    openConnection()connect()
    对影响到远程资源连接的参数进行操作。 与资源交互;查询头字段和内容。

    1. 通过在 URL 上调用 openConnection 方法创建连接对象。 
    2. 处理设置参数和一般请求属性。 
    3. 使用 connect 方法建立到远程对象的实际连接。 
    4. 远程对象变为可用。远程对象的头字段和内容变为可访问。

    使用以下方法修改设置参数:

    • setAllowUserInteraction 设置此 URLConnection 的 allowUserInteraction 字段的值
    • setDoInput 将此 URLConnection 的 doInput 字段的值设置为指定的值。
    • setDoOutput 将此 URLConnection 的 doOutput 字段的值设置为指定的值。
    • setIfModifiedSince 将此 URLConnection 的 ifModifiedSince 字段的值设置为指定的值。
    • setUseCaches 将此 URLConnection 的 useCaches 字段的值设置为指定的值
    • setConnectTimeout 设置一个指定的超时值(以毫秒为单位),该值将在打开到此 URLConnection 引用的资源的通信链接时使用。
    • setReadTimeout 将读超时设置为指定的超时值,以毫秒为单位。

    使用 setDefaultAllowUserInteraction 和 setDefaultUseCaches 可设置 AllowUserInteraction 和 UseCaches 参数的默认值。

    使用以下方法修改一般请求属性:

    • setRequestProperty 设置一般请求属性。
    • addRequestProperty 添加由键值对指定的一般请求属性。

    上面每个 set 方法都有一个用于获取参数值或一般请求属性值的对应 get 方法。 
    例如 
    - getDoInput() 
    - getIfModifiedSince()

    在建立到远程对象的连接后,以下方法用于访问头字段和内容:

    • getContent 获取此 URL 连接的内容。
    • getHeaderField 返回指定的头字段的值。
    • getInputStream 返回从此打开的连接读取的输入流。
    • getOutputStream 返回写入到此连接的输出流。

    某些头字段需要经常访问。以下方法:

    • getContentEncoding 返回 content-encoding 头字段的值。
    • getContentLength 返回 content-length 头字段的值。
    • getContentType 返回 content-type 头字段的值。
    • getDate 返回 date 头字段的值。
    • getExpiration 返回 expires 头字段的值。
    • getLastModifed 返回 last-modified 头字段的值。

    URLConnection类的使用

    发送GET请求示例代码

    1.通过在 URL 上调用 openConnection 方法创建连接对象。 
    2.处理设置参数和一般请求属性。 
    3.使用 connect 方法建立到远程对象的实际连接。 
    4.远程对象变为可用。远程对象的头字段和内容变为可访问。
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.List;
    import java.util.Map;
    
    public class URLConnectionGet {
    
        public static void main(String[] args) {
            // TODO 自动生成的方法存根
    
            System.out.println(doGet("http://www.baidu.com",""));
    
        }
    
        public static String doGet(String geturl,String params) {
            String realUrl=geturl+"?"+params;
    
            try {
                //1.通过在 URL 上调用 openConnection 方法创建连接对象
                URL url=new URL(realUrl);
                URLConnection conn=url.openConnection();
    
                //2.处理设置参数和一般请求属性
                //2.1设置参数
                //可以根据请求的需要设置参数 
                conn.setUseCaches(false);
                conn.setConnectTimeout(5000); //请求超时时间
    
                //2.2请求属性 
                //设置通用的请求属性 更多的头字段信息可以查阅HTTP协议
                conn.setRequestProperty("accept", "*/*");
                conn.setRequestProperty("connection", "Keep-Alive");
    
                //3.使用 connect 方法建立到远程对象的实际连接。 
                conn.connect();
    
                //4.远程对象变为可用。远程对象的头字段和内容变为可访问。 
                //4.1获取响应的头字段
                Map<String, List<String>> headers=conn.getHeaderFields();
                System.out.println(headers); //输出头字段
    
                //4.2获取响应正文
                BufferedReader reader = null;
                StringBuffer resultBuffer = new StringBuffer();
                String tempLine = null;
    
                reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                while ((tempLine = reader.readLine()) != null) {
                    resultBuffer.append(tempLine);
                }
                //System.out.println(resultBuffer);
                reader.close();
                return resultBuffer.toString();
            } catch (MalformedURLException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
            finally {
    
            }
            return null;
    
        }
    }
    View Code

     

    发送POST请求示例代码

    1.通过在 URL 上调用 openConnection 方法创建连接对象。 
    2.处理设置参数和一般请求属性,获取URLconnection实例对应的输出流来发送数据。 
    3.使用 connect 方法建立到远程对象的实际连接。 
    4.远程对象变为可用。远程对象的头字段和内容变为可访问。
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.List;
    import java.util.Map;
    
    public class URLConnectionPost {
    
        public static void main(String[] args) {
            // TODO 自动生成的方法存根
    
            System.out.println();
    
        }
    
        public static String doPost(String posturl,String params) {
    
    
            try {
                //1.通过在 URL 上调用 openConnection 方法创建连接对象
                URL url=new URL(posturl);
                URLConnection conn=url.openConnection();
    
                //2.处理设置参数和一般请求属性
                //2.1设置参数
                //可以根据请求的需要设置参数 
                conn.setDoInput (true);  //默认为true 所以不设置也可以
                conn.setDoOutput(true);  //默认为false 发送post请求必须设置setDoOutput(true)
                conn.setUseCaches(false); //是否可以使用缓存 不使用缓存
                conn.setConnectTimeout(5000);//请求超时时间
    
                //2.2请求属性 
                //设置通用的请求属性 消息报头 即设置头字段 更多的头字段信息可以查阅HTTP协议
                conn.setRequestProperty("accept", "*/*");
                conn.setRequestProperty("connection", "Keep-Alive");
    
                //2.3设置请求正文 即要提交的数据
                PrintWriter pw=new PrintWriter(new OutputStreamWriter(conn.getOutputStream()));
                pw.print(params);
                pw.flush();
                pw.close();
    
                //3.使用 connect 方法建立到远程对象的实际连接。 
                conn.connect();
    
                //4.远程对象变为可用。远程对象的头字段和内容变为可访问。 
                //4.1获取响应的头字段
                Map<String, List<String>> headers=conn.getHeaderFields();
                System.out.println(headers); //输出头字段
    
                //4.2获取响应正文
                BufferedReader reader = null;
                StringBuffer resultBuffer = new StringBuffer();
                String tempLine = null;
    
                reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                while ((tempLine = reader.readLine()) != null) {
                    resultBuffer.append(tempLine);
                }
                //System.out.println(resultBuffer);
                reader.close();
                return resultBuffer.toString();
            } catch (MalformedURLException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
            finally {
    
            }
            return null;
    
        }
    }
    View Code

     

    URLConnection类分析

    URL url = new URL("http://www.baidu.com/");
    URLConnection conn = url.openConnection();
    
    1.URL url = new URL("http://www.baidu.com/");
    查看URL的源码
    public URL(String spec) throws MalformedURLException {
    this(null, spec);
    }
    public URL(URL context, String spec) throws MalformedURLException {
    this(context, spec, null);
    }
    public URL(URL context, String spec, URLStreamHandler handler)
    
    查看源码得知最终URL(String spec)会调用URL(URL context, String spec, URLStreamHandler handler)
    此时此时context和handler为null。
    在构造函数URL(URL context, String spec, URLStreamHandler handler)中
    如果handler为空会调用 handler =getURLStreamHandler(protocol)的方法根据protocol协议初始化handler
    handler为URLStreamHandler的子类实例
    
    2.URLConnection conn = url.openConnection();
    
    public URLConnection openConnection() throws java.io.IOException {
        return handler.openConnection(this);
    }
    
    handler.openConnection(this);返回的是URLConnection子类的实例。所以最好把URLConnection转化

    URLConnection总结

      1. URLConnection的connect()函数,实际上只是建立了一个与服务器的tcp连接,并没有实际发送http请求。 
        无论是post还是get,http请求实际上直到HttpURLConnection的getInputStream()这个函数里面才正式发送出去。

      2. 在用POST方式发送URL请求时,URL请求参数的设定顺序是重中之重, 
        对connection对象的处理设置参数和一般请求属性和写入提交数据都必须要在connect()函数执行之前完成。对outputStream的写提交数据操作,必须要在inputStream的读操作之前。这些顺序实际上是由http请求的格式决定的。

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

      4. 在http头后面紧跟着的是http请求的正文,正文的内容是通过outputStream流写入的, 
        实际上outputStream不是一个网络流,充其量是个字符串流,往里面写入的东西不会立即发送到网络,而是存在于内存缓冲区中,待outputStream流关闭时,根据输入的内容生成http正文。至此,http请求的东西已经全部准备就绪。在getInputStream()函数调用的时候,就会把准备好的http请求正式发送到服务器了,然后返回一个输入流,用于读取服务器对于此次http请求的返回信息。由于http请求在getInputStream的时候已经发送出去了(包括http头和正文),因此在getInputStream()函数之后对connection对象进行设置(对http头的信息进行修改)或者写入outputStream(对正文进行修改)都是没有意义的了,执行这些操作会导致异常的发生。

      5. 使用URLConnection与服务器交互
        InputStream getInputStream()
          返回从此打开的连接读取的输入流。
        OutputStream getOutputStream()
          返回写入到此连接的输出流。
        若只是向服务器请求数据,则为HTTP请求方法为GET。
        若需要向服务器提交数据,必须在先调用setDoOutput(true)。当doOutput属性为true时,请求方法将由GET变为POST。

    HttpURLConnection类

    使用以下方法修改设置参数:

    HttpURLConnection继承自URLConnection,相比较URLConnection类多了以下方法。 
    - setRequestMethod 设置 URL 请求的方法, GET POST HEAD OPTIONS PUT DELETE TRACE 以上方法之一是合法的,具体取决于协议的限制。 
    - setFollowRedirects 设置此类是否应该自动执行 HTTP 重定向(响应代码为 3xx 的请求)。

    使用以下方法修改一般请求属性:

    • setRequestProperty 设置一般请求属性。
    • addRequestProperty 添加由键值对指定的一般请求属性。

    在建立到远程对象的连接后,以下方法用于访问头字段和内容:

    HttpURLConnection继承自URLConnection,相比较URLConnection类多了以下方法。 
    - getResponseCode 从 HTTP 响应消息获取状态码。 
    - getResponseMessage 获取与来自服务器的响应代码一起返回的 HTTP 响应消息(如果有)。

    Java中可以使用HttpURLConnection来请求WEB资源。
    HttpURLConnection对象不能直接构造,需要通过URL.openConnection()来获得HttpURLConnection对象,示例代码如下:

    String szUrl = "http://www.ee2ee.com/";
    URL url = new URL(szUrl);
    HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();

     

    get请求的使用方法

    HttpURLconnection是同步的请求,所以必须放在子线程中。使用示例如下:

    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                String url = "https://www.baidu.com/";
                URL url = new URL(url);
                //得到connection对象。
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                //设置请求方式
                connection.setRequestMethod("GET");
                //连接
                connection.connect();
                //得到响应码
                int responseCode = connection.getResponseCode();
                if(responseCode == HttpURLConnection.HTTP_OK){
                    //得到响应流
                    InputStream inputStream = connection.getInputStream();
                    //将响应流转换成字符串
                    String result = is2String(inputStream);//将流转换为字符串。
                    Log.d("kwwl","result============="+result);
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();
    View Code

     

    get请求的使用方法如上。如果需要传递参数,则直接把参数拼接到url后面,其他完全相同,如下:

    String url = "https://www.baidu.com/?userName=zhangsan&password=123456";

    注意点: 
    1,url与参数之间用?隔开。 
    2,键值对中键与值用=连接。 
    3,两个键值对之间用&连接。

    分析: 
    1, 使用connection.setRequestMethod(“GET”);设置请求方式。 
    2, 使用connection.connect();连接网络。请求行,请求头的设置必须放在网络连接前。 
    3, connection.getInputStream()只是得到一个流对象,并不是数据,不过我们可以从流中读出数据,从流中读取数据的操作必须放在子线程。 
    4, connection.getInputStream()得到一个流对象,从这个流对象中只能读取一次数据,第二次读取时将会得到空数据。

    post请求的使用方法

    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                URL url = new URL(getUrl);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("POST");//设置请求方式为POST
                connection.setDoOutput(true);//允许写出
                connection.setDoInput(true);//允许读入
                connection.setUseCaches(false);//不使用缓存
                connection.connect();//连接
                int responseCode = connection.getResponseCode();
                if(responseCode == HttpURLConnection.HTTP_OK){
                    InputStream inputStream = connection.getInputStream();
                    String result = is2String(inputStream);//将流转换为字符串。
                    Log.d("kwwl","result============="+result);
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();
    View Code

     

      使用post请求传递键值对参数

    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                URL url = new URL(getUrl);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("POST"); 
                connection.setDoOutput(true);
                connection.setDoInput(true);
                connection.setUseCaches(false);
                connection.connect();
    
                String body = "userName=zhangsan&password=123456";
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(), "UTF-8"));
                writer.write(body);
                writer.close();
    
                int responseCode = connection.getResponseCode();
                if(responseCode == HttpURLConnection.HTTP_OK){
                    InputStream inputStream = connection.getInputStream();
                    String result = is2String(inputStream);//将流转换为字符串。
                    Log.d("kwwl","result============="+result);
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();
    View Code

     

     分析: 
    1,post方式传递参数的本质是:从连接中得到一个输出流,通过输出流把数据写到服务器。 
    2,数据的拼接采用键值对格式,键与值之间用=连接。每个键值对之间用&连接。

      使用post请求传递json格式参数

    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                URL url = new URL(getUrl);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("POST"); 
                connection.setDoOutput(true);
                connection.setDoInput(true);
                connection.setUseCaches(false);
                connection.setRequestProperty("Content-Type", "application/json;charset=utf-8");//设置参数类型是json格式
                connection.connect();
    
                String body = "{userName:zhangsan,password:123456}";
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(), "UTF-8"));
                writer.write(body);
                writer.close();
    
                int responseCode = connection.getResponseCode();
                if(responseCode == HttpURLConnection.HTTP_OK){
                    InputStream inputStream = connection.getInputStream();
                    String result = is2String(inputStream);//将流转换为字符串。
                    Log.d("kwwl","result============="+result);
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();
    View Code

    传递json格式的参数与传递键值对参数不同点有两个: 
    1,传递json格式数据时需要在请求头中设置参数类型是json格式。 
    2,body是json格式的字符串。

    设置请求头

    connection.setRequestMethod("POST");
    connection.setRequestProperty("version", "1.2.3");//设置请求头
    connection.setRequestProperty("token", token);//设置请求头
    connection.connect();

    注意: 
    1,请求头必须在connection.connect();代码前设置。 
    2,可以设置多个请求头参数。

    上传文件

    在post请求传递参数时知道,可以从连接中得到一个输出流,输出流可以像服务器写数据。同理,可以使用这个输出流将文件写到服务器。代码如下:

    try {
        URL url = new URL(getUrl);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setUseCaches(false);
        connection.setRequestProperty("Content-Type", "file/*");//设置数据类型
        connection.connect();
    
        OutputStream outputStream = connection.getOutputStream();
        FileInputStream fileInputStream = new FileInputStream("file");//把文件封装成一个流
        int length = -1;
        byte[] bytes = new byte[1024];
        while ((length = fileInputStream.read(bytes)) != -1){
            outputStream.write(bytes,0,length);//写的具体操作
        }
        fileInputStream.close();
        outputStream.close();
    
        int responseCode = connection.getResponseCode();
        if(responseCode == HttpURLConnection.HTTP_OK){
            InputStream inputStream = connection.getInputStream();
            String result = is2String(inputStream);//将流转换为字符串。
            Log.d("kwwl","result============="+result);
        }
    
    } catch (Exception e) {
        e.printStackTrace();
    }
    View Code

    注: 
    1,上传文件使用的是post请求方式。 
    2,使用的原理类似于post请求中上传参数。

    下载文件

    try {
         String urlPath = "https://www.baidu.com/";
          URL url = new URL(urlPath);
          HttpURLConnection connection = (HttpURLConnection) url.openConnection();
          connection.setRequestMethod("GET");
          connection.connect();
          int responseCode = connection.getResponseCode();
          if(responseCode == HttpURLConnection.HTTP_OK){
              InputStream inputStream = connection.getInputStream();
              File dir = new File("fileDir");
              if (!dir.exists()){
                  dir.mkdirs();
              }
              File file = new File(dir, "fileName");//根据目录和文件名得到file对象
              FileOutputStream fos = new FileOutputStream(file);
              byte[] buf = new byte[1024*8];
              int len = -1;
              while ((len = inputStream.read(buf)) != -1){
                  fos.write(buf, 0, len);
              }
              fos.flush();
          }
    
      } catch (Exception e) {
          e.printStackTrace();
      }
    View Code

     

     

     

     

    传送门:

    HttpUrlConnection使用详解:https://blog.csdn.net/fightingXia/article/details/71775516

    URLConnection类,HttpURLConnection类的使用和总结:https://blog.csdn.net/laiyaxing/article/details/51585755

    转载于:https://www.cnblogs.com/soul-wonder/p/8892735.html

    展开全文
  • urlConnection

    2013-04-25 17:38:53
    原文地址:urlConnection作者:起伏package cn.core.util; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net....
    原文地址:urlConnection作者:起伏
    package cn.core.util;
    import java.io.BufferedReader;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;

    public   class  HttpInvoker   {
     
          public   static   final  String GET_URL  =   "http://www.baidu.cn";
          public   static   final  String POST_URL  =   "http://www.baidu.cn";
          public   static   void  readContentFromGet()  throws  IOException{
              //  拼凑get请求的URL字串,使用URLEncoder.encode对特殊和不可见字符进行编码 
             //String getURL  =  GET_URL  +   "?username=" +  URLEncoder.encode("fatman" ,"utf-8");
         String getURL  =  GET_URL;
             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();
              //  设置是否向connection输出,因为这个是post请求,参数要放在
              //  http正文内,因此需要设为true 
             connection.setDoOutput( true );
             connection.setDoInput( true );
             //有的请求不支持POST请求
             //connection.setRequestMethod( "POST" );
             connection.setUseCaches( false );
             connection.setInstanceFollowRedirects( true );
             //connection.setRequestProperty("Content-Type" ,"application/x-www-form-urlencoded");
             connection.setRequestProperty("Content-Type" ,"text/html");
             connection.connect();
    //         DataOutputStream out  =   new  DataOutputStream(connection.getOutputStream());
    //         String content ="firstname=" +  URLEncoder.encode( "一个大肥人" ,  "utf-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();
         } 
     
            
           public   static   void  main(String[] args){
              //  TODO Auto-generated method stub 
               try{
                 //readContentFromGet();
                 readContentFromPost();
              }   catch  (IOException e){
                  //  TODO Auto-generated catch block 
                 e.printStackTrace();
             } 
         } 
     
     } 
    展开全文
  • UrlConnection

    2017-07-13 08:59:23
    HTTPUrlConnection

    请求响应流程

    请求响应流程

    设置连接参数的方法

    • setAllowUserInteraction
    • setDoInput
    • setDoOutput
    • setIfModifiedSince
    • setUseCaches
    • setDefaultAllowUserInteraction
    • setDefaultUseCaches

    设置请求头或响应头

    HTTP请求允许一个key带多个用逗号分开的values,但是HttpURLConnection只提供了单个操作的方法:

    • setRequestProperty(key,value)
    • addRequestProperty(key,value)

    setRequestProperty和addRequestProperty的区别就是,setRequestProperty会覆盖已经存在的key的所有values,有清零重新赋值的作用。而addRequestProperty则是在原来key的基础上继续添加其他value。

    发送URL请求

    建立实际连接之后,就是发送请求,把请求参数传到服务器,这就需要使用outputStream把请求参数传给服务器:

    • getOutputStream 

    获取响应

    请求发送成功之后,即可获取响应的状态码,如果成功既可以读取响应中的数据,获取这些数据的方法包括:

    • getContent
    • getHeaderField
    • getInputStream 

    对于大部分请求来说,getInputStream和getContent是用的最多的。

    相应的信息头用以下方法获取:

    • getContentEncoding
    • getContentLength
    • getContentType
    • getDate
    • getExpiration
    • getLastModifed 

    HttpURLConnection

    任何网络连接都需要经过socket才能连接,HttpURLConnection不需要设置socket,所以,HttpURLConnection并不是底层的连接,而是在底层连接上的一个请求。这就是为什么HttpURLConneciton只是一个抽象类,自身不能被实例化的原因。HttpURLConnection只能通过URL.openConnection()方法创建具体的实例。

    虽然底层的网络连接可以被多个HttpURLConnection实例共享,但每一个HttpURLConnection实例只能发送一个请求。请求结束之后,应该调用HttpURLConnection实例的InputStream或OutputStream的close()方法以释放请求的网络资源,不过这种方式对于持久化连接没用。对于持久化连接,得用disconnect()方法关闭底层连接的socket。

    创建HttpURLConnection

    URL url = new URL("http://localhost:8080/xxx.do");  
       
    URLConnection rulConnection = url.openConnection();// 此处的urlConnection对象实际上是根据URL的  
    // 请求协议(此处是http)生成的URLConnection类  
    // 的子类HttpURLConnection,故此处最好将其转化  
    // 为HttpURLConnection类型的对象,以便用到  
    // HttpURLConnection更多的API.如下:  
       
    HttpURLConnection httpUrlConnection = (HttpURLConnection) rulConnection;  

    设置HttpURLConnection参数

    // 设定请求的方法为"POST",默认是GET  
    httpUrlConnection.setRequestMethod("POST");  
      
    // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在  
    // http正文内,因此需要设为true, 默认情况下是false;  
    httpUrlConnection.setDoOutput(true);  
       
    // 设置是否从httpUrlConnection读入,默认情况下是true;  
    httpUrlConnection.setDoInput(true);  
       
    // Post 请求不能使用缓存  
    httpUrlConnection.setUseCaches(false);  
       
    // 设定传送的内容类型是可序列化的java对象  
    // (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)  
    httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");  
     
    // 连接,从上述url.openConnection()至此的配置必须要在connect之前完成,  
    httpUrlConnection.connect();  

    URLConnection建立连接

    // 此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法,  
    // 所以在开发中不调用上述的connect()也可以)。  
    OutputStream outStrm = httpUrlConnection.getOutputStream();  

    getInputStream()也是同理。

    HttpURLConnection发送请求

    // 现在通过输出流对象构建对象输出流对象,以实现输出可序列化的对象。  
    ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm);  
       
    // 向对象输出流写出数据,这些数据将存到内存缓冲区中  
    objOutputStrm.writeObject(new String("我是测试数据"));  
       
    // 刷新对象输出流,将任何字节都写入潜在的流中(些处为ObjectOutputStream)  
    objOutputStm.flush();  
      
    // 关闭流对象。此时,不能再向对象输出流写入任何数据,先前写入的数据存在于内存缓冲区中,  
    // 在调用下边的getInputStream()函数时才把准备好的http请求正式发送到服务器  
    objOutputStm.close();  

    HttpURLConneciton获取响应

     // 调用HttpURLConnection连接对象的getInputStream()函数,  

    InputStream inStrm = httpConn.getInputStream(); 

    设置POST参数

    OutputStream os = httpConn.getOutputStream();  
                 String param = new String();  
                 param = "CorpID=" + CorpID +  
                         "&LoginName=" + LoginName+  
                         "&send_no=" + phoneNumber +  
                         "&msg=" + java.net.URLEncoder.encode(msg,"GBK"); ;  
                 os.write(param.getBytes());  

    超时设置,防止 网络异常的情况下,可能会导致程序僵死而不继续往下执行

    System.setProperty("sun.net.client.defaultConnectTimeout""30000");  

    System.setProperty("sun.net.client.defaultReadTimeout""30000");  

     

    其中: sun.net.client.defaultConnectTimeout:连接主机的超时时间(单位:毫秒)  

    sun.net.client.defaultReadTimeout:从主机读取数据的超时时间(单位:毫秒)  

      

    JDK 1.5以前的版本,只能通过设置这两个系统属性来控制网络超时。在1.5中,还可以使用HttpURLConnection的父类URLConnection的以下两个方法:  

    setConnectTimeout:设置连接主机超时(单位:毫秒)  

    setReadTimeout:设置从主机读取数据超时(单位:毫秒)  

      

    例如:  

    HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();  

    urlCon.setConnectTimeout(30000);  

    urlCon.setReadTimeout(30000);  


    //http://blog.csdn.net/woxueliuyun/article/details/43267365   谢谢你的文章,很有用,大家如果想了解详情,请看以上网址

    展开全文
  • URLConnection概述

    2018-07-12 21:12:41
    URLConnection是一个抽象类,表示指向URL指定资源的活动连接。 URLConnection类本身依赖于Socket类实现网络连接。 下面来介绍一下URLConnection中的常用API URLConnection读取首部 @Test public void test()...
  • URLConnection详解

    2016-12-08 16:14:58
    URLConnection详解
  • URLConnection分析

    2017-10-15 15:51:48
    // url是一个http地址 URL url = new URL(... URLConnection urlConnection = url.openConnection(); HttpURLConnection httpURLConnection = (HttpURLConnection)urlConnection; // 底层的
  • URLConnection实例

    2018-10-22 18:12:21
    URLConnection 用于发请求与其他服务器建立连接 URLConnection 发请求多线程下载资源 package it.net; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.*; /** * Description: ...
  • URLConnection

    2014-02-16 16:19:38
    URLConnection

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,231
精华内容 2,092
关键字:

urlconnection