適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話やポイ活など気になったことも載せているブログです。

WinHTTPとVBAでHTTPを理解する

この記事では

  • WinHTTPの使い方を理解する上で最小限必要となるHTTPについて解説しています。
  • WinHTTPを使いたいけど、HTTPについてよくわからない人に向けて書いています。

WinHTTPを操作するためのHTTPの最小限の理解

WinHTTPを使ってウェブサーバとデータのやりとりをするためには、HTTPの理解が必要になります。

詳しくはこちらの記事をご参照頂けますと幸いです。

この記事ではWinHTTPを操作するために必要と思われるHTTPの内容について説明したいと思います。

HTTPとは

HTTPとは、Hyper Text Transfer Protocolのアクロニムです。

Wikipediaによると、

HTMLなどのコンテンツの送受信に用いられる通信プロトコルである。主としてWorld Wide Webにおいて、WebブラウザとWebサーバとの間での転送に用いられる。日本標準仕様書ではハイパテキスト転送プロトコルとも呼ばれる。

HTMLを始めとした、様々なデータを送受信するための通信規約といったところでしょうか。

もともと、ウェブサーバ上の単純なテキストデータをクライアント(ブラウザ)が受信することを目的として作られた規約でした。

利用者の拡大や商用利用の解禁など、当初想定されていなかった用途に使われるようになり、テキストデータ以外のデータについてもサポートが広がっていきました。

またログイン処理をしたりなど状態を管理(なかば無理やり)したり、通信を暗号化したりと色々な技術と合せて使われ、その仕様は複雑になっていきました。

これらの細かい仕様は、Request for Comments(RFC)という文書で公開されています。

各ウェブサーバとウェブブラウザはこの仕様書に基づいて作られています(基本的には)。

HTTPの通信の中の位置づけ

HTTPは、アプリケーション層と言われる層の通信規約になります。

アプリケーション層とは、通信にどういった方法がとられているかといった細かいことは一切気にする必要がない層になります。

気にするのは、クライアントとして、つまりブラウザのようにURLを使ってウェブサーバーにアクセスする方法と、ウェブサーバが返してきたデータをどう処理するかだけになります。

では、HTTPという規約=プロトコルがどのように通信をするか、その概略を見ていきたいと思います。

HTTPの通信の概略

ここでは単純なクライアントとサーバを想定します。

クライアントはサーバに対して、データを要求します。

要求のデータはこのようなデータです。
f:id:shinmai_papa:20190904092310p:plain

それに対して、返ってくるデータはこのような構成です。

f:id:shinmai_papa:20190904092305p:plain
かなり抽象的に見えますが・・・本当にこんな感じのデータが送られてきます。 順を追って見ていきましょう。

HTTPクライアントの要求

一行目は「メソッド、パス、HTTPのバージョン」です。

ここで重要なのは、メソッドとパスの二つです。

メソッドとは

メソッドとは、サーバに対して、自分の要求がどんな意味を持つかを知らせるための単語です。 8個くらいありますが、大事なのはGETPOSTの二つです。

GETとPOSTはおおよそこんなイメージです。

メソッド イメージ
GET 単純にデータをくれ
POST データを送るから、これにあったデータをくれ
ログイン情報送るからログインさせてくれ

本当かよって思われるかもしれませんが、このイメージでこれまで失敗したことありませんので多分大丈夫です。

パスとは

パスはURLの中にあります。

URLとは、このプロトコルで、このホスト(ウェブサーバが置いてるコンピュータ名)の、パス(フォルダとファイル名)のデータを要求します!!

というものです。

URLは例えばこういうものです→https://www.tekizai.net/entry/2019/08/28/080000

URLは次のように分解することができます。

部分 名前
https:// プロトコル
www.tekizai.net ホスト
/entry/2019/08/28/080000 パス

上記のURLだと、ホスト以降の「/entry/2019/08/28/080000」がパスになります。

このパスとは、ウェブサーバーというコンピュータの中のどこにあるかを示しています。

Windowsのファイルやフォルダと同じイメージです。

HTTPによるクライアントからの要求で、サーバーの、ここにあるファイルをください!!ということパスを指定します。

ヘッダとは

ヘッダはその要求のメタ情報です。

例えば、自分が理解できるのは日本語だけです。

この要求はChromやIEから送ってますよ~といった様々な情報です。

ヘッダは、キーと、値のペアです。

私の環境から、ChromでウェブサイトにGET命令を発行したときは、こんなヘッダが自動的に付けられて送信されています(一部抜粋)。

下記のサイトにブラウザからアクセスすると、ブラウザが送信した情報を表示してくれる便利なサイトです。

https://httpbin.org/get

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3,
Accept-Encoding: gzip, deflate, br,
Accept-Language: ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7,
Host: httpbin.org,
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36

またこのヘッダの情報を使ってログイン状態の管理を行ったりします。

ボディとは

ボディは、主にPOSTによる要求時にサーバーへデータ送信するのに使われます。

ログインするためのパスワードやID、フォームに入力した情報などをここに置いて送信します。

ウェブサーバの応答

クライアントから要求を受けたウェブサーバは、要求に応じてクライアントにデータを送信します。

レスポンスコードとは

HTTP/1.1 200 OK

このような形式で、その要求の処理結果のコードが返ってきます。

レスポンスコードは3桁の数字で構成されており、RFCでコードが定義されています。

クライアントはこのコードを見て、正常にページにアクセスできたのか、ページが見つからなかったのか等を判断し、処理を分岐させる必要があります。

ヘッダとは

レスポンスのヘッダは基本的な考え方はクライアントの要求ヘッダと同じです。

今回返したデータのサイズはこのくらいだよ、データはhtmlだよ、文字コードはUTF8だよといった情報を送ってきます。

Content-Length: 38390
Content-Type: text/html; charset=utf-8
Date: Wed, 04 Sep 2019 00:05:18 GMT

ボディとは

ボディとは基本は、ウェブページのHTMLです。

その他のデータの場合もあります。

クライアントはこの情報をブラウザに表示します。

簡単なまとめ

クライアントがウェブページを要求して、ウェブブラウザはそれを待ち構えています。

クライアントが要求したデータをウェブブラウザが解析して、HTTPプロトコルでウェブサーバーに送る。

ウェブサーバーはHTTPプロトコルで送られてきた要求に従ってサーバー内のデータをHTTPプロトコルに則ってクライアントへ返す。

クライアントは返ってきたデータを解析して、必要に応じてウェブサーバにまた要求する・・・。

という繰り返しで、やり取りが行われます。

そのやり取りに使われる決まり事が、HTTPプロトコルになります。

ここまで説明してきた内容も、文字だけでは中々理解しづらいところもあるかと思います。

下記の記事ではWinHTTPを使ってVBAによるちょっとしたツールを紹介しています。

www.tekizai.net

ご参照頂けますと幸いです。

というわけで、ここまでお読みいただき、ありがとうございました。