📄 lyoulhttpclient.aspx.htm
字号:
<h2>How to Handle the Returned CHttpResponse Object</h2>
<p>When you send a request using <code>CHttpClient</code>, all the methods will return <code>CHttpResponse</code> object. <code>CHttpResponse</code> represents the response returned by a HTTP web server. <code>CHttpResponse</code> provides the following methods:</p>
<div class="no-vmads"><pre lang="c++"><span class="code-comment">//</span><span class="code-comment"> Returns the number of headers of which name is the szName
</span>
DWORD CHttpResponse::GetHeaderCount (PCSZ szName) <span class="code-keyword">throw</span> (Exception &) ;
<span class="code-comment">//</span><span class="code-comment"> Returns the header of which name is the szName
</span>
PCSZ CHttpResponse::GetHeader (PCSZ szName,
DWORD nIdx = <span class="code-digit">0</span>) <span class="code-keyword">throw</span> (Exception &) ;
<span class="code-comment">//</span><span class="code-comment"> Returns the HTTP status code returned by a HTTP server
</span>
DWORD CHttpResponse::GetStatus (<span class="code-keyword">void</span>) <span class="code-keyword">throw</span> (Exception &) ;
<span class="code-comment">//</span><span class="code-comment"> Returns the HTTP status text returned by a HTTP server
</span>
PCSZ CHttpResponse::GetStatusText (<span class="code-keyword">void</span>) <span class="code-keyword">throw</span> (Exception &) ;
<span class="code-comment">//</span><span class="code-comment"> Retrieves the length of the content returned by a HTTP server
</span>
BOOL CHttpResponse::GetContentLength (DWORD & cbContLen) <span class="code-keyword">throw</span> (Exception &) ;
<span class="code-comment">//</span><span class="code-comment"> Reads the content returned by a HTTP server
</span>
DWORD CHttpResponse::ReadContent (<span class="code-SDKkeyword">BYTE</span> * pbyBuff,
DWORD cbBuff) <span class="code-keyword">throw</span> (Exception &) ;</pre></div>
<p>The following code demonstrates the basic usage of the <code>CHttpResponse</code> object:</p>
<div class="SmallText" id="premain8" style="width: 100%; cursor: pointer;"><img preid="8" src="lyoulhttpclient.aspx_files/minus.gif" id="preimg8" height="9" width="9"><span preid="8" style="margin-bottom: 0pt;" id="precollapse8"> Collapse</span></div><div style="margin-top: 0pt;" id="pre8" class="no-vmads"><pre lang="c++"><span class="code-keyword">using</span> <span class="code-keyword">namespace</span> Ryeol ;
CHttpResponse * pobjHttpRes = NULL ;
<span class="code-keyword">try</span> {
<span class="code-comment">//</span><span class="code-comment"> Get the CHttpResponse object
</span>
pobjHttpRes = ... ;
<span class="code-comment">//</span><span class="code-comment"> Reads the HTTP status code
</span>
_tprintf (_T (<span class="code-string">"</span><span class="code-string">%u"</span>), pobjHttpRes-<span class="code-keyword">></span>GetStatus ()) ;
<span class="code-comment">//</span><span class="code-comment"> Reads the HTTP status text
</span>
_tprintf (_T (<span class="code-string">"</span><span class="code-string"> %s\n"</span>), pobjHttpRes-<span class="code-keyword">></span>GetStatusText ()) ;
<span class="code-comment">//</span><span class="code-comment"> Reads HTTP headers using an array of header names
</span>
<span class="code-keyword">static</span> LPCTSTR szHeaders[] =
{ _T (<span class="code-string">"</span><span class="code-string">Server"</span>), _T (<span class="code-string">"</span><span class="code-string">Date"</span>), _T (<span class="code-string">"</span><span class="code-string">X-Powered-By"</span>),
_T (<span class="code-string">"</span><span class="code-string">Content-Length"</span>), _T (<span class="code-string">"</span><span class="code-string">Set-Cookie"</span>)
, _T (<span class="code-string">"</span><span class="code-string">Expires"</span>), _T (<span class="code-string">"</span><span class="code-string">Cache-control"</span>),
_T (<span class="code-string">"</span><span class="code-string">Connection"</span>), _T (<span class="code-string">"</span><span class="code-string">Transfer-Encoding"</span>)
, _T (<span class="code-string">"</span><span class="code-string">Content-Type"</span>) } ;
LPCTSTR szHeader ;
<span class="code-keyword">for</span> (size_t i = <span class="code-digit">0</span>; i <span class="code-keyword"><</span> <span class="code-keyword">sizeof</span> (szHeaders) / <span class="code-keyword">sizeof</span> (LPCTSTR); i++) {
<span class="code-keyword">if</span> ( szHeader = pobjHttpRes-<span class="code-keyword">></span>GetHeader (szHeaders[i]) )
_tprintf (_T (<span class="code-string">"</span><span class="code-string">%s: %s\n"</span>), szHeaders[i], szHeader) ;
<span class="code-keyword">else</span>
<span class="code-comment">//</span><span class="code-comment"> If the header is not found..
</span>
_tprintf (_T (<span class="code-string">"</span><span class="code-string">'%s' header does not exist..\n"</span>),
szHeaders[i]) ;
}
_tprintf (_T (<span class="code-string">"</span><span class="code-string">\n"</span>)) ;
<span class="code-comment">//</span><span class="code-comment"> Checks whether the returned stream is a text
</span>
BOOL bIsText = FALSE ;
<span class="code-keyword">if</span> ( szHeader = pobjHttpRes-<span class="code-keyword">></span>GetHeader (_T (<span class="code-string">"</span><span class="code-string">Content-Type"</span>)) )
bIsText = (<span class="code-digit">0</span> == ::_tcsncicmp (szHeader, _T (<span class="code-string">"</span><span class="code-string">text/"</span>), <span class="code-digit">5</span>)) ;
<span class="code-comment">//</span><span class="code-comment"> Reads the length of the stream
</span>
DWORD dwContSize ;
<span class="code-comment">//</span><span class="code-comment"> If the length is not specified
</span>
<span class="code-keyword">if</span> ( !pobjHttpRes-<span class="code-keyword">></span>GetContentLength (dwContSize) )
dwContSize = <span class="code-digit">0</span> ;
<span class="code-keyword">const</span> DWORD cbBuff = <span class="code-digit">1024</span> * <span class="code-digit">10</span> ;
<span class="code-SDKkeyword">BYTE</span> byBuff[cbBuff] ;
DWORD dwRead ;
size_t cbTotal = <span class="code-digit">0</span> ;
<span class="code-comment">//</span><span class="code-comment"> Reads the data stream returned by the HTTP server.
</span>
<span class="code-keyword">while</span> ( dwRead = pobjHttpRes-<span class="code-keyword">></span>ReadContent (byBuff, cbBuff - <span class="code-digit">1</span>) ) {
cbTotal += dwRead ;
<span class="code-keyword">if</span> ( bIsText ) {
byBuff[dwRead] = <span class="code-string">'</span><span class="code-string">\0'</span> ;
printf (<span class="code-string">"</span><span class="code-string">%s"</span>, <span class="code-keyword">reinterpret_cast</span><span class="code-keyword"><</span>LPCSTR<span class="code-keyword">></span> (byBuff)) ;
}
}
<span class="code-keyword">if</span> ( !bIsText )
_tprintf (_T (<span class="code-string">"</span><span class="code-string">%u bytes skipped..\n"</span>), cbTotal) ;
} <span class="code-keyword">catch</span> (httpclientexception & e) {
... <span class="code-comment">//</span><span class="code-comment"> Place exception handling codes here.
</span>
}
<span class="code-keyword">delete</span> pobjHttpRes ;
pobjHttpRes = NULL ;</pre></div>
<h2>How to Handle Exception</h2>
<p>When an error occurs, <code>httpclientexception</code> object is thrown:</p>
<div class="no-vmads"><pre lang="c++"><span class="code-keyword">class</span> httpclientexception {
<span class="code-keyword">public</span>:
<span class="code-comment">//</span><span class="code-comment"> Returns the last error code.
</span>
<span class="code-comment">//</span><span class="code-comment"> The error codes is defined in RyeolHttpClient.h
</span>
DWORD LastError (<span class="code-keyword">void</span>) <span class="code-keyword">const</span> <span class="code-keyword">throw</span> () ;
<span class="code-comment">//</span><span class="code-comment"> Returns the last error message.
</span>
LPCTSTR errmsg (<span class="code-keyword">void</span>) <span class="code-keyword">const</span> <span class="code-keyword">throw</span> () ;
<span class="code-comment">//</span><span class="code-comment"> Returns the last win32 error code retrieved by
</span>
<span class="code-comment">//</span><span class="code-comment"> using ::GetLastError when an error occurred.
</span>
DWORD Win32LastError (<span class="code-keyword">void</span>) <span class="code-keyword">const</span> <span class="code-keyword">throw</span> () ;
} ;</pre></div>
<p>Before throwing an exception, most methods restore their internal states (all or nothing like transaction). But if you call <code>BeginPost</code> or <code>BeginUpload</code> method, the POST context is automatically canceled. You should write the following <code><span class="code-keyword">try</span></code>-<code><span class="code-keyword">catch</span></code> block to handle the exception:</p>
<div class="no-vmads"><pre lang="c++"><span class="code-keyword">using</span> <span class="code-keyword">namespace</span> Ryeol ;
<span class="code-keyword">try</span> {
... <span class="code-comment">//</span><span class="code-comment"> Place codes which throw a httpclientexception exception
</span>
} <span class="code-keyword">catch</span> (httpclientexception & e) {
_tprintf (_T (<span class="code-string">"</span><span class="code-string">An error has been occured\n"</span>)) ;
_tprintf (_T (<span class="code-string">"</span><span class="code-string">ErrCode: 0x%x\n"</span>), e.LastError ()) ;
_tprintf (_T (<span class="code-string">"</span><span class="code-string">ErrMsg: %s\n"</span>), e.errmsg ()) ;
<span class="code-keyword">if</span> ( e.Win32LastError () != NO_ERROR ) {
TCHAR szErrMsg[<span class="code-digit">512</span>] ;
GetWinInetErrMsg (szErrMsg, <span class="code-digit">512</span>, e.Win32LastError ()) ;
_tprintf (_T (<span class="code-string">"</span><span class="code-string">Win32ErrCode: 0x%x\n"</span>), e.Win32LastError ()) ;
_tprintf (_T (<span class="code-string">"</span><span class="code-string">Win32ErrMsg: %s\n"</span>), szErrMsg) ;
}
}</pre></div>
<h2>How to Show the Progress Information to the User</h2>
<p>If you call <code>BeginPost</code> or <code>BeginUpload</code> method, you can retrieve the progress information using the <code>Query</code> method:</p>
<div class="no-vmads"><pre lang="c++"><span class="code-comment">//</span><span class="code-comment"> Queries progress information of the current POST context
</span>
<span class="code-comment">//</span><span class="code-comment"> objPostStat [out] A CHttpPostStat object.
</span>
<span class="code-keyword">void</span> CHttpClient::Query (CHttpPostStat & objPostStat) <span class="code-keyword">throw</span> () ;</pre></div>
<p><code>CHttpPostStat</code> represents the progress information of the current POST context. The following code demonstrates the basic usage of the <code>CHttpPostStat</code> object:</p>
<div class="SmallText" id="premain12" style="width: 100%; cursor: pointer;"><img preid="12" src="lyoulhttpclient.aspx_files/minus.gif" id="preimg12" height="9" width="9"><span preid="12" style="margin-bottom: 0pt;" id="precollapse12"> Collapse</span></div><div style="margin-top: 0pt;" id="pre12" class="no-vmads"><pre lang="c++"><span class="code-keyword">using</span> <span class="code-keyword">namespace</span> Ryeol ;
CHttpClient objHttpReq ;
CHttpResponse * pobjHttpRes = NULL ;
size_t cbProceed = <span class="code-digit">1024</span> ; <span class="code-comment">//</span><span class="code-comment"> 1k
</span>
<span class="code-keyword">try</span> {
... ; <span class="code-comment">//</span><span class="code-comment"> Intialize the CHttpClient object
</span>
<span class="code-comment">//</span><span class="code-comment"> Starts a new POST request
</span>
objHttpReq.BeginPost (...) or objHttpReq.BeginUpload (...) ;
<span class="code-comment">//</span><span class="code-comment"> Displays progress information
</span>
CHttpPostStat objPostStat ;
<span class="code-keyword">do</span> {
<span class="code-comment">//</span><span class="code-comment"> Retrieves progress information
</span>
objHttpReq.Query (objPostStat) ;
_tprintf (_T (<span class="code-string">"</span><span class="code-string">\nPost in progress... %2u/%2u\n"</span>)
, objPostStat.PostedCount () <span class="code-comment">//</span><span class="code-comment"> The number of posted parameters
</span>
, objPostStat.TotalCount ()) ; <span class="code-comment">//</span><span class="code-comment"> The total number of parameters
</span>
_tprintf (_T (<span class="code-string">"</span><span class="code-string">%s: %10u/%10u %10u/%10u %10u/%10u\n"</span>)
<span class="code-comment">//</span><span class="code-comment"> The name of the current parameter
</span>
, objPostStat.CurrParam ()
<span class="code-comment">//</span><span class="code-comment"> The number of posted bytes of the current parameter
</span>
, objPostStat.CurrParamPostedByte ()
<span cl
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -