HttpURLConnection 类

定义

支持 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(),允许重写默认值HttpsURLConnectionjavax.net.ssl.HostnameVerifier HostnameVerifierjavax.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 BufferedInputStreamjava.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 管理器。 使用 CookieHandlerCookieManager

{@code
              CookieManager cookieManager = new CookieManager();
              CookieHandler.setDefault(cookieManager);
            }

默认情况下, CookieManager 仅接受 来自源服务器的 Cookie。 另外两个策略包括: CookiePolicy#ACCEPT_ALLCookiePolicy#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 方法(OPTIONSHEADPUTDELETETRACE)可用于。#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

返回此对象的字段的值 allowUserInteraction 。 - 或 - 设置此allowUserInteraction字段的值URLConnection

(继承自 URLConnection)
ChunkLength

使用分块编码流式处理模式进行输出时,区块长度。

Class

返回此 Object的运行时类。

(继承自 Object)
Connected

如果 false,此连接对象尚未创建指向指定 URL 的通信链接。

(继承自 URLConnection)
ConnectTimeout

返回连接超时的设置。 - 或 - 设置指定超时值(以毫秒为单位),用于打开此 URLConnection 引用的资源的通信链接。

(继承自 URLConnection)
Content

检索此 URL 连接的内容。

(继承自 URLConnection)
ContentEncoding

返回标头字段的值 content-encoding

(继承自 URLConnection)
ContentLength

返回标头字段的值 content-length

(继承自 URLConnection)
ContentLengthLong

将标头字段的值 content-length 返回为长。

(继承自 URLConnection)
ContentType

返回标头字段的值 content-type

(继承自 URLConnection)
Date

返回标头字段的值 date

(继承自 URLConnection)
DefaultUseCaches

返回 's URLConnection 标志的useCaches默认值。 - 或 - 将字段的 useCaches 默认值设置为指定值。

(继承自 URLConnection)
DoInput

返回此 URLConnection标志 doInput 的值。 - 或 - 将字段doInput的值URLConnection设置为指定值。

(继承自 URLConnection)
DoOutput

返回此 URLConnection标志 doOutput 的值。 - 或 - 将字段doOutput的值URLConnection设置为指定值。

(继承自 URLConnection)
ErrorStream

如果连接失败,但服务器仍发送了有用的数据,则返回错误流。

Expiration

返回标头字段的值 expires

(继承自 URLConnection)
FixedContentLength

使用固定长度流模式时的固定内容长度。

FixedContentLengthLong

使用固定长度流模式时的固定内容长度。

FollowRedirects

返回一个 boolean 指示是否应自动遵循 HTTP 重定向(3xx)。 - 或 - 设置 HTTP 重定向(响应代码为 3xx 的请求)是否应自动后跟此类。

Handle

基础 Android 实例的句柄。

(继承自 Object)
HeaderFields

返回标头字段的不可修改的映射。

(继承自 URLConnection)
IfModifiedSince

返回此对象的 ifModifiedSince 字段的值。 - 或 - 将此ifModifiedSince字段的值URLConnection设置为指定值。

(继承自 URLConnection)
InputStream

返回从此打开的连接中读取的输入流。

(继承自 URLConnection)
InstanceFollowRedirects

返回此 HttpURLConnection字段 instanceFollowRedirects 的值。 - 或 - 设置 HTTP 重定向(响应代码为 3xx 的请求)是否应自动后跟此 HttpURLConnection 实例。

JniIdentityHashCode

获取互操作运行时分配给此Java对等的标识哈希代码。

(继承自 Object)
JniManagedPeerState

支持 HTTP 特定功能的 URLConnection。

(继承自 JavaObject)
JniPeerMembers

支持 HTTP 特定功能的 URLConnection。

LastModified

返回标头字段的值 last-modified

(继承自 URLConnection)
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

返回此 URLConnection字段 URL 的值。

(继承自 URLConnection)
UseCaches

返回此 URLConnection字段 useCaches 的值。 - 或 - 将此useCaches字段的值URLConnection设置为指定值。

(继承自 URLConnection)

方法

名称 说明
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/supn 标头字段的值<>。<>

(继承自 URLConnection)
GetHeaderField(String)

返回命名标头字段的值。

(继承自 URLConnection)
GetHeaderFieldDate(String, Int64)

返回被分析为日期的命名字段的值。

(继承自 URLConnection)
GetHeaderFieldInt(String, Int32)

返回被分析为数字的命名字段的值。

(继承自 URLConnection)
GetHeaderFieldKey(Int32)

返回 supnth</sup> 标头字段的<>键。

(继承自 URLConnection)
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)

获取实例 self类型的 JNI 名称。

JavaAs<TResult>(IJavaPeerable)

尝试强制self键入TResult,检查强制是否在Java端有效。

JavaCast<TResult>(IJavaObject)

执行 Android 运行时检查的类型转换。

JavaCast<TResult>(IJavaObject)

支持 HTTP 特定功能的 URLConnection。

TryJavaCast<TResult>(IJavaPeerable, TResult)

尝试强制self键入TResult,检查强制是否在Java端有效。

适用于