HttpURLConnection 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
支持 HTTP 特定功能的 URLConnection。
[Android.Runtime.Register("java/net/HttpURLConnection", DoNotGenerateAcw=true)]
public abstract class HttpURLConnection : Java.Net.URLConnection
[<Android.Runtime.Register("java/net/HttpURLConnection", DoNotGenerateAcw=true)>]
type HttpURLConnection = class
inherit URLConnection
- 继承
- 派生
- 属性
注解
支持 HTTP 特定功能的 URLConnection。 有关详细信息 ,请参阅规范 。
此类的使用遵循一种模式:<ol><li>通过调用HttpURLConnection结果并将结果URL#openConnection() URL.openConnection()强制转换为新的HttpURLConnection方法。
<li>准备请求。 请求的主要属性是其 URI。 请求标头还可以包括元数据,例如凭据、首选内容类型和会话 Cookie。
<li>(可选)上传请求正文。 如果实例包含请求正文,则必须配置 #setDoOutput(boolean) setDoOutput(true) 实例。 通过写入到返回的 #getOutputStream()流来传输数据。
<li>读取响应。 响应标头通常包括元数据,例如响应正文的内容类型和长度、修改的日期和会话 Cookie。 响应正文可以从返回的 #getInputStream()流中读取。 如果响应没有正文,该方法将返回空流。
<li>Disconnect。 读取响应正文后, HttpURLConnection 应通过调用 #disconnect()关闭响应正文。 断开连接会释放连接持有的资源,以便可以关闭或重复使用它们。
</ol>
例如,若要在以下位置 http://www.android.com/检索网页:
{@code
URL url = new URL("http://www.android.com/");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
readStream(in);
} finally {
urlConnection.disconnect();
}
}
<h3 使用“https”方案调用 URL 时,h3>安全与 HTTPS</h3> 通信将返回一个URL#openConnection(),允许重写默认值HttpsURLConnection和 javax.net.ssl.HostnameVerifier HostnameVerifier。javax.net.ssl.SSLSocketFactory SSLSocketFactory 从创建SSLSocketFactory的应用程序javax.net.ssl.SSLContext SSLContext可以提供用于验证证书链的自定义javax.net.ssl.X509TrustManager X509TrustManager项和用于提供客户端证书的自定义javax.net.ssl.X509KeyManager X509KeyManager项。 有关详细信息,请参阅 javax.net.ssl.HttpsURLConnection HttpsURLConnection。
<h3>响应处理</h3>HttpURLConnection 将跟进五个 HTTP 重定向。 它将遵循从一个源服务器的重定向到另一个源服务器。 此实现不遵循从 HTTPS 到 HTTP 的重定向,反之亦然。
如果 HTTP 响应指示发生了错误, #getInputStream() 将引发一个 IOException。 用于 #getErrorStream() 读取错误响应。 可以使用 以正常方式 #getHeaderFields()读取标头:
<h3>发布内容</h3> 若要将数据上传到 Web 服务器,请使用 #setDoOutput(boolean) setDoOutput(true)配置输出的连接。
为了获得最佳性能,应先调用 #setFixedLengthStreamingMode(int) 正文长度,或者 #setChunkedStreamingMode(int) 不是。 否则 HttpURLConnection ,将被迫在内存中缓冲完整的请求正文,然后再传输、浪费(可能耗尽)堆以及增加延迟。
例如,若要执行上传,请执行以下操作:
{@code
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
urlConnection.setDoOutput(true);
urlConnection.setChunkedStreamingMode(0);
OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
writeStream(out);
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
readStream(in);
} finally {
urlConnection.disconnect();
}
}
<h3>性能</h3> 此类返回的输入和输出流是 <强>不缓冲</强>的。 大多数调用方应使用 java.io.BufferedInputStream BufferedInputStream 或 java.io.BufferedOutputStream BufferedOutputStream. 仅执行大容量读取或写入操作的调用方可能会省略缓冲。
在向服务器传输大量数据时,请使用流来限制一次内存中的数据量。 除非需要整个正文同时位于内存中,否则请将其作为流处理(而不是将完整正文存储为单个字节数组或字符串)。
为了降低延迟,此类可能会对多个请求/响应对重复使用相同的基础 Socket 。 因此,HTTP 连接可能比必要时间长。
#disconnect()调用可将套接字返回到连接的套接字池。
默认情况下,服务器使用 gzip 压缩的请求的此实现 HttpURLConnection 会自动解压缩调用方 #getInputStream()的数据。 在这种情况下,清除了 Content-Encoding 和 Content-Length 响应标头。 可以通过在请求标头中设置可接受的编码来禁用 Gzip 压缩:
{@code
urlConnection.setRequestProperty("Accept-Encoding", "identity");
}
设置 Accept-Encoding 请求标头显式禁用自动解压缩,并使响应标头保持不变;根据响应的内容编码标头,调用方必须根据需要处理解压缩。
#getContentLength() 返回传输的字节数,并且不能用于预测可从中读取 #getInputStream() 压缩流的字节数。 相反,请读取该流,直到它耗尽,即返回 -1 时 InputStream#read 。
<h3>处理网络登录</h3> 某些 Wi-Fi 网络会阻止 Internet 访问,直到用户单击登录页。 通常使用 HTTP 重定向来显示此类登录页。 可用于 #getURL() 测试连接是否已意外重定向。 此检查在收到响应标头后或强后才有效<,可以通过调用或>触发<此>检查。#getHeaderFields()#getInputStream() 例如,若要检查响应是否未重定向到意外主机:
{@code
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
if (!url.getHost().equals(urlConnection.getURL().getHost())) {
// we were redirected! Kick the user out to the browser to sign on?
}
...
} finally {
urlConnection.disconnect();
}
}
<h3>HTTP 身份验证</h3>HttpURLConnection 支持 HTTP 基本身份验证。 用于 Authenticator 设置 VM 范围的身份验证处理程序:
{@code
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password.toCharArray());
}
});
}
除非与 HTTPS 配对,否则这是<用于><>用户身份验证的安全机制。 具体而言,用户名、密码、请求和响应均通过网络传输,无需加密。
<使用 Cookie>/h3 建立和维护客户端和服务器之间可能长期存在的会话的 h3<> 会话包括HttpURLConnection可扩展的 Cookie 管理器。 使用 CookieHandler 和 CookieManager:
{@code
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);
}
默认情况下, CookieManager 仅接受 来自源服务器的 Cookie。 另外两个策略包括: CookiePolicy#ACCEPT_ALL 和 CookiePolicy#ACCEPT_NONE。 实现 CookiePolicy 以定义自定义策略。
默认值 CookieManager 将所有接受的 Cookie 保留在内存中。 VM 退出时会忘记这些 Cookie。 实现 CookieStore 以定义自定义 Cookie 存储。
除了 HTTP 响应设置的 Cookie 之外,还可以以编程方式设置 Cookie。 若要包含在 HTTP 请求标头中,Cookie 必须设置域和路径属性。
默认情况下,仅适用于支持 HttpCookie Cookie 的服务器的新实例。 许多 Web 服务器仅支持较旧的规范 RFC 2109。 若要与大多数 Web 服务器兼容,请将 Cookie 版本设置为 0。
例如,若要以法语接收 www.twitter.com :
{@code
HttpCookie cookie = new HttpCookie("lang", "fr");
cookie.setDomain("twitter.com");
cookie.setPath("/");
cookie.setVersion(0);
cookieManager.getCookieStore().add(new URI("http://twitter.com/"), cookie);
}
<h3>HTTP 方法</h3>
HttpURLConnection 默认情况下使用 GET 该方法。 如果POST已调用,它将使用#setDoOutput setDoOutput(true)。 其他 HTTP 方法(OPTIONS、HEAD和PUTDELETETRACE)可用于。#setRequestMethod
<h3>代理</h3> 默认情况下,此类将直接连接到 源服务器。 它还可以通过或Proxy.Type#HTTP HTTPProxy.Type#SOCKS SOCKS代理进行连接。 若要使用代理,在创建连接时使用 URL#openConnection(Proxy) URL.openConnection(Proxy) 。
<h3>IPv6 支持</h3>
此类包括对 IPv6 的透明支持。 对于同时具有 IPv4 和 IPv6 地址的主机,它将尝试连接到主机的每个地址,直到建立连接。
<h3>响应缓存</h3> Android 4.0(冰淇淋三明治,API 级别 15)包括响应缓存。 有关在应用程序中启用 HTTP 缓存的说明,请参阅 android.net.http.HttpResponseCache 。
<h3>在 Android 2.2(Froyo)早期版本中<避免 Bug/h3> ,此类有一些令人沮丧的 bug。 具体而言,调用 close() 可读操作 InputStream 可能会使连接池中毒。 通过禁用连接池来解决此问题:
{@code
private void disableConnectionReuseIfNecessary() {
// Work around pre-Froyo bugs in HTTP connection reuse.
if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {
System.setProperty("http.keepAlive", "false");
}
}}
每个实例 HttpURLConnection 都可用于一个请求/响应对。 此类的实例不是线程安全的。
在 JDK1.1 中添加。
Java文档java.net.HttpURLConnection。
本页的某些部分是根据 创建和共享的工作进行的修改,并根据 许可证中所述的条款使用。
构造函数
| 名称 | 说明 |
|---|---|
| HttpURLConnection(IntPtr, JniHandleOwnership) |
创建 JNI 对象的托管表示形式时使用的构造函数;由运行时调用。 |
| HttpURLConnection(URL) |
HttpURLConnection 的构造函数。 |
字段
| 名称 | 说明 |
|---|---|
| HttpAccepted |
已过时.
HTTP Status-Code 202:已接受。 |
| HttpBadGateway |
已过时.
HTTP Status-Code 502:网关错误。 |
| HttpBadMethod |
已过时.
HTTP Status-Code 405:不允许使用的方法。 |
| HttpBadRequest |
已过时.
HTTP Status-Code 400:请求错误。 |
| HttpClientTimeout |
已过时.
HTTP Status-Code 408:请求超时。 |
| HttpConflict |
已过时.
HTTP Status-Code 409:冲突。 |
| HttpCreated |
已过时.
HTTP Status-Code 201:已创建。 |
| HttpEntityTooLarge |
已过时.
HTTP Status-Code 413:请求实体太大。 |
| HttpForbidden |
已过时.
HTTP Status-Code 403:禁止访问。 |
| HttpGatewayTimeout |
已过时.
HTTP Status-Code 504:网关超时。 |
| HttpGone |
已过时.
HTTP Status-Code 410:已消失。 |
| HttpInternalError |
已过时.
HTTP Status-Code 500:内部服务器错误。 |
| HttpLengthRequired |
已过时.
HTTP Status-Code 411:所需的长度。 |
| HttpMovedPerm |
已过时.
HTTP Status-Code 301:永久移动。 |
| HttpMovedTemp |
已过时.
HTTP Status-Code 302:临时重定向。 |
| HttpMultChoice |
已过时.
HTTP Status-Code 300:多个选择。 |
| HttpNoContent |
已过时.
HTTP Status-Code 204:无内容。 |
| HttpNotAcceptable |
已过时.
HTTP Status-Code 406:不可接受。 |
| HttpNotAuthoritative |
已过时.
HTTP Status-Code 203:非权威信息。 |
| HttpNotFound |
已过时.
HTTP Status-Code 404:找不到。 |
| HttpNotImplemented |
已过时.
HTTP Status-Code 501:未实现。 |
| HttpNotModified |
已过时.
HTTP Status-Code 304:未修改。 |
| HttpOk |
已过时.
HTTP Status-Code 200:确定。 |
| HttpPartial |
已过时.
HTTP Status-Code 206:部分内容。 |
| HttpPaymentRequired |
已过时.
HTTP Status-Code 402:需要付款。 |
| HttpPreconFailed |
已过时.
HTTP Status-Code 412:先决条件失败。 |
| HttpProxyAuth |
已过时.
HTTP Status-Code 407:需要代理身份验证。 |
| HttpReqTooLong |
已过时.
HTTP Status-Code 414:Request-URI 太大。 |
| HttpReset |
已过时.
HTTP Status-Code 205:重置内容。 |
| HttpSeeOther |
已过时.
HTTP Status-Code 303:请参阅其他。 |
| HttpServerError |
已过时.
HTTP Status-Code 500:内部服务器错误。 |
| HttpUnauthorized |
已过时.
HTTP Status-Code 401:未经授权。 |
| HttpUnavailable |
已过时.
HTTP Status-Code 503:服务不可用。 |
| HttpUnsupportedType |
已过时.
HTTP Status-Code 415:不支持的媒体类型。 |
| HttpUseProxy |
已过时.
HTTP Status-Code 305:使用代理。 |
| HttpVersion |
已过时.
HTTP Status-Code 505:不支持 HTTP 版本。 |
属性
| 名称 | 说明 |
|---|---|
| AllowUserInteraction |
返回此对象的字段的值 |
| ChunkLength |
使用分块编码流式处理模式进行输出时,区块长度。 |
| Class |
返回此 |
| Connected |
如果 |
| ConnectTimeout |
返回连接超时的设置。 - 或 - 设置指定超时值(以毫秒为单位),用于打开此 URLConnection 引用的资源的通信链接。 (继承自 URLConnection) |
| Content |
检索此 URL 连接的内容。 (继承自 URLConnection) |
| ContentEncoding |
返回标头字段的值 |
| ContentLength |
返回标头字段的值 |
| ContentLengthLong |
将标头字段的值 |
| ContentType |
返回标头字段的值 |
| Date |
返回标头字段的值 |
| DefaultUseCaches |
返回 's |
| DoInput |
返回此 |
| DoOutput |
返回此 |
| ErrorStream |
如果连接失败,但服务器仍发送了有用的数据,则返回错误流。 |
| Expiration |
返回标头字段的值 |
| FixedContentLength |
使用固定长度流模式时的固定内容长度。 |
| FixedContentLengthLong |
使用固定长度流模式时的固定内容长度。 |
| FollowRedirects |
返回一个 |
| Handle |
基础 Android 实例的句柄。 (继承自 Object) |
| HeaderFields |
返回标头字段的不可修改的映射。 (继承自 URLConnection) |
| IfModifiedSince |
返回此对象的 |
| InputStream |
返回从此打开的连接中读取的输入流。 (继承自 URLConnection) |
| InstanceFollowRedirects |
返回此 |
| JniIdentityHashCode |
获取互操作运行时分配给此Java对等的标识哈希代码。 (继承自 Object) |
| JniManagedPeerState |
支持 HTTP 特定功能的 URLConnection。 (继承自 JavaObject) |
| JniPeerMembers |
支持 HTTP 特定功能的 URLConnection。 |
| LastModified |
返回标头字段的值 |
| Method |
HTTP 方法(GET、POST、PUT 等) |
| OutputStream |
返回写入此连接的输出流。 (继承自 URLConnection) |
| PeerReference |
获取此Java对等方的 JNI 对象引用。 (继承自 Object) |
| Permission |
返回一个权限对象,该对象表示建立由此对象表示的连接所需的权限。 (继承自 URLConnection) |
| ReadTimeout |
返回读取超时的设置。 - 或 - 将读取超时设置为指定的超时,以毫秒为单位。 (继承自 URLConnection) |
| RequestMethod |
获取请求方法。 - 或 - 设置 URL 请求的方法之一:<UL><LI GET >LI<>POST <LI HEAD >LI<OPTIONS >LI<>PUT<><> LI TRACE </UL> 是合法的,受协议限制。 |
| RequestProperties |
返回此连接的常规请求属性的不可修改映射。 (继承自 URLConnection) |
| ResponseCode |
从 HTTP 响应消息获取状态代码。 |
| ResponseMessage |
获取与服务器响应代码一起返回的 HTTP 响应消息(如果有)。 |
| ThresholdClass |
此 API 支持 Mono for Android 基础结构,不打算直接从代码使用。 |
| ThresholdType |
此 API 支持 Mono for Android 基础结构,不打算直接从代码使用。 |
| Url |
URL 表示打开此连接的万维网上的远程对象。 (继承自 URLConnection) |
| URL |
返回此 |
| UseCaches |
返回此 |
方法
| 名称 | 说明 |
|---|---|
| AddRequestProperty(String, String) |
添加由键值对指定的常规请求属性。 (继承自 URLConnection) |
| Clone() |
创建并返回此对象的副本。 (继承自 Object) |
| Connect() |
打开此 URL 引用的资源的通信链接(如果尚未建立此类连接)。 (继承自 URLConnection) |
| ConnectAsync() |
支持 HTTP 特定功能的 URLConnection。 (继承自 URLConnection) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
支持 HTTP 特定功能的 URLConnection。 (继承自 JavaObject) |
| Disconnect() |
指示近期不太可能向服务器发出其他请求。 |
| Dispose() |
释放此Java对等方持有的资源。 (继承自 Object) |
| Dispose(Boolean) |
释放此Java对等方持有的资源。 (继承自 Object) |
| DisposeUnlessReferenced() |
支持 HTTP 特定功能的 URLConnection。 (继承自 JavaObject) |
| Equals(Object) |
支持 HTTP 特定功能的 URLConnection。 (继承自 JavaObject) |
| Equals(Object) |
指示其他对象是否“等于”此对象。 (继承自 Object) |
| GetContent(Class[]) |
检索此 URL 连接的内容。 (继承自 URLConnection) |
| GetHashCode() |
返回对象的哈希代码值。 (继承自 Object) |
| GetHeaderField(Int32) |
返回 sup th/sup |
| GetHeaderField(String) |
返回命名标头字段的值。 (继承自 URLConnection) |
| GetHeaderFieldDate(String, Int64) |
返回被分析为日期的命名字段的值。 (继承自 URLConnection) |
| GetHeaderFieldInt(String, Int32) |
返回被分析为数字的命名字段的值。 (继承自 URLConnection) |
| GetHeaderFieldKey(Int32) |
返回 sup |
| GetHeaderFieldLong(String, Int64) |
返回被分析为数字的命名字段的值。 (继承自 URLConnection) |
| GetRequestProperty(String) |
返回此连接的命名常规请求属性的值。 (继承自 URLConnection) |
| JavaFinalize() |
当垃圾回收确定不再引用该对象时,由对象上的垃圾回收器调用。 (继承自 Object) |
| Notify() |
唤醒正在等待此对象的监视器的单个线程。 (继承自 Object) |
| NotifyAll() |
唤醒正在等待此对象的监视器的所有线程。 (继承自 Object) |
| SetChunkedStreamingMode(Int32) |
此方法用于在内容长度<不是> b</b> 时启用 HTTP 请求正文的流式处理,而无需进行内部缓冲。 |
| SetFixedLengthStreamingMode(Int32) |
当事先知道内容长度时,此方法用于在不进行内部缓冲的情况下启用 HTTP 请求正文的流式传输。 |
| SetFixedLengthStreamingMode(Int64) |
当事先知道内容长度时,此方法用于在不进行内部缓冲的情况下启用 HTTP 请求正文的流式传输。 |
| SetHandle(IntPtr, JniHandleOwnership) |
设置 Handle 属性。 (继承自 Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
支持 HTTP 特定功能的 URLConnection。 (继承自 JavaObject) |
| SetRequestProperty(String, String) |
设置常规请求属性。 (继承自 URLConnection) |
| ToArray<T>() |
从此Java数组包装器创建托管数组。 (继承自 Object) |
| ToString() |
返回对象的字符串表示形式。 (继承自 Object) |
| UnregisterFromRuntime() |
从互操作运行时取消注册此Java对等。 (继承自 Object) |
| UsingProxy() |
指示连接是否通过代理。 |
| Wait() |
使当前线程等待,直到唤醒它,通常是通过 em 通知/em< 或 >em<interrupted>/em<。><> (继承自 Object) |
| Wait(Int64, Int32) |
使当前线程等待直到唤醒,通常是通过 <em>通知</em> 或 <em interrupted>/em<>,或直到经过一定数量的实时。 (继承自 Object) |
| Wait(Int64) |
使当前线程等待直到唤醒,通常是通过 <em>通知</em> 或 <em interrupted>/em<>,或直到经过一定数量的实时。 (继承自 Object) |
显式接口实现
| 名称 | 说明 |
|---|---|
| IJavaPeerable.Disposed() |
支持 HTTP 特定功能的 URLConnection。 (继承自 JavaObject) |
| IJavaPeerable.Finalized() |
支持 HTTP 特定功能的 URLConnection。 (继承自 JavaObject) |
| IJavaPeerable.JniObjectReferenceControlBlock |
支持 HTTP 特定功能的 URLConnection。 (继承自 JavaObject) |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
支持 HTTP 特定功能的 URLConnection。 (继承自 JavaObject) |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
支持 HTTP 特定功能的 URLConnection。 (继承自 JavaObject) |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
支持 HTTP 特定功能的 URLConnection。 (继承自 JavaObject) |
扩展方法
| 名称 | 说明 |
|---|---|
| GetJniTypeName(IJavaPeerable) |
获取实例 |
| JavaAs<TResult>(IJavaPeerable) |
尝试强制 |
| JavaCast<TResult>(IJavaObject) |
执行 Android 运行时检查的类型转换。 |
| JavaCast<TResult>(IJavaObject) |
支持 HTTP 特定功能的 URLConnection。 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
尝试强制 |