简单易用的 HTTP 客户端,用于从 web 收发数据。
成员函数
ISteamHTTP 的成员函数通过全局访问器函数
SteamHTTP() 调用。
CreateCookieContainer
HTTPCookieContainerHandle CreateCookieContainer( bool bAllowResponsesToModify );
| 名称 | 类型 | 描述 |
| bAllowResponsesToModify | bool | 设置服务器是否可在此容器内设 cookie。 |
创建 cookie 容器以存储进程生存期间的 cookie。
此 API 仅能在进程生存期内使用,重启 Steam 后便不会留有任何 cookie,重复执行进程后也无法再访问 cookie 容器。
如果
bAllowResponsesToModify 为
true,那么任何使用此 cookie 容器对请求的响应均可在容器内新增 cookie,可在以后的请求中传送。 如果为
false,则只有显示设置的 cookie 才会发送。
您可使用
SetHTTPRequestCookieContainer 将 cookie 容器与 HTTP 请求关联,并使用
SetCookie 设置 cookie。
使用完毕后切记调用
ReleaseCookieContainer 将容器清空,以免泄漏内存!
返回: HTTPCookieContainerHandle返回 cookie 新容器句柄,用于将来调用 SteamHTTP 函数。
CreateHTTPRequest
HTTPRequestHandle CreateHTTPRequest( EHTTPMethod eHTTPRequestMethod, const char *pchAbsoluteURL );
初始化新的 HTTP 请求。
必须要有如 GET 或 POST 等方法,以及请求的绝对 URL。 支持 HTTP 和 HTTPS,所以此字符串必须以“
http://”或“https://”开头,类似于“http://store.steampowered.com/app/10/”。 此调用返回的句柄可用于进一步调用以进行准备,然后再使用
SendHTTPRequest 或
SendHTTPRequestAndStreamResponse 发送 HTTP 请求。
使用完毕后切记调用
ReleaseHTTPRequest 将 HTTP 请求清空,以免内存泄漏!
返回: HTTPRequestHandle返回新的请求句柄,用于将来调用 SteamHTTP 函数。 如果
pchAbsoluteURL 为
NULL 或为空(""),则返回
INVALID_HTTPREQUEST_HANDLE。
DeferHTTPRequest
bool DeferHTTPRequest( HTTPRequestHandle hRequest );
将已发送的请求移到队列后面,以推迟该请求。
返回: bool
如果成功推迟请求,返回
true; 否则,如果
hRequest 为无效句柄,或请求尚未发送,则返回
false。
另见: SendHTTPRequest、
SendHTTPRequestAndStreamResponseGetHTTPDownloadProgressPct
bool GetHTTPDownloadProgressPct( HTTPRequestHandle hRequest, float *pflPercentOut );
获得为请求下载正文的进度。
除非已收到含有内容长度字段的响应标头,否则为零。 由于在连接关闭前大小未知,因此,对于不包含内容长度的响应,将在请求的持续时间内报告为零。
返回: bool
如果成功返回下载百分比,返回
true; 否则,如果句柄无效或
pflPercentOut 为
NULL,则返回
false。
GetHTTPRequestWasTimedOut
bool GetHTTPRequestWasTimedOut( HTTPRequestHandle hRequest, bool *pbWasTimedOut );
检查请求失败的原因是否为请求超时(而非其他更严重的失败)。
如果
m_bRequestSuccessful 为
false,您需要在
HTTPRequestCompleted_t 的上下文中调用此函数。
返回: bool
如果检查成功,返回
true;
在下列情况发生时,返回
false:
GetHTTPResponseBodyData
bool GetHTTPResponseBodyData( HTTPRequestHandle hRequest, uint8 *pBodyDataBuffer, uint32 unBufferSize );
从 HTTP 响应中获得正文数据。
此函数必须在 HTTP 请求已完成,且已通过与此请求句柄相关联的
HTTPRequestCompleted_t 调用结果返回 HTTP 响应后,才可调用。 您必须先调用
GetHTTPResponseBodySize 或使用调用结果中提供的
m_unBodySize 变量,才能分配出该大小的缓冲区,并传入此函数中。
此函数仅用于以
SendHTTPRequest 发送的 HTTP 请求。 如果您通过
SendHTTPRequestAndStreamResponse 使用流式 HTTP 请求,则使用
GetHTTPStreamingResponseBodyData。
返回: bool
如果
pBodyDataBuffer 已经填充了正文数据,返回
true;
否则,在下列情况发生时,返回
false:
GetHTTPResponseBodySize
bool GetHTTPResponseBodySize( HTTPRequestHandle hRequest, uint32 *unBodySize );
从 HTTP 响应获取正文数据大小。
此函数必须在 HTTP 请求已完成,且已通过与此请求句柄相关联的
HTTPRequestCompleted_t 或
HTTPRequestDataReceived_t 返回 HTTP 响应后,才可调用。 如果返回成功,您可按所提供的大小分配一个缓冲区,填入从
GetHTTPResponseBodyData 或
GetHTTPStreamingResponseBodyData 获得的数据。
返回: bool
如果
unBodySize 已经成功填充了大小数据,返回
true;
否则,在下列情况发生时,返回
false:
-
hRequest 无效。
- 请求未发送,或未完成。
-
unBodySize 为 NULL。
GetHTTPResponseHeaderSize
bool GetHTTPResponseHeaderSize( HTTPRequestHandle hRequest, const char *pchHeaderName, uint32 *unResponseHeaderSize );
| 名称 | 类型 | 描述 |
| hRequest | HTTPRequestHandle | 要检查响应标头名称的请求句柄。 |
| pchHeaderName | const char * | 要检查的标头名称。 |
| unResponseHeaderSize | uint32 * | 如果响应中有该标头名称,则返回标头名称的大小。 |
检查 HTTP 响应中是否有标头,并返回该标头的大小。
此函数必须在 HTTP 请求已完成,且已通过与此请求句柄相关联的
HTTPRequestCompleted_t 调用结果返回 HTTP 响应后,才可调用。 如果响应中已有响应标头,则分配大小正确的缓冲区以获取与
GetHTTPResponseHeaderValue 关联的值。
如需标准响应标头名称的列表,请见
维基页面。
返回: bool
如果响应中存在标头名称并且
unresponseHeaderSize 已填充标头值的大小,返回
true ;
否则,返回
false,并在以下条件下将
unresponseHeaderSize 设置为
0 :
-
hRequest 无效。
- 请求未发送,或未完成。
-
pchHeaderName 为 NULL。
-
unResponseHeaderSize 为 NULL。
- 响应中无标头名称。
GetHTTPResponseHeaderValue
bool GetHTTPResponseHeaderValue( HTTPRequestHandle hRequest, const char *pchHeaderName, uint8 *pHeaderValueBuffer, uint32 unBufferSize );
| 名称 | 类型 | 描述 |
| hRequest | HTTPRequestHandle | 要获得响应标头值的请求句柄。 |
| pchHeaderName | const char * | 要获得标头值的标头名称。 |
| pHeaderValueBuffer | uint8 * | 该值将被复制到的缓冲区。 |
| unBufferSize | uint32 | 应为 pHeaderValueBuffer 的字节大小。 |
从 HTTP 响应获得标头值。
此函数必须在 HTTP 请求已完成,且已通过与此请求句柄相关联的
HTTPRequestCompleted_t 调用结果返回 HTTP 响应后,才可调用。 必须先调用
GetHTTPResponseHeaderSize 检查标头是否存在,并取得其大小, 然后便可将分配该大小的缓冲区,并传入此函数。
如需标准响应标头名称的列表,请见
维基页面。
返回: bool
如果
pHeaderValueBuffer 已经填充了标头值,返回
true;
否则,在下列情况发生时,返回
false:
-
hRequest 无效。
- 请求未发送,或未完成。
-
pchHeaderName 为 NULL。
-
pHeaderValueBuffer 为 NULL。
- 响应中无标头名称。
-
unBufferSize 过小,不足以容纳值。
GetHTTPStreamingResponseBodyData
bool GetHTTPStreamingResponseBodyData( HTTPRequestHandle hRequest, uint32 cOffset, uint8 *pBodyDataBuffer, uint32 unBufferSize );
从流式 HTTP 响应获取正文数据。
调用此函数前,必须通过与此请求句柄关联的
HTTPRequestDataReceived_t 回调从流式 HTTP 请求收到数据。 一般来说当您从
HTTPRequestHeadersReceived_t 收到标头时,要使用
Content-Length HTTP 响应字段,分配一个与请求句柄关联的缓冲区,以便能接收数据总量, 然后再在收到数据时将其追加至该缓冲区中。
此函数仅供以
SendHTTPRequestAndStreamResponse 发送的流式 HTTP 请求使用。 如果您使用的是
SendHTTPRequest,则须使用
GetHTTPResponseBodyData。
返回: bool
如果
pBodyDataBuffer 已经填充了正文数据,返回
true;
否则,在下列情况发生时,返回
false:
PrioritizeHTTPRequest
bool PrioritizeHTTPRequest( HTTPRequestHandle hRequest );
将已发送请求移到队列前面,以对其进行优先处理。
返回: bool
如果成功将请求的优先级提高,返回
true; 否则,如果
hRequest 为无效句柄,或请求尚未发送,则返回
false。
另见: SendHTTPRequest、
SendHTTPRequestAndStreamResponseReleaseCookieContainer
bool ReleaseCookieContainer( HTTPCookieContainerHandle hCookieContainer );
释放 cookie 容器,以释放 Steam 中分配的内存。
使用完每个从
CreateCookieContainer 获得的 HTTPCookieContainerHandle 后,都必须调用此函数!
返回: bool
如果句柄被释放,返回
true;如果句柄无效,返回
false。
ReleaseHTTPRequest
bool ReleaseHTTPRequest( HTTPRequestHandle hRequest );
释放 HTTP 请求句柄,以释放 Steam 中分配的内存。
使用完每个从
CreateHTTPRequest 获得的 HTTPRequestHandle 后,都必须调用此函数!
返回: bool
如果句柄被成功释放,返回
true;仅在句柄无效时返回
false。
SendHTTPRequest
bool SendHTTPRequest( HTTPRequestHandle hRequest, SteamAPICall_t *pCallHandle );
发送一个 HTTP 请求。
此调用为异步调用,并提供了一个调用结果句柄,必须用来追踪调用进度直至调用完成。 如果同时有多个请求,可使用
PrioritizeHTTPRequest 或
DeferHTTPRequest 来设置请求的优先级。
如果用户在 Steam 上为脱机模式,便会添加“only-if-cached”的 cache-control 标头,并只会在本地缓存中查找,而不是发出任何实际的的远程请求。
如果预期数据较大,可以使用
SendHTTPRequestAndStreamResponse 流式传输数据区块。
返回: bool
触发
HTTPRequestCompleted_t 回调。
如果成功设置参数,返回
true;
在下列情况发生时,返回
false:
-
hRequest 无效。
- 请求已发送。
-
pCallHandle 为 NULL。
SendHTTPRequestAndStreamResponse
bool SendHTTPRequestAndStreamResponse( HTTPRequestHandle hRequest, SteamAPICall_t *pCallHandle );
发送一个 HTTP 请求,并以区块流式传输回响应。
此调用为异步调用,并提供了一个调用结果句柄,必须用来追踪调用进度直至调用完成。 一般来说当您从
HTTPRequestHeadersReceived_t 收到标头时,要使用
Content-Length HTTP 响应字段,分配一个与请求句柄关联的缓冲区,以便能接收数据总量, 然后再在收到数据时将其追加至该缓冲区中。
如同时有多个请求,您可使用
PrioritizeHTTPRequest 或
DeferHTTPRequest 来设置请求的优先级。
如果用户在 Steam 上为脱机模式,便会添加“only-if-cached”的 cache-control 标头,并只会在本地缓存中查找,而不是发出任何实际的的远程请求。
如果预期数据较小(几兆或更小),您可能需要使用
SendHTTPRequest。
返回: bool
触发
HTTPRequestDataReceived_t 回调。
触发
HTTPRequestHeadersReceived_t 回调。
触发
HTTPRequestCompleted_t 回调。
如果成功设置参数,返回
true;
在下列情况发生时,返回
false:
-
hRequest 无效。
- 请求已发送。
-
pCallHandle 为 NULL。
SetCookie
bool SetCookie( HTTPCookieContainerHandle hCookieContainer, const char *pchHost, const char *pchUrl, const char *pchCookie );
| 名称 | 类型 | 描述 |
| hCookieContainer | HTTPCookieContainerHandle | 要将此 cookie 放入其中的 cookie 容器。 |
| pchHost | const char * | 要设置此 cookie 的主机。 |
| pchUrl | const char * | 要设置此 cookie 的 URL。 |
| pchCookie | const char * | 要设置的 cookie。 |
将 cookie 加入指定的 cookie 容器,以用于未来的请求。
返回: bool
如果 cookie 成功设置,返回
true; 否则,如果请求句柄无效,或解析 cookie 时有安全问题,则返回
false。
SetHTTPRequestAbsoluteTimeoutMS
bool SetHTTPRequestAbsoluteTimeoutMS( HTTPRequestHandle hRequest, uint32 unMilliseconds );
设置 HTTP 请求的绝对超时期限,以毫秒计算。
此为总超时时间,与使用
SetHTTPRequestNetworkActivityTimeout 设置的网络活动超时不同,后者可在每次获得更多数据时重新开始超时计时。
返回: bool
如果成功设置超时期限,返回
true;
在下列情况发生时,返回
false:
SetHTTPRequestContextValue
bool SetHTTPRequestContextValue( HTTPRequestHandle hRequest, uint64 ulContextValue );
为请求设置上下文值,会在请求发出后在
HTTPRequestCompleted_t 回调中返回。
这允许调用者设置上下文 ID,该上下文 ID 可以将特定的回调归因于特定的请求。
此函数必须在发出请求前调用。
返回: bool
如果成功设置上下文值,返回
true;
在下列情况发生时,返回
false:
SetHTTPRequestCookieContainer
bool SetHTTPRequestCookieContainer( HTTPRequestHandle hRequest, HTTPCookieContainerHandle hCookieContainer );
关联 cookie 容器,供 HTTP 请求使用。
返回: bool
如果成功设置 cookie 容器,返回
true;
在下列情况发生时,返回
false:
-
hRequest 无效。
-
hCookieContainer 无效。
SetHTTPRequestGetOrPostParameter
bool SetHTTPRequestGetOrPostParameter( HTTPRequestHandle hRequest, const char *pchParamName, const char *pchParamValue );
| 名称 | 类型 | 描述 |
| hRequest | HTTPRequestHandle | 要设置参数的请求句柄。 |
| pchParamName | const char * | 参数的名称字段。 |
| pchParamValue | const char * | 与该名称字段关联的值。 |
在 HTTP 请求上设置 GET 或 POST 参数值。
此函数必须在发出请求前调用。
返回: bool
如果成功设置参数,返回
true;
在下列情况发生时,返回
false:
SetHTTPRequestHeaderValue
bool SetHTTPRequestHeaderValue( HTTPRequestHandle hRequest, const char *pchHeaderName, const char *pchHeaderValue );
| 名称 | 类型 | 描述 |
| hRequest | HTTPRequestHandle | 要设置其标头值的请求句柄。 |
| pchHeaderName | const char * | 标头的名称字段。 |
| pchHeaderValue | const char * | 要与标头名称字段关联的值。 |
为 HTTP 请求设置请求标头值。
此函数必须在发出请求前调用。
标准请求字段的完整列表可参见
维基页面。 由于用户代理字段会在请求发出后被覆盖,因此已被明确禁止。
返回: bool
如果成功设置标头值,返回
true;
在下列情况发生时,返回
false:
-
hRequest 无效。
- 请求已发送。
-
pchHeaderName 为 "User-Agent"。
-
pchHeaderName 或 pchHeaderValue 为 NULL。
SetHTTPRequestNetworkActivityTimeout
bool SetHTTPRequestNetworkActivityTimeout( HTTPRequestHandle hRequest, uint32 unTimeoutSeconds );
设置 HTTP 请求的超时期限,以秒计算。
如果不调用此函数,默认的超时期限为 60 秒。 可在每次取得更多数据时重新计时。 如果需要精确的最大超时期限,使用
SetHTTPRequestAbsoluteTimeoutMS。
返回: bool
如果成功设置超时期限,返回
true;
在下列情况发生时,返回
false:
SetHTTPRequestRawPostBody
bool SetHTTPRequestRawPostBody( HTTPRequestHandle hRequest, const char *pchContentType, uint8 *pubBody, uint32 unBodyLen );
| 名称 | 类型 | 描述 |
| hRequest | HTTPRequestHandle | 要设置 POST 正文的请求句柄。 |
| pchContentType | const char * | 设置“content-type”调用的 http 标头值。 |
| pubBody | uint8 * | 要设置的原始 POST 正文数据。 |
| unBodyLen | uint32 | 传入 pchName 的正文数据的长度。 |
设置 HTTP POST 请求的正文。
如果请求为 GET,则会失败并返回 false;如果请求的 POST 参数已设置,也会失败。 设置此原始正文会使其成为 post 中的唯一内容,
pchContentType 参数会为请求设置“content-type”标头,通知服务器如何解释正文。
返回: bool
成功时返回
true,表示 content-type 字段和正文数据已经设置;
否则,在下列情况发生时,返回
false:
SetHTTPRequestRequiresVerifiedCertificate
bool SetHTTPRequestRequiresVerifiedCertificate( HTTPRequestHandle hRequest, bool bRequireVerifiedCertificate );
| 名称 | 类型 | 描述 |
| hRequest | HTTPRequestHandle | 设置请求是否需要验证证书的请求句柄。 |
| bRequireVerifiedCertificate | bool | 要启用验证证书吗? |
设置 HTTPS 请求是否通过机器证书信任存储区认证 SSL 证书。
此函数目前只能在 Windows 和 macOS 上运行。
返回: bool
如果成功,返回
true; 否则,如果请求句柄无效,则返回
false。
SetHTTPRequestUserAgentInfo
bool SetHTTPRequestUserAgentInfo( HTTPRequestHandle hRequest, const char *pchUserAgentInfo );
| 名称 | 类型 | 描述 |
| hRequest | HTTPRequestHandle | 要设置用户代理信息的请求句柄。 |
| pchUserAgentInfo | const char * | 要在用户代理后端追加的字符串。 |
为请求设置额外的用户代理信息。
此函数不会覆盖正常的用户代理,仅在最后端添加额外信息。 发送
NULL 或空字符串即可将用户代理重置为默认值。
返回: bool
如果成功,返回
true,表示用户代理已更新; 否则,如果请求句柄无效,则返回
false。
回调
以下是可以通过调用
SteamAPI_RunCallbacks 触发的回调。 其中许多将响应
ISteamHTTP 的成员函数直接触发。
HTTPRequestCompleted_t
HTTP 请求完成时的结果。
如果您使用
GetHTTPStreamingResponseBodyData,那么应该使用
HTTPRequestHeadersReceived_t 或
HTTPRequestDataReceived_t 回调。
关联函数: SendHTTPRequest、
SendHTTPRequestAndStreamResponseHTTPRequestDataReceived_t
从流式 HTTP 请求收到数据区块时触发。
关联函数: SendHTTPRequestAndStreamResponseHTTPRequestHeadersReceived_t
从流式 HTTP 请求收到 HTTP 标头时触发。
关联函数: SendHTTPRequestAndStreamResponse枚举
以下是定义来与 ISteamHTTP 一起使用的枚举。
EHTTPMethod
用于在
CreateHTTPRequest 中设置 HTTP 请求方法。 多数状况下应该只会用到 GET 或 POST。
参见
Mozilla Developer Network,对 HTTP 请求方法了解更多。
| 名称 | 值 | 描述 |
| k_EHTTPMethodInvalid | 0 | 无效。 |
| k_EHTTPMethodGET | 1 | HTTP 方法设为 GET。 |
| k_EHTTPMethodHEAD | 2 | HTTP方法设为 HEAD。 |
| k_EHTTPMethodPOST | 3 | HTTP 方法设为 POST。 |
| k_EHTTPMethodPUT | 4 | HTTP 方法设为 PUT。 |
| k_EHTTPMethodDELETE | 5 | HTTP 方法设为 DELETE。 |
| k_EHTTPMethodOPTIONS | 6 | HTTP 方法设为 OPTIONS。 |
| k_EHTTPMethodPATCH | 7 | HTTP 方法设为 PATCH。 |
EHTTPStatusCode
服务器响应请求时发回的 HTTP 响应状态代码。
参见
Mozilla Developer Network 或 RFC2616 section 10.3,了解各方法的详情。
| 名称 | 值 | 描述 |
| k_EHTTPStatusCodeInvalid | 0 | 无效的状态代码。 HTTP 中并未定义此代码,在我们的代码用于表示未设置。 |
| k_EHTTPStatusCode100Continue | 100 | |
| k_EHTTPStatusCode101SwitchingProtocols | 101 | |
| k_EHTTPStatusCode200OK | 200 | |
| k_EHTTPStatusCode201Created | 201 | |
| k_EHTTPStatusCode202Accepted | 202 | |
| k_EHTTPStatusCode203NonAuthoritative | 203 | |
| k_EHTTPStatusCode204NoContent | 204 | |
| k_EHTTPStatusCode205ResetContent | 205 | |
| k_EHTTPStatusCode206PartialContent | 206 | |
| k_EHTTPStatusCode300MultipleChoices | 300 | |
| k_EHTTPStatusCode301MovedPermanently | 301 | |
| k_EHTTPStatusCode302Found | 302 | |
| k_EHTTPStatusCode303SeeOther | 303 | |
| k_EHTTPStatusCode304NotModified | 304 | |
| k_EHTTPStatusCode305UseProxy | 305 | |
| k_EHTTPStatusCode307TemporaryRedirect | 307 | |
| k_EHTTPStatusCode400BadRequest | 400 | |
| k_EHTTPStatusCode401Unauthorized | 401 | 建议使用 403 或其他代码。 401 表明您正在发送 WWW-Authenticate 标头,而客户端可在响应中发送授权标头。 |
| k_EHTTPStatusCode402PaymentRequired | 402 | 为未来的 HTTP 规范预留,客户端并不实际支持。 |
| k_EHTTPStatusCode403Forbidden | 403 | |
| k_EHTTPStatusCode404NotFound | 404 | |
| k_EHTTPStatusCode405MethodNotAllowed | 405 | |
| k_EHTTPStatusCode406NotAcceptable | 406 | |
| k_EHTTPStatusCode407ProxyAuthRequired | 407 | |
| k_EHTTPStatusCode408RequestTimeout | 408 | |
| k_EHTTPStatusCode409Conflict | 409 | |
| k_EHTTPStatusCode410Gone | 410 | |
| k_EHTTPStatusCode411LengthRequired | 411 | |
| k_EHTTPStatusCode412PreconditionFailed | 412 | |
| k_EHTTPStatusCode413RequestEntityTooLarge | 413 | |
| k_EHTTPStatusCode414RequestURITooLong | 414 | |
| k_EHTTPStatusCode415UnsupportedMediaType | 415 | |
| k_EHTTPStatusCode416RequestedRangeNotSatisfiable | 416 | |
| k_EHTTPStatusCode417ExpectationFailed | 417 | |
| k_EHTTPStatusCode4xxUnknown | 418 | 418 已预留,因此用于表示未知。 |
| k_EHTTPStatusCode429TooManyRequests | 429 | |
| k_EHTTPStatusCode500InternalServerError | 500 | |
| k_EHTTPStatusCode501NotImplemented | 501 | |
| k_EHTTPStatusCode502BadGateway | 502 | |
| k_EHTTPStatusCode503ServiceUnavailable | 503 | |
| k_EHTTPStatusCode504GatewayTimeout | 504 | |
| k_EHTTPStatusCode505HTTPVersionNotSupported | 505 | |
| k_EHTTPStatusCode5xxUnknown | 599 | |
Typedef
以下是定义来与 ISteamHTTP 一起使用的 typedef。
| 名称 | 基类型 | 描述 |
| HTTPCookieContainerHandle | uint32 | |
| HTTPRequestHandle | uint32 | HTTP 请求句柄。 |
常量
以下是定义来与 ISteamHTTP 一起使用的常量。
| 名称 | 类型 | 值 | 描述 |
| INVALID_HTTPCOOKIE_HANDLE | int | 0 | |
| INVALID_HTTPREQUEST_HANDLE | int | 0 | |
| STEAMHTTP_INTERFACE_VERSION | const char * | "STEAMHTTP_INTERFACE_VERSION002" | |