这个类是继承了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