HttpURLConnection 源码分析

这个类是继承了URLConnection这个类,他的作用是实现了一个Http的一个URL连接。

1.通过调用URL.openConnection()来获得一个新的HttpURLConnection对象,并且将其结果强制转换为HttpURLConnection.
  
  2.准备请求。一个请求主要的参数是它的URI。请求头可能也包含元数据,例如证书,首选数据类型和会话cookies.
  
  3.可以选择性的上传一个请求体。HttpURLConnection实例必须设置setDoOutput(true),如果它包含一个请求体。通过将数据写入一个由getOutStream()返回的输出流来传输数据。
  
  4.读取响应。响应头通常包含元数据例如响应体的内容类型和长度,修改日期和会话cookies。响应体可以被由getInputStream返回的输入流读取。如果响应没有响应体,则该方法会返回一个空的流。
  
  5.关闭连接。一旦一个响应体已经被阅读后,HttpURLConnection 对象应该通过调用disconnect()关闭。断开连接会释放被一个connection占有的资源,这样它们就能被关闭或再次使用。

/**
*HTTP方法(GET、POST、PUT等)。
*/
    protected String method = "GET";

设置请求方法。

public void setRequestMethod(String method) throws ProtocolException {
//这个方法设置了连接的方法。先是判断连接是否是连接着的,如果没有连接着就抛出异常。
        if (connected) {
            throw new ProtocolException("Can't reset method: already connected");
        }

        for (int i = 0; i < methods.length; i++) {
            if (methods[i].equals(method)) {
            //连接着就判断这个连接方法是否等于TRACE,如果是就调用安全管理器判断是否有网络连接的权限。安全管理器一般默认不开启。需要启动时候配合参数-Djava.security.manager。
                if (method.equals("TRACE")) {
                    SecurityManager s = System.getSecurityManager();
                    if (s != null) {
                    //判断权限
                        s.checkPermission(new NetPermission("allowHttpTrace"));
                    }
                }
                //设置方法
                this.method = method;
                return;
            }
        }
        throw new ProtocolException("Invalid HTTP method: " + method);
    }

获取响应的返回值。

public int getResponseCode() throws IOException {
    if (responseCode != -1) {
        return responseCode;
    }
	//如果响应返回值不等于-1,重新获取这个连接的输入。
    Exception exc = null;
    try {
        getInputStream();
    } catch (Exception e) {
        exc = e;
    }
	
	//获得头部第一个字段。
    String statusLine = getHeaderField(0);
    //判断这个头部字段是否是空。
    if (statusLine == null) {
        if (exc != null) {
            if (exc instanceof RuntimeException)
            	//如果有就抛出异常。
                throw (RuntimeException)exc;
            else
                throw (IOException)exc;
        }
        return -1;
    }

    /*
    根据获得头字段进行解析,判断是不是HTTP协议的请求
	*/
    if (statusLine.startsWith("HTTP/1.")) {
        int codePos = statusLine.indexOf(' ');
        if (codePos > 0) {
            int phrasePos = statusLine.indexOf(' ', codePos+1);
            if (phrasePos > 0 && phrasePos < statusLine.length()) {
                responseMessage = statusLine.substring(phrasePos+1);
            }

            if (phrasePos < 0)
                phrasePos = statusLine.length();

            try {
            //解析出返回响应值
                responseCode = Integer.parseInt
                        (statusLine.substring(codePos+1, phrasePos));
                return responseCode;
            } catch (NumberFormatException e) { }
        }
    }
    return -1;
}

使用代理抽象方法。

public abstract boolean usingProxy();

断开连接方法。

public abstract void disconnect();

HTTP响应返回值

   /**
*HTTP状态代码200:确定。
*/
    public static final int HTTP_OK = 200;

    /**
*HTTP状态代码201:已创建。
*/
    public static final int HTTP_CREATED = 201;

    /**
*HTTP状态代码202:已接受。
*/
    public static final int HTTP_ACCEPTED = 202;

    /**
*http://status-code 203:non-authoritative information.
*/
    public static final int HTTP_NOT_AUTHORITATIVE = 203;

    /**
*HTTP状态代码204:无内容。
*/
    public static final int HTTP_NO_CONTENT = 204;

    /**
*HTTP状态代码205:重置内容。
*/
    public static final int HTTP_RESET = 205;

    /**
*HTTP状态代码206:部分内容。
*/
    public static final int HTTP_PARTIAL = 206;

    /* 3XX: relocation/redirect */

    /**
*HTTP状态代码300:多选。
*/
    public static final int HTTP_MULT_CHOICE = 300;

    /**
*HTTP状态代码301:已永久移动。
*/
    public static final int HTTP_MOVED_PERM = 301;

    /**
*HTTP状态代码302:临时重定向。
*/
    public static final int HTTP_MOVED_TEMP = 302;

    /**
*HTTP状态代码303:请参阅其他。
*/
    public static final int HTTP_SEE_OTHER = 303;

    /**
*HTTP状态代码304:未修改。
*/
    public static final int HTTP_NOT_MODIFIED = 304;

    /**
*HTTP状态代码305:使用代理。
*/
    public static final int HTTP_USE_PROXY = 305;

    /* 4XX: client error */

    /**
*HTTP状态代码400:错误请求。
*/
    public static final int HTTP_BAD_REQUEST = 400;

    /**
*HTTP状态代码401:未授权。
*/
    public static final int HTTP_UNAUTHORIZED = 401;

    /**
*HTTP状态代码402:需要付款。
*/
    public static final int HTTP_PAYMENT_REQUIRED = 402;

    /**
*HTTP状态代码403:禁止。
*/
    public static final int HTTP_FORBIDDEN = 403;

    /**
*HTTP状态代码404:未找到。
*/
    public static final int HTTP_NOT_FOUND = 404;

    /**
*HTTP状态代码405:不允许使用方法。
*/
    public static final int HTTP_BAD_METHOD = 405;

    /**
*HTTP状态代码406:不可接受。
*/
    public static final int HTTP_NOT_ACCEPTABLE = 406;

    /**
*HTTP状态代码407:需要代理身份验证。
*/
    public static final int HTTP_PROXY_AUTH = 407;

    /**
*HTTP状态代码408:请求超时。
*/
    public static final int HTTP_CLIENT_TIMEOUT = 408;

    /**
*HTTP状态代码409:冲突。
*/
    public static final int HTTP_CONFLICT = 409;

    /**
*HTTP状态代码410:已消失。
*/
    public static final int HTTP_GONE = 410;

    /**
*HTTP状态代码411:需要长度。
*/
    public static final int HTTP_LENGTH_REQUIRED = 411;

    /**
*HTTP状态代码412:预处理失败。
*/
    public static final int HTTP_PRECON_FAILED = 412;

    /**
*HTTP状态代码413:请求实体太大。
*/
    public static final int HTTP_ENTITY_TOO_LARGE = 413;

    /**
*HTTP状态代码414:请求URI太大。
*/
    public static final int HTTP_REQ_TOO_LONG = 414;

    /**
*HTTP状态代码415:不支持的媒体类型。
*/
    public static final int HTTP_UNSUPPORTED_TYPE = 415;

    /* 5XX: server error */

    /**
*HTTP状态代码500:内部服务器错误。
*@弃用它是错放的,不应该存在。
*/
    @Deprecated
    public static final int HTTP_SERVER_ERROR = 500;

    /**
*HTTP状态代码500:内部服务器错误。
*/
    public static final int HTTP_INTERNAL_ERROR = 500;

    /**
*HTTP状态代码501:未实现。
*/
    public static final int HTTP_NOT_IMPLEMENTED = 501;

    /**
*HTTP状态代码502:网关错误。
*/
    public static final int HTTP_BAD_GATEWAY = 502;

    /**
*HTTP状态代码503:服务不可用。
*/
    public static final int HTTP_UNAVAILABLE = 503;

    /**
*HTTP状态代码504:网关超时。
*/
    public static final int HTTP_GATEWAY_TIMEOUT = 504;

    /**
*HTTP状态代码505:不支持HTTP版本。
*/
    public static final int HTTP_VERSION = 505;


HttpURLConnection 使用文章转载:http://www.blogjava.net/supercrsky/articles/247449.html
Android网络连接源码分析主要涉及到Android系统中网络连接的相关实现和机制。下面是Android网络连接的源码分析: 1. 网络连接管理类:Android中的网络连接管理由ConnectivityManager类负责。该类提供了获取网络状态、监听网络状态变化等功能。其源码位于frameworks/base/core/java/android/net/ConnectivityManager.java。 2. 网络请求类:Android中的网络请求由HttpClient或HttpURLConnection实现。在Android 6.0及以上版本中,Google推荐使用HttpURLConnectionHttpClient的源码位于frameworks/base/core/java/org/apache/http/impl/client/DefaultHttpClient.java,HttpURLConnection源码位于libcore/luni/src/main/java/java/net/HttpURLConnection.java。 3. 网络请求处理类:Android中的网络请求处理由AsyncTask或者Thread实现。AsyncTask是一个封装了线程池和Handler的异步任务类,用于在后台执行耗时操作,并在主线程更新UI。其源码位于frameworks/base/core/java/android/os/AsyncTask.java。 4. 网络请求结果处理类:Android中的网络请求结果处理由Handler或者Callback实现。Handler用于在主线程中处理异步任务的结果,Callback则是一种回调机制,用于在异步任务完成后执行相应的操作。 5. 网络缓存类:Android中的网络缓存由DiskLruCache或者LruCache实现。DiskLruCache用于将网络请求结果缓存到本地磁盘,LruCache则是一种内存缓存机制,用于缓存网络请求结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值