HttpUrlConnection 基础使用

From https://developer.android.com/reference/java/net/HttpURLConnection.html

HttpUrlConnection:

A URLConnection with support for HTTP-specific features. See the specfor details.

Uses of this class follow a pattern:

  1. Obtain a new HttpURLConnection by calling URL.openConnection() and casting the result to HttpURLConnection.
  2. Prepare the request. The primary property of a request is its URI. Request headers may also include metadata such as credentials, preferred content types, and session cookies.
  3. Optionally upload a request body. Instances must be configured with setDoOutput(true) if they include a request body. Transmit data by writing to the stream returned by getOutputStream().
  4. Read the response. Response headers typically include metadata such as the response body‘s content type and length, modified dates and session cookies. The response body may be read from the stream returned by getInputStream(). If the response has no body, that method returns an empty stream.
  5. Disconnect. Once the response body has been read, the HttpURLConnection should be closed by calling disconnect(). Disconnecting releases the resources held by a connection so they may be closed or reused.

中文释义:

一个支持HTTP特定功能的URLConnection。

使用这个类遵循以下模式:

  1.通过调用URL.openConnection()来获得一个新的HttpURLConnection对象,并且将其结果强制转换为HttpURLConnection.

  2.准备请求。一个请求主要的参数是它的URI。请求头可能也包含元数据,例如证书,首选数据类型和会话cookies.

  3.可以选择性的上传一个请求体。HttpURLConnection实例必须设置setDoOutput(true),如果它包含一个请求体。通过将数据写入一个由getOutStream()返回的输出流来传输数据。

  4.读取响应。响应头通常包含元数据例如响应体的内容类型和长度,修改日期和会话cookies。响应体可以被由getInputStream返回的输入流读取。如果响应没有响应体,则该方法会返回一个空的流。

  5.关闭连接。一旦一个响应体已经被阅读后,HttpURLConnection 对象应该通过调用disconnect()关闭。断开连接会释放被一个connection占有的资源,这样它们就能被关闭或再次使用。

从上面的话以及最近的学习可以总结出:

关于HttpURLConnection的操作和使用,比较多的就是GET和POST两种了

主要的流程:

  创建URL实例,打开URLConnection

URL url=new URL("http://www.baidu.com");
HttpURLConnection connection= (HttpURLConnection) url.openConnection();

  设置连接参数

 常用方法:

  setDoInput

  setDoOutput

  setIfModifiedSince:设置缓存页面的最后修改时间(参考自:http://blog.csdn.net/stanleyqiu/article/details/7717235)

  setUseCaches

  setDefaultUseCaches

  setAllowUserInteraction

  setDefaultAllowUserInteraction

  setRequestMethod:HttpURLConnection默认给使用Get方法

  设置请求头参数

  常用方法: 

  setRequestProperty(key,value)  

  addRequestProperty(key,value)

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

  常用设置:

  设置请求数据类型:

connection.setRequestProperty("Content-type","application/x-javascript->json");//json格式数据

connection.addRequestProperty("Content-Type","application/x-www-form-urlencoded");//默认浏览器编码类型,http://www.cnblogs.com/taoys/archive/2010/12/30/1922186.html

connection.addRequestProperty("Content-Type","multipart/form-data;boundary="+boundary);//post请求,上传数据时的编码类型,并且指定了分隔符

Connection.setRequestProperty("Content-type", "application/x-java-serialized-object");// 设定传送的内容类型是可序列化的java对象(如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)
connection.addRequestProperty("Connection","Keep-Alive");//设置与服务器保持连接
connection.addRequestProperty("Charset","UTF-8");//设置字符编码类型

  连接并发送请求

  connect 

  getOutputStream

  在这里getOutStream会隐含的进行connect,所以也可以不调用connect

  获取响应数据

  getContent (https://my.oschina.net/zhanghc/blog/134591)

  getHeaderField:获取所有响应头字段

  getInputStream

  getErrorStream:若HTTP响应表明发送了错误,getInputStream将抛出IOException。调用getErrorStream读取错误响应。

实例:

  get请求:

  

public static String get(){
        String message="";
        try {
            URL url=new URL("http://www.baidu.com");
            HttpURLConnection connection= (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(5*1000);
            connection.connect();
            InputStream inputStream=connection.getInputStream();
            byte[] data=new byte[1024];
            StringBuffer sb=new StringBuffer();
            int length=0;
            while ((length=inputStream.read(data))!=-1){
                String s=new String(data, Charset.forName("utf-8"));
                sb.append(s);
            }
            message=sb.toString();
            inputStream.close();
            connection.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return message;
    }

  post请求:

 

public static String post(){
        String message="";
        try {
            URL url=new URL("http://119.29.175.247/wikewechat/Admin/Login/login.html");
            HttpURLConnection connection= (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setUseCaches(false);
            connection.setConnectTimeout(30000);
            connection.setReadTimeout(30000);
            connection.setRequestProperty("Content-type","application/x-javascript->json");
            connection.connect();
            OutputStream outputStream=connection.getOutputStream();
            StringBuffer sb=new StringBuffer();
            sb.append("email=");
            sb.append("[email protected]&");
            sb.append("password=");
            sb.append("1234&");
            sb.append("verify_code=");
            sb.append("4fJ8");
            String param=sb.toString();
            outputStream.write(param.getBytes());
            outputStream.flush();
            outputStream.close();
            Log.d("ddddd","responseCode"+connection.getResponseCode());
            InputStream inputStream=connection.getInputStream();
            byte[] data=new byte[1024];
            StringBuffer sb1=new StringBuffer();
            int length=0;
            while ((length=inputStream.read(data))!=-1){
                String s=new String(data, Charset.forName("utf-8"));
                sb1.append(s);
            }
            message=sb1.toString();
            inputStream.close();
            connection.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return message;
    }

  post上传图片和表单数据:

public static String uploadFile(File file){    String message="";    String url="http://119.29.175.247/uploads.php";    String boundary="7786948302";    Map<String ,String> params=new HashMap<>();    params.put("name","user");    params.put("pass","123");    try {        URL url1=new URL(url);        HttpURLConnection connection= (HttpURLConnection) url1.openConnection();        connection.setRequestMethod("POST");        connection.addRequestProperty("Connection","Keep-Alive");        connection.addRequestProperty("Charset","UTF-8");        connection.addRequestProperty("Content-Type","multipart/form-data;boundary="+boundary);        // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在        // http正文内,因此需要设为true, 默认情况下是false;        connection.setDoOutput(true);        //设置是否从httpUrlConnection读入,默认情况下是true;        connection.setDoInput(true);        // Post 请求不能使用缓存  ?        connection.setUseCaches(false);        connection.setConnectTimeout(20000);        DataOutputStream dataOutputStream=new DataOutputStream(connection.getOutputStream());        FileInputStream fileInputStream=new FileInputStream(file);        dataOutputStream.writeBytes("--"+boundary+"\r\n");        // 设定传送的内容类型是可序列化的java对象        // (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)        dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\""                + URLEncoder.encode(file.getName(),"UTF-8")+"\"\r\n");        dataOutputStream.writeBytes("\r\n");        byte[] b=new byte[1024];        while ((fileInputStream.read(b))!=-1){            dataOutputStream.write(b);        }        dataOutputStream.writeBytes("\r\n");        dataOutputStream.writeBytes("--"+boundary+"\r\n");        try {            Set<String > keySet=params.keySet();            for (String param:keySet){                dataOutputStream.writeBytes("Content-Disposition: form-data; name=\""                        +encode(param)+"\"\r\n");                dataOutputStream.writeBytes("\r\n");                String value=params.get(param);                dataOutputStream.writeBytes(encode(value)+"\r\n");                dataOutputStream.writeBytes("--"+boundary+"\r\n");

}        }catch (Exception e){

}

InputStream inputStream=connection.getInputStream();        byte[] data=new byte[1024];        StringBuffer sb1=new StringBuffer();        int length=0;        while ((length=inputStream.read(data))!=-1){            String s=new String(data, Charset.forName("utf-8"));            sb1.append(s);        }        message=sb1.toString();        inputStream.close();        fileInputStream.close();        dataOutputStream.close();        connection.disconnect();    } catch (Exception e) {        e.printStackTrace();    }    return message;}

private static String encode(String value) throws UnsupportedEncodingException {    return URLEncoder.encode(value,"UTF-8");}

这里需要指出:

通过chrome的开发工具截取的头信息可以看到:

通过post上传数据时,若除了文本数据以外还要需要上传文件,则需要在指定每一条数据的Content-Disposition,name,若是文件还要指明filename,并在每条数据传输的后面用boundary隔开。

时间: 2024-10-11 13:45:50

HttpUrlConnection 基础使用的相关文章

Android --http请求之HttpURLConnection

参考博客:Android HttpURLConnection 基础使用 参考博客:Android访问网络,使用HttpURLConnection还是HttpClient? String getUrl = mUrl + "/login.ashx?type=authen&user=" + mEmail + "&pwd=" + mPassword; URL loginUrl = null; InputStream in = null; HttpURLCon

Android开发面试经——6.常见面试官提问Android题②(更新中...)

版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http://blog.csdn.net/finddreams/article/details/44560061 1.HttpURLConnection和HttpClient他们各自的优缺点是什么? HttpUrlConnection 在 2.3 以前的版本是有 bug 的,所以之前的版本推荐使用 HttpClient,但是 google 现在

安卓面试题 Android interview questions

安卓面试题 Android interview questions 作者:韩梦飞沙 ?2017?年?7?月?3?日,??14:52:44 1.      要做一个尽可能流畅的ListView,你平时在工作中如何进行优化的? ①Item布局,层级越少越好,使用hierarchyview工具查看优化. ②复用convertView ③使用ViewHolder ④item中有图片时,异步加载 ⑤快速滑动时,不加载图片 ⑥item中有图片时,应对图片进行适当压缩 ⑦实现数据的分页加载 2.      对

Post请求的两种编码格式:application/x-www-form-urlencoded和multipart/form-data

在常见业务开发中,POST请求常常在这些地方使用:前端表单提交时.调用接口代码时和使用Postman测试接口时.我们下面来一一了解: 一.前端表单提交时 application/x-www-form-urlencoded 表单代码: <form action="http://localhost:8888/task/" method="POST"> First name: <input type="text" name="

java web 开发三剑客 -------电子书

Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知Internet的目的是让各个net交互.所以,Internet实质上是将世界上各个国家.各个网络运营商的多个网络相互连接构成的一个全球范围内的统一网,使各个网络之间能够相互到达.各个国家和运营商构建网络采用的底层技术和实现可能各不相同,但只要采用统一的上层协议(TCP/IP)就可以通过Internet

HTTP基础与Android之(安卓与服务器通信)——使用HttpClient和HttpURLConnection

查看原文:http://blog.csdn.net/sinat_29912455/article/details/51122286 1客户端连接服务器实现内部的原理 GET方式和POST方式的差别 HTTP返回请求数据的三种方式 2使用HTTP协议访问网络 3HttpCient 简单来说用HttpClient发送请求接收响应都很简单只需要五大步骤即可要牢记 4DefaultHttpClient GET方式 POST方式 5Java中使用HTTPHttpURLConnection GET方式 PO

[Android基础]Android中使用HttpURLConnection

HttpURLConnection继承了URLConnection,因此也能够向指定站点发送GET请求.POST请求.它在URLConnetion的基础上提供了例如以下便捷的方法. int getResponseCode():获取server的响应代码. String getResponseMessage():获取server的訪问信息. String getRequestMethod():获取发送请求的方法. void setRequestMethod(String method):设置发送请

Android开发学习——基础学习

在微信公众号上,发现一个自学android的一个文章,觉得不错.对其进行小小总结,整理给大家. 1. 基础UI学习 Button/TextView/EditText/CheckBox/ImageView/GirdView等,在activityMain.xml里设置,在屏幕上占一块地方. 可以设置这些组件的属性, :id(唯一标识) :layout_width(宽) :layout_height(高) :text(文本) :textsize/textcolor/textstyle :layout_

HttpClient和HttpURLConnection整合汇总对比

性能 1.HttpUrlConnection直接支持GZIP压缩:HttpClient也支持,但要自己写代码处理. 2.HttpUrlConnection直接支持系统级连接池,即打开的连接不会直接关闭,在一段时间内所有程序可共用:HttpClient当然也能做到,但毕竟不如官方直接系统底层支持好. 3.HttpUrlConnection直接在系统层面做了缓存策略处理(4.0版本以上),加快了重复请求的速度. 4.关于速度方面,网上有些大牛做过测试,但因访问站点的数据量,二次连接访问等发现测试结果