webapi をVB6から呼び出す方法について


Hana  2015-10-31 07:35:41  No: 103483

いつもお世話になっております。

テキストのログを格納しているサーバーから指定した日時などのコードで絞り込んだデータを受信する下記の仕様があり、これをVB6からWebサービスを使ってデータ取得したいのですが、どのようなライブラリを使えば実現できるでしょうか。もともとW3CのwebapiのようでC言語のようなのですが、同じことをVBから行うにはどのようにすればよいでしょうか。HttpSendRequestやXMLなどいくつかのHTTPリクエストができるAPIがありますが、リクエストするときに必要十分な情報をどのようにセットすればよいかわからずにいます。

1. サーバーに送信するデータを用意する。
AppsのユーザID   文字列配列app_userid に格納
Appsのパスワード   文字列配列app_passwd に格納
取得したいサーバーのコード    文字列配列server_code  に格納
取得したい時間範囲の開始時刻  文字列配列start_time に格納
取得したい時間範囲の終了時刻  文字列配列end_time に格納

  AppsのユーザID、パスワードの文字列を使用する。
  開始時刻、終了時刻のフォーマットは
     YYYY-MM-DD hh:mi:ss
    (例: 2015-9-15 22:0:0 )
となる。文字列はURLエンコードした文字列に変換してサーバーに渡す。
具体的な変換手順は、まず文字列をSJISに変換し、次に半角スペースを'+'にコロンを'%3A'に変換する。
よってサーバーに渡す文字列2015-10-30 22:35:0は下記のようになる。

2015-10-30+22%35A0%3A0

月、日、時、分、秒の値は2桁表記(09、00 等)でなくても可。

2. 接続先のURL文字列を作成
接続先URLは下記のとおり。

http://hoge.apserver/auth

このURL文字列を文字列配列Apps_urlに格納する。

3. formdata, next_post_dataをライブラリlibwwwの関数HTAssocList_new()で新規作成する。
formdata = HTAssocList_new();
next_post_data = HTAssocList_new();

4. ライブラリlibwwwの関数HTAssocList_addObject()でformdataとnext_post_dataに値をセットする。
ユーザーID
HTAssocList_addObject(formdata, "userId", app_userid);

パスワード
HTAssocList_addObject(formdata, "password", app_passwd);

NEXT_URL
HTAssocList_addObject(formdata, "nextUrl", "/refer/C_EPG/T_PROGRAM_metaListDesc");

放送局コード
HTAssocList_addObject(formdata, "nextParam_server_code", 放送局コード文字列);
HTAssocList_addObject(next_post_data, "nextParam_server_code", 放送局コード文字列);

データ取得範囲の開始時刻
HTAssocList_addObject(formdata, "nextParam__d_from", 開始時刻文字列);
HTAssocList_addObject(next_post_data, "nextParam__d_from", 開始時刻文字列);

データ取得範囲の終了時刻
HTAssocList_addObject(formdata, "nextParam__d_to", 開始時刻文字列);
HTAssocList_addObject(next_post_data, "nextParam__d_to", 開始時刻文字列);

5. 4.で作成したデータをサーバーに送信する。
libwwwの関数HTProfile_newClient()でクライアントアプリケーションプロファイルを作成する。
HTProfile_newClient("Mozilla", "5.0 (compatible; iBOX WWW Browser MultiChannel; Linux)");

libwwwの関数HTNet_addAfter()でAFTERフィルターを設定する。
HTNet_addAfter(terminate_handler, NULL, NULL, HT_ALL, HT_FILTER_LAST);
  関数tarminate_handler()はlibwwwのリクエストの最終処理を行う関数。

simultanousソケットの最大数を設定。
HTNet_setMaxSocket(1);

動的メモリ割り当てが失敗したときに呼ばれる処理を登録。
HTMemory_setExit(outofmemory);
  関数outofmemory()は終了処理関数app_exit(app_ERR_NO_MEMORY)を呼ぶ。

構造体Doc(サーバーから受信したデータを格納する構造体)を作成し初期値を格納。
doc = HT_CALLOC(1, sizeof (Doc));
doc->content_buffer = NULL;
doc->main_doc = main_doc;
doc->state = DOC_NOTREGISTERED;
doc->loaded_length = 0;

構造体Doc と Docステータスは以下のとおり。
typedef struct s_doc
{
    char   *content_buffer;
    BOOL    main_doc;
    int     state;
    long    loaded_length;
} Doc;

enum {
    DOC_NOTREGISTERED = 0,
    DOC_PENDING,
    DOC_IMG_UPDATE,
    DOC_LOADED,
    DOC_PROCESSED,
    DOC_ABORTED,
    DOC_REJECTED,
    DOC_EXTERNAL,
};

リクエストオブジェクト(構造体HTRequest)を作成。
request = HTRequest_new();
HTRequest_setContext(request, (void *) doc);
HTRequest_setPreemptive(request, NO);
HTRequest_setGnHd(request, 0);
HTRequest_addRqHd(request, HT_C_HOST);
HTRequest_addRqHd(request, HT_C_REFERER);

タイムアウト処理を設定する。
ap.ap_sec  = 0;
ap.ap_usec = 100000;
HTEventrg_registerTimeout(&ap, request, timeout_handler, YES);

親アンカーを作成。
anchor = HTAnchor_findAddress(Apps_url);

アンカーとPOSTメソッドを使用してフォームを送信。
postanchor = HTPostFormAnchor(formdata, anchor, request);

formdata削除。
HTAssocList_delete(formdata);

イベントループを行う。
HTEventrg_loop(request);

6. サーバーから302が返る。
ほとんどの場合に最初の POST - サーバによる認証 のあとは302が返されてHTRedirectFilter() が呼ばれる。
HTRedirectFielter()は元々libwwwの関数だが、app_chk専用に改造したHTRedirectFielter()を使用する。
next_post_dataをlibwww関数HTPostFormAnchor()で送信する。

HTAnchor *new_anchor = HTResponse_redirection(response);
if (HTRequest_doRetry(request)) {
    Doc * doc = (Doc *)HTRequest_context(request);
    HTRequest *new_request;
    HTParentAnchor *postanchor;
    char *new_address;

    new_address = HTAnchor_address(new_anchor);
    new_request = get_request(doc, HTRequest_anchor(request));
    HTRequest_setReloadMode(new_request, HT_CACHE_FLUSH_MEM);
    (void)HTUnEscape(new_address);
    postanchor = HTPostFormAnchor(next_post_data, new_anchor, new_request);
}

7. terminate_handler() で受信したデータのフォーマットを確認し関数get_app_data(),parse_app_data() で解析、ファイルへの書き出しを行う。

関数get_app_data()はHTMLファイルのコメント部分に'#appsserver' が存在すれば Apps のデータとみなしてバッファに保存する。

関数parse_app_data()は(必要ならば保存したデータをSJISからEUC-JPに変換して)パースし、他のプログラムが利用しやすい形式でファイルに書き出す。

以上です。長文となり申し訳ございません。
よろしくお願いいたします。


ALFE  2015-12-05 15:16:51  No: 103484

たぶんXMLHTTPRequestが最も普通の選択肢でしょう
参考になりそうなのは、このあたりでしょうか

http://d.hatena.ne.jp/end0tknr/20081115/1226755041
http://www.f3.dion.ne.jp/~element/msaccess/AcTipsVbaXMLHTTP.html


Hana  2016-01-06 06:25:46  No: 103485

ALFE様

報告が遅くなり申し訳ございません。
貴重な情報をありがとうございます。
MSXML経由での接続も試しておりますが道半ばです。
引き続き作業しております。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加