阅读(3204) (6)

鸿蒙OS HttpURLConnection

2022-06-06 16:29:22 更新

HttpURLConnection

java.lang.Object

|---java.net.URLConnection

|---|---java.net.HttpURLConnection

public abstract class HttpURLConnection
extends URLConnection

支持 HTTP 特定功能的 URLConnection。 有关详细信息,请参阅规范。

每个 HttpURLConnection 实例用于发出单个请求,但到 HTTP 服务器的底层网络连接可能会被其他实例透明地共享。 在请求之后对 HttpURLConnection 的 InputStream 或 OutputStream 调用 close() 方法可能会释放与此实例关联的网络资源,但不会影响任何共享的持久连接。 如果持续连接当时处于空闲状态,则调用 disconnect() 方法可能会关闭底层套接字。

HTTP 协议处理程序有一些可以通过系统属性访问的设置。 这包括代理设置以及各种其他设置。

安全权限

如果安装了安全管理器,并且调用了导致尝试打开连接的方法,则调用者必须拥有:-

  • 连接到目标 URL 的主机/端口组合的 SocketPermission 或
  • 允许此请求的 URLPermission。

如果启用了自动重定向,并且此请求被重定向到另一个目的地,那么调用者还必须有权连接到重定向的主机/URL。

字段摘要

修饰符和类型 字段 描述
protected int chunkLength 使用分块编码流模式进行输出时的块长度。
protected int fixedContentLength 使用固定长度流模式时的固定内容长度。
protected long fixedContentLengthLong 使用固定长度流模式时的固定内容长度。
static int HTTP_ACCEPTED HTTP 状态码 202:已接受。
static int HTTP_BAD_GATEWAY HTTP 状态码 502:网关错误。
static int HTTP_BAD_METHOD HTTP 状态码 405:不允许的方法。
static int HTTP_BAD_REQUEST HTTP 状态码 400:错误请求。
static int HTTP_CLIENT_TIMEOUT HTTP 状态码 408:请求超时。
static int HTTP_CONFLICT HTTP 状态码 409:冲突。
static int HTTP_CREATED HTTP 状态码 201:已创建。
static int HTTP_ENTITY_TOO_LARGE HTTP 状态码 413:请求实体太大。
static int HTTP_FORBIDDEN HTTP 状态码 403:禁止。
static int HTTP_GATEWAY_TIMEOUT HTTP 状态码 504:网关超时。
static int HTTP_GONE HTTP 状态码 410:已消失。
static int HTTP_INTERNAL_ERROR HTTP 状态码 500:内部服务器错误。
static int HTTP_LENGTH_REQUIRED HTTP 状态码 411:长度要求。
static int HTTP_MOVED_PERM HTTP 状态码 301:永久移动。
static int HTTP_MOVED_TEMP HTTP 状态码 302:临时重定向。
static int HTTP_MULT_CHOICE HTTP 状态码 300:多项选择。
static int HTTP_NO_CONTENT HTTP 状态码 204:无内容。
static int HTTP_NOT_ACCEPTABLE HTTP 状态码 406:不可接受。
static int HTTP_NOT_AUTHORITATIVE HTTP 状态码 203:非权威信息。
static int HTTP_NOT_FOUND HTTP 状态码 404:未找到。
static int HTTP_NOT_IMPLEMENTED HTTP 状态码 501:未实现。
static int HTTP_NOT_MODIFIED HTTP 状态码 304:未修改。
static int HTTP_OK HTTP 状态码 200:正常。
static int HTTP_PARTIAL HTTP 状态码 206:部分内容。
static int HTTP_PAYMENT_REQUIRED HTTP 状态码 402:需要付款。
static int HTTP_PRECON_FAILED HTTP 状态码 412:前提条件失败。
static int HTTP_PROXY_AUTH HTTP 状态码 407:需要代理身份验证。
static int HTTP_REQ_TOO_LONG HTTP 状态码 414:请求 URI 太大。
static int HTTP_RESET HTTP 状态码 205:重置内容。
static int HTTP_SEE_OTHER HTTP 状态码 303:请参阅其他。
static int HTTP_SERVER_ERROR 已弃用。 它放错了地方,不应该存在。
static int HTTP_UNAUTHORIZED HTTP 状态码 401:未经授权。
static int HTTP_UNAVAILABLE HTTP 状态码 503:服务不可用。
static int HTTP_UNSUPPORTED_TYPE HTTP 状态码 415:不支持的媒体类型。
static int HTTP_USE_PROXY HTTP 状态码 305:使用代理。
static int HTTP_VERSION HTTP 状态码 505:不支持 HTTP 版本。
protected boolean instanceFollowRedirects 如果为真,协议将自动遵循重定向。
protected String method HTTP 方法(GET、POST、PUT 等)。
protected int responseCode 一个表示三位 HTTP 状态码的 int。
protected String responseMessage HTTP 响应消息。
从类 java.net.URLConnection 继承的字段
allowUserInteraction, connected, doInput, doOutput, ifModifiedSince, url, useCaches

构造函数摘要

修饰符 构造函数 描述
protected HttpURLConnection(URL u) HttpURLConnection 的构造函数。

方法总结

修饰符和类型 方法 描述
abstract void disconnect() 表示在不久的将来不太可能向服务器发出其他请求。
InputStream getErrorStream() 如果连接失败但服务器仍然发送了有用的数据,则返回错误流。
static boolean getFollowRedirects() 返回一个布尔值,指示是否应自动遵循 HTTP 重定向 (3xx)。
String getHeaderField(int n) 返回第 n 个标头字段的值。
long getHeaderFieldDate(String name, long Default) 返回解析为日期的命名字段的值。
String getHeaderFieldKey(int n) 返回第 n 个标头字段的键。
boolean getInstanceFollowRedirects() 返回此 HttpURLConnection 的 instanceFollowRedirects 字段的值。
Permission getPermission() 返回一个 SocketPermission 对象,表示连接到目标主机和端口所需的权限。
String getRequestMethod() 获取请求方法。
int getResponseCode() 从 HTTP 响应消息中获取状态代码。
String getResponseMessage() 获取与响应代码一起从服务器返回的 HTTP 响应消息(如果有)。
void setChunkedStreamingMode(int chunklen) 当事先不知道内容长度时,此方法用于启用没有内部缓冲的 HTTP 请求正文的流式传输。
void setFixedLengthStreamingMode(int contentLength) 当预先知道内容长度时,此方法用于启用没有内部缓冲的 HTTP 请求正文的流式传输。
void setFixedLengthStreamingMode(long contentLength) 当预先知道内容长度时,此方法用于启用没有内部缓冲的 HTTP 请求正文的流式传输。
static void setFollowRedirects(boolean set) 设置该类是否应自动跟随 HTTP 重定向(响应代码为 3xx 的请求)。
void setInstanceFollowRedirects(boolean followRedirects) 设置此 HttpURLConnection 实例是否应自动跟随 HTTP 重定向(响应代码为 3xx 的请求)。
void setRequestMethod(String method) 设置 URL 请求的方法,其中之一: GET POST HEAD OPTIONS PUT DELETE TRACE 是合法的,受协议限制。
abstract boolean usingProxy() 指示连接是否通过代理。
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
从类 java.net.URLConnection 继承的方法
addRequestProperty, connect, getAllowUserInteraction, getConnectTimeout, getContent, getContent, getContentEncoding, getContentLength, getContentLengthLong, getContentType, getDate, getDefaultAllowUserInteraction, getDefaultRequestProperty, getDefaultUseCaches, getDoInput, getDoOutput, getExpiration, getFileNameMap, getHeaderField, getHeaderFieldInt, getHeaderFieldLong, getHeaderFields, getIfModifiedSince, getInputStream, getLastModified, getOutputStream, getReadTimeout, getRequestProperties, getRequestProperty, getURL, getUseCaches, guessContentTypeFromName, guessContentTypeFromStream, setAllowUserInteraction, setConnectTimeout, setContentHandlerFactory, setDefaultAllowUserInteraction, setDefaultRequestProperty, setDefaultUseCaches, setDoInput, setDoOutput, setFileNameMap, setIfModifiedSince, setReadTimeout, setRequestProperty, setUseCaches, toString

字段详细信息

HTTP_ACCEPTED

public static final int HTTP_ACCEPTED

HTTP 状态码 202:已接受。

HTTP_BAD_GATEWAY

public static final int HTTP_BAD_GATEWAY

HTTP 状态码 502:网关错误。

HTTP_BAD_METHOD

public static final int HTTP_BAD_METHOD

HTTP 状态码 405:不允许的方法。

HTTP_BAD_REQUEST

public static final int HTTP_BAD_REQUEST

HTTP 状态码 400:错误请求。

HTTP_CLIENT_TIMEOUT

public static final int HTTP_CLIENT_TIMEOUT

HTTP 状态码 408:请求超时。

HTTP_CONFLICT

public static final int HTTP_CONFLICT

HTTP 状态码 409:冲突。

HTTP_CREATED

public static final int HTTP_CREATED

HTTP 状态码 201:已创建。

HTTP_ENTITY_TOO_LARGE

public static final int HTTP_ENTITY_TOO_LARGE

HTTP 状态码 413:请求实体太大。

HTTP_FORBIDDEN

public static final int HTTP_FORBIDDEN

HTTP 状态码 403:禁止。

HTTP_GATEWAY_TIMEOUT

public static final int HTTP_GATEWAY_TIMEOUT

HTTP 状态码 504:网关超时。

HTTP_GONE

public static final int HTTP_GONE

HTTP 状态码 410:已消失。

HTTP_INTERNAL_ERROR

public static final int HTTP_INTERNAL_ERROR

HTTP 状态码 500:内部服务器错误。

HTTP_LENGTH_REQUIRED

public static final int HTTP_LENGTH_REQUIRED

HTTP 状态码 411:长度要求。

HTTP_MOVED_PERM

public static final int HTTP_MOVED_PERM

HTTP 状态码 301:永久移动。

HTTP_MOVED_TEMP

public static final int HTTP_MOVED_TEMP

HTTP 状态码 302:临时重定向。

HTTP_MULT_CHOICE

public static final int HTTP_MULT_CHOICE

HTTP 状态码 300:多项选择。

HTTP_NOT_ACCEPTABLE

public static final int HTTP_NOT_ACCEPTABLE

HTTP 状态码 406:不可接受。

HTTP_NOT_AUTHORITATIVE

public static final int HTTP_NOT_AUTHORITATIVE

HTTP 状态码 203:非权威信息。

HTTP_NOT_FOUND

public static final int HTTP_NOT_FOUND

HTTP 状态码 404:未找到。

HTTP_NOT_IMPLEMENTED

public static final int HTTP_NOT_IMPLEMENTED

HTTP 状态码 501:未实现。

HTTP_NOT_MODIFIED

public static final int HTTP_NOT_MODIFIED

HTTP 状态码 304:未修改。

HTTP_NO_CONTENT

public static final int HTTP_NO_CONTENT

HTTP 状态码 204:无内容。

HTTP_OK

public static final int HTTP_OK

HTTP 状态码 200:正常。

HTTP_PARTIAL

public static final int HTTP_PARTIAL

HTTP 状态码 206:部分内容。

HTTP_PAYMENT_REQUIRED

public static final int HTTP_PAYMENT_REQUIRED

HTTP 状态码 402:需要付款。

HTTP_PRECON_FAILED

public static final int HTTP_PRECON_FAILED

HTTP 状态码 412:前提条件失败。

HTTP_PROXY_AUTH

public static final int HTTP_PROXY_AUTH

HTTP 状态码 407:需要代理身份验证。

HTTP_REQ_TOO_LONG

public static final int HTTP_REQ_TOO_LONG

HTTP 状态码 414:请求 URI 太大。

HTTP_RESET

public static final int HTTP_RESET

HTTP 状态码 205:重置内容。

HTTP_SEE_OTHER

public static final int HTTP_SEE_OTHER

HTTP 状态码 303:请参阅其他。

HTTP_SERVER_ERROR

@Deprecated public static final int HTTP_SERVER_ERROR

已弃用。 它放错了地方,不应该存在。

HTTP 状态码 500:内部服务器错误。

HTTP_UNAUTHORIZED

public static final int HTTP_UNAUTHORIZED

HTTP 状态码 401:未经授权。

HTTP_UNAVAILABLE

public static final int HTTP_UNAVAILABLE

HTTP 状态码 503:服务不可用。

HTTP_UNSUPPORTED_TYPE

public static final int HTTP_UNSUPPORTED_TYPE

HTTP 状态码 415:不支持的媒体类型。

HTTP_USE_PROXY

public static final int HTTP_USE_PROXY

HTTP 状态码 305:使用代理。

HTTP_VERSION

public static final int HTTP_VERSION

HTTP 状态码 505:不支持 HTTP 版本。

chunkLength

protected int chunkLength

使用分块编码流模式进行输出时的块长度。 值 -1 表示对输出禁用分块编码。

fixedContentLength

protected int fixedContentLength

使用固定长度流模式时的固定内容长度。 值 -1 表示对输出禁用固定长度流模式。

注意:建议使用 fixedContentLengthLong 代替此字段,因为它允许设置更大的内容长度。

fixedContentLengthLong

protected long fixedContentLengthLong

使用固定长度流模式时的固定内容长度。 值 -1 表示对输出禁用固定长度流模式。

instanceFollowRedirects

protected boolean instanceFollowRedirects

如果为true,协议将自动遵循重定向。 如果为 false,协议将不会自动遵循重定向。

该字段由 setInstanceFollowRedirects 方法设置。 它的值由 getInstanceFollowRedirects 方法返回。

其默认值基于 HttpURLConnection 构建时静态 followRedirects 的值。

method

protected String method

HTTP 方法(GET、POST、PUT 等)。

responseCode

protected int responseCode

一个表示三位 HTTP 状态码的 int。

  • 1xx:信息
  • 2xx:成功
  • 3xx:重定向
  • 4xx:客户端错误
  • 5xx:服务器错误

responseMessage

protected String responseMessage

HTTP 响应消息。

构造函数详细信息

HttpURLConnection

protected HttpURLConnection(URL u)

HttpURLConnection 的构造函数。

参数:

参数名称 参数描述
u 网址

方法详情

getHeaderFieldKey

public String getHeaderFieldKey(int n)

返回第 n 个标头字段的键。 某些实现可能会将第 0 个标头字段视为特殊字段,即作为 HTTP 服务器返回的状态行。 在这种情况下,getHeaderField(0) 返回状态行,但 getHeaderFieldKey(0) 返回 null。

覆盖:

类 URLConnection 中的 getHeaderFieldKey

参数:

参数名称 参数描述
n 一个索引,其中 n >=0。

返回:

第 n 个标头字段的键,如果键不存在,则返回 null。

setFixedLengthStreamingMode

public void setFixedLengthStreamingMode(int contentLength)

当预先知道内容长度时,此方法用于启用没有内部缓冲的 HTTP 请求正文的流式传输。

如果应用程序尝试写入超过指定内容长度的数据,或者应用程序在写入指定数量之前关闭了 OutputStream,则会引发异常。

启用输出流时,无法自动处理身份验证和重定向。 如果需要身份验证或重定向,则在读取响应时将抛出 HttpRetryException。 可以查询此异常以获取错误的详细信息。

此方法必须在 URLConnection 连接之前调用。

注意:建议使用 setFixedLengthStreamingMode(long) 代替此方法,因为它允许设置更大的内容长度。

参数:

参数名称 参数描述
contentLength 将写入 OutputStream 的字节数。

Throws:

Throw名称 Throw描述
IllegalStateException 如果 URLConnection 已经连接或者已经启用了不同的流模式。
IllegalArgumentException 如果指定的内容长度小于零。

setFixedLengthStreamingMode

public void setFixedLengthStreamingMode(long contentLength)

当预先知道内容长度时,此方法用于启用没有内部缓冲的 HTTP 请求正文的流式传输。

如果应用程序尝试写入超过指定内容长度的数据,或者应用程序在写入指定数量之前关闭了 OutputStream,则会引发异常。

启用输出流时,无法自动处理身份验证和重定向。 如果需要身份验证或重定向,则在读取响应时将抛出 HttpRetryException。 可以查询此异常以获取错误的详细信息。

此方法必须在 URLConnection 连接之前调用。

通过调用此方法设置的内容长度优先于由 setFixedLengthStreamingMode(int) 设置的任何值。

参数:

参数名称 参数描述
contentLength 将写入 OutputStream 的字节数。

Throws:

Throw名称 Throw描述
IllegalStateException 如果 URLConnection 已经连接或者已经启用了不同的流模式。
IllegalArgumentException 如果指定的内容长度小于零。

setChunkedStreamingMode

public void setChunkedStreamingMode(int chunklen)

当事先不知道内容长度时,此方法用于启用没有内部缓冲的 HTTP 请求正文的流式传输。 在这种模式下,分块传输编码用于发送请求正文。 注意,并不是所有的 HTTP 服务器都支持这种模式。

启用输出流时,无法自动处理身份验证和重定向。 如果需要身份验证或重定向,则在读取响应时将抛出 HttpRetryException。 可以查询此异常以获取错误的详细信息。

此方法必须在 URLConnection 连接之前调用。

参数:

参数名称 参数描述
chunklen 每个块中要写入的字节数。 如果 chunklen 小于或等于零,将使用默认值。

Throws:

Throw名称 Throw描述
IllegalStateException 如果 URLConnection 已经连接或者已经启用了不同的流模式。

getHeaderField

public String getHeaderField(int n)

返回第 n 个标头字段的值。 某些实现可能会将第 0 个标头字段视为特殊字段,即作为 HTTP 服务器返回的状态行。

此方法可以与 getHeaderFieldKey 方法结合使用,以遍历消息中的所有标头。

覆盖:

类 URLConnection 中的 getHeaderField

参数:

参数名称 参数描述
n 一个索引,其中 n>=0。

返回:

第 n 个标头字段的值,如果该值不存在,则为 null。

setFollowRedirects

public static void setFollowRedirects(boolean set)

设置该类是否应自动跟随 HTTP 重定向(响应代码为 3xx 的请求)。 默认为真。 小程序无法更改此变量。

如果有安全管理器,该方法首先调用安全管理器的 checkSetFactory 方法,确保操作被允许。 这可能会导致 SecurityException。

参数:

参数名称 参数描述
set 一个布尔值,指示是否遵循 HTTP 重定向。

Throws:

Throw名称 Throw描述
SecurityException 如果存在安全管理器并且其 checkSetFactory 方法不允许该操作。

getFollowRedirects

public static boolean getFollowRedirects()

返回一个布尔值,指示是否应自动遵循 HTTP 重定向 (3xx)。

返回:

如果应该自动遵循 HTTP 重定向,则为 true,否则为 false。

setInstanceFollowRedirects

public void setInstanceFollowRedirects(boolean followRedirects)

设置此 HttpURLConnection 实例是否应自动跟随 HTTP 重定向(响应代码为 3xx 的请求)。

默认值来自followRedirects,默认为true。

参数:

参数名称 参数描述
followRedirects 一个布尔值,指示是否遵循 HTTP 重定向。

getInstanceFollowRedirects

public boolean getInstanceFollowRedirects()

返回此 HttpURLConnection 的 instanceFollowRedirects 字段的值。

返回:

此 HttpURLConnection 的 instanceFollowRedirects 字段的值。

setRequestMethod

public void setRequestMethod(String method) throws ProtocolException

设置 URL 请求的方法,其中之一:

  • GET
  • POST
  • HEAD
  • OPTIONS
  • PUT
  • DELETE
  • TRACE

是合法的,受协议限制。 默认方法是 GET。

参数:

参数名称 参数描述
method HTTP方法

Throws:

Throw名称 Throw描述
ProtocolException 如果方法无法重置或者请求的方法对 HTTP 无效。
SecurityException 如果设置了安全管理器且方法为“TRACE”,但未授予“allowHttpTrace”NetPermission。

getRequestMethod

public String getRequestMethod()

获取请求方法。

返回:

HTTP 请求方法

getResponseCode

public int getResponseCode() throws IOException

从 HTTP 响应消息中获取状态代码。 例如,在以下状态行的情况下:

 HTTP/1.0 200 OK HTTP/1.0 401 Unauthorized 

它将分别返回 200 和 401。 如果无法从响应中识别出任何代码(即响应不是有效的 HTTP),则返回 -1。

返回:

HTTP 状态码,或 -1

Throws:

Throw名称 Throw描述
IOException 如果连接到服务器时发生错误。

getResponseMessage

public String getResponseMessage() throws IOException

获取与响应代码一起从服务器返回的 HTTP 响应消息(如果有)。 来自以下回复:

 HTTP/1.0 200 OK HTTP/1.0 404 Not Found 

分别提取字符串“OK”和“Not Found”。 如果无法从响应中辨别出任何内容(结果不是有效的 HTTP),则返回 null。

返回:

HTTP 响应消息,或 null

Throws:

Throw名称 Throw描述
IOException 如果连接到服务器时发生错误。

getHeaderFieldDate

public long getHeaderFieldDate(String name, long Default)

从类中复制的描述:URLConnection

返回解析为日期的命名字段的值。 结果是命名字段表示的自 1970 年 1 月 1 日 GMT 以来的毫秒数。

存在这种形式的 getHeaderField 是因为某些连接类型(例如 http-ng)具有预解析的标头。 该连接类型的类可以覆盖此方法并使解析短路。

覆盖:

类 URLConnection 中的 getHeaderFieldDate

参数:

参数名称 参数描述
name 标题字段的名称。
Default 默认值。

返回:

字段的值,解析为日期。 如果字段丢失或格式错误,则返回 Default 参数的值。

disconnect

public abstract void disconnect()

表示在不久的将来不太可能向服务器发出其他请求。 调用 disconnect() 不应暗示此 HttpURLConnection 实例可用于其他请求。

usingProxy

public abstract boolean usingProxy()

指示连接是否通过代理。

返回:

一个布尔值,指示连接是否使用代理。

getPermission

public Permission getPermission() throws IOException

返回一个 SocketPermission 对象,表示连接到目标主机和端口所需的权限。

覆盖:

类 URLConnection 中的 getPermission

返回:

一个 SocketPermission 对象,表示连接到目标主机和端口所需的权限。

Throws:

Throw名称 Throw描述
IOException 如果在计算权限时发生错误。

getErrorStream

public InputStream getErrorStream()

如果连接失败但服务器仍然发送了有用的数据,则返回错误流。 典型的例子是当 HTTP 服务器响应 404 时,这将导致在连接中抛出 FileNotFoundException,但服务器发送了一个 HTML 帮助页面,其中包含有关如何操作的建议。

此方法不会导致启动连接。 如果连接未连接,或者服务器在连接时没有错误,或者服务器有错误但没有发送错误数据,则此方法将返回 null。 这是默认设置。

返回:

如果有错误流,如果没有错误,则返回 null,连接未连接或服务器未发送有用数据。