使用HttpURLConnection进行网络访问及代码实战

tech2022-07-14  178

使用HttpURLConnection进行网络访问


HttpURLConnection是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。继承至URLConnection,抽象类,无法直接实例化对象。通过调用openCollection() 方法获得对象实例,默认是带gzip压缩的;

HttpURLConnection的使用步骤

创建一个URL对象: URL url = new URL(https://www.baidu.com); 调用URL对象的openConnection( )来获取HttpURLConnection对象实例 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 设置HTTP请求使用的方法:GET或者POST,或者其他请求方式: conn.setRequestMethod("GET"); 设置连接超时,读取超时的毫秒数,以及消息头: conn.setConnectTimeout(10*1000); 调用getInputStream()方法获得服务器返回的输入流: InputStream in = conn.getInputStream();

获取后,就可以对输入流进行操作了(读取接口返回的数据)。

关闭连接 conn.disconnect();

HttpURLConnection代码实战

/** * post请求数据 * * @param urlStr * @return */ public String reqHttpURLConnection(String urlStr) { HttpURLConnection conn = null; try { conn = (HttpURLConnection) new URL(urlStr).openConnection(); //设置请求方式,请求超时信息 conn.setRequestMethod("POST"); conn.setReadTimeout(5000); conn.setConnectTimeout(5000); //设置运行输入,输出: conn.setDoOutput(true); conn.setDoInput(true); //Post方式不能缓存,需手动设置为false conn.setUseCaches(false); //我们请求的数据: String data = "name=" + URLEncoder.encode("budaye", "UTF-8") + "&book=" + URLEncoder.encode("android", "UTF-8"); //请求头... //获取输出流 OutputStream out = conn.getOutputStream(); out.write(data.getBytes()); out.flush(); //请求结果处理 if (conn.getResponseCode() == 200) { // 获取响应的输入流对象 InputStream is = conn.getInputStream(); // 创建字节输出流对象 ByteArrayOutputStream message = new ByteArrayOutputStream(); // 定义读取的长度 int len = 0; // 定义缓冲区 byte buffer[] = new byte[2048]; // 按照缓冲区的大小,循环读取 while ((len = is.read(buffer)) != -1) { // 根据读取的长度写入到os对象中 message.write(buffer, 0, len); } // 释放资源 is.close(); message.close(); // 返回结果字符串 String str = new String(message.toByteArray()); return str; } } catch (IOException e) { e.printStackTrace(); } return ""; }

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

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

最新回复(0)