通常、HTTP サーバー タスクは特定の順序で実行されます。つまり、1 つのタスクを完了し、次のタスクが開始される前に出力を取得する必要があります。
HTTP サーバー アプリケーションが実行する特定のタスクに関するサンプル コードを示すタスク ページが作成されます。 タスク ページは、HTTP サーバー サンプルの C 拡張ファイルにリンクします。 ローカル コンピューターのドライブ C:\ に PSDK をインストールすると、完全なサーバー サンプル アプリケーションが C:\Program Files\Microsoft SDK\Samples\netds\http\server にインストールされます。
次の一覧は、HTTP サーバーのタスクを示しています。
- HTTP サービス を初期化する
- リッスンする URL を登録
- ルーチンを呼び出して要求 を受信する
- 要求 を受信する
- HTTP 要求 を処理する
- HTTP 応答 を送信する
- HTTP POST 応答 を送信する
- HTTP Server API をクリーンアップする
HTTP サービスを初期化する
HTTP サービスは httpInitialize関数使用して初期化され、要求キューへのハンドルは HttpCreateHttpHandle使用して作成されます。 他のサーバー関数を呼び出す前に、サーバーを初期化する必要があります。 サービスが受信 HTTP 要求をリッスンする URL を登録する前に、要求キューを作成する必要があります。
詳細とコード例については、「HTTP サービスを初期化する」を参照してください。
リッスンする URL を登録する
HTTP Server API が受信要求をリッスンするには、HttpAddUrl 関数を呼び出すことによって、特定の URL が API に登録されます。 これらの URL に一致する受信要求は、この呼び出しで指定された要求キューにルーティングされます。
詳細とコード例については、「リッスンする URL を登録する」を参照してください。
ルーチンを呼び出して要求を受信する
DoReceiveRequest 関数は、要求バッファーを割り当て、要求 ID を初期化して、要求を受信するループを開始します。
詳細とコード例については、「ルーチンを呼び出して要求を受信する」を参照してください。
要求を受信する
HTTP サーバー API は、解析された受信要求を格納するための要求構造を提供します。 この構造体はアプリケーションによって割り当てられ、受信要求の受信時に初期化されます。 アプリケーションは、HttpReceiveHttpRequest 関数を呼び出して要求を受信します。 要求バッファーが小さすぎて要求を受信できない場合、アプリケーションはバッファー サイズを大きくし、HttpReceiveHttpRequest 呼び出して要求全体を受信できます。
詳細とコード例については、「要求を受信する」を参照してください。
HTTP 要求を処理する
サンプル アプリケーションでは、HTTP GET 要求動詞と POST 要求動詞を処理する方法を示します。 アプリケーションが処理しない要求に動詞が存在する場合、アプリケーションは 503 (NOT_IMPLEMENTED) エラーを送信します。
要求の処理に使用する URL は、HTTP_REQUEST_V1 構造体の CookedUrl メンバーに含まれる処理済み URL であることに注意してください。 pRawUrl メンバー内の未処理の URL は使用しないでください。これは、追跡と統計的な目的のみを目的とします。
詳細とコード例については、「HTTP 要求を処理する」を参照してください。
HTTP 応答を送信する
応答構造体は、状態コードと、INITIALIZE_HTTP_RESPONSE マクロ内の理由フレーズを使用して割り当てられ、初期化されます。 既知の HTTP ヘッダーが ADD_KNOWN_HEADER マクロの応答構造に追加され、エンティティ本体がメモリからのデータ ブロックからの応答に追加されます。 HttpSendHttpResponse 関数が呼び出され、応答が送信されます。 この例では、アプリケーションは単純な 200 OK 応答を GET 要求に送信します。
詳細とコード例については、「HTTP 応答を送信する」を参照してください。
HTTP POST 応答を送信する
POST 要求では、GET 要求よりも多くの処理が必要です。 要求エンティティ本文は、HttpReceiveRequestEntityBody 関数を呼び出すことによって受信されます。 アプリケーションは、HTTP サーバー API への個別の呼び出しで応答と応答エンティティ本文を送信します。 応答ヘッダーは、HttpSendHttpResponseと共に送信されます。 エンティティ本体は、HttpSendResponseEntityBody 関数を使用して、ファイル ハンドルからデータ ブロックで送信されます。
詳細とコード例については、「HTTP POST 応答を送信する」を参照してください。
HTTP サーバー API のクリーンアップ
HTTP サーバー API のクリーンアップ操作は次のとおりです。
- 登録されているすべての URL を削除します。
- 要求キューへのハンドルを閉じます。
- HTTP サーバー API によって作成されたリソースを終了します。
アプリケーションは、HttpRemoveUrl 関数を呼び出して、初期 HttpAddUrl 関数によって登録された URL を登録解除します。 アプリケーションは、各呼び出し HttpTerminate を呼び出して、一致するフラグ設定で HttpInitializeをします。 この呼び出しは、httpInitialize をする呼び出しによって作成されたすべてのリソースを終了します。
詳細とコード例については、「HTTP Server APIのクリーンアップ」を参照してください。