Hatena::Groupmoz-addon

Ci.nsIZIGOROu

2007-12-05本日3回目のアレですよ

Microsoft SOAP Toolkitを使ってJScriptでSOAP - 低レベルAPI (1) SoapSerializer

| 16:12 |  Microsoft SOAP Toolkitを使ってJScriptでSOAP -  低レベルAPI (1) SoapSerializer - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  Microsoft SOAP Toolkitを使ってJScriptでSOAP -  低レベルAPI (1) SoapSerializer - Ci.nsIZIGOROu

やっとここまで辿り付けた。。。

複合型を使う場合はどうしても低レベルAPIを使わなくてはならないので、その際リクエストデータを作る際に使うSoapSerializerの練習をしたかったのでした。

SoapSerializerはInit()メソッドでIStreamを実装したオブジェクトが必要で、通常SoapConnectorオブジェクトを使うんですが、ここでは単にどういうXMLを生成しているか確認する為にADODB.Streamを使います。

var soapSerializer = new ActiveXObject("MSSOAP.SoapSerializer");

var stream = new ActiveXObject("ADODB.Stream");
stream.Charset = "UTF-8";
stream.Open();

soapSerializer.Init(stream);
soapSerializer.startEnvelope("", "STANDARD");
soapSerializer.startBody();
soapSerializer.startElement("WS_Square_root", "http://www.kanetaka.net/namespace/default", "", "SOAPSDK1");
soapSerializer.startElement("MyInput", "", "", "");
soapSerializer.writeString(3);
soapSerializer.endElement();
soapSerializer.endElement();
soapSerializer.endBody();
soapSerializer.endEnvelope();
stream.Position = 0

WScript.Echo(stream.ReadText(-1));

出力結果は、

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Body>
    <SOAPSDK1:WS_Square_root xmlns:SOAPSDK1="http://www.kanetaka.net/namespace/default" SOAP-ENV:encodingStyle="">
      <MyInput SOAP-ENV:encodingStyle="">3</MyInput>
    </SOAPSDK1:WS_Square_root>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

なるほど。

とりあえず今日はここまで。

追記

  • 一部間違えてたので、ソースコード修正。 (2007-12-06T16:17:23+09:00)

ADODB.Streamを使った文字コードの取り扱い (2)

| 18:48 |  ADODB.Streamを使った文字コードの取り扱い (2) - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  ADODB.Streamを使った文字コードの取り扱い (2) - Ci.nsIZIGOROu

で次は文字コード変換。

これは簡単で、二つストリームを用意して、変換元文字コード、変換先文字コードをそれぞれ指定してから、CopyTo()メソッドで移せばOK。

var sjisStream = new ActiveXObject("ADODB.Stream");
var utf8Stream = new ActiveXObject("ADODB.Stream");

sjisStream.Charset = "Shift_JIS";
utf8Stream.Charset = "UTF-8";

sjisStream.Open();
sjisStream.LoadFromFile("C:\\path\\to\\sjis.txt");

utf8Stream.Open();
sjisStream.CopyTo(utf8Stream);
sjisStream.Close();

utf8Stream.SaveToFile("C:\\path\\to\\utf8.txt");
utf8Stream.Close();

こんな感じ。


ADODB.Streamを使った文字コードの取り扱い (1)

| 18:41 |  ADODB.Streamを使った文字コードの取り扱い (1) - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  ADODB.Streamを使った文字コードの取り扱い (1) - Ci.nsIZIGOROu

先人が激しく既出してる訳ですが、まだ未経験なので一からやる。

まず適当ディレクトリutf-8, shift_jisファイルをそれぞれ用意しておく。

utf-8ファイルはBOMはつけない事。

Shift_JIS, UTF-8ファイルをそれぞれCharsetを指定して読み込み標準出力へ書き込む

var s1 = new ActiveXObject("ADODB.Stream");
var s2 = new ActiveXObject("ADODB.Stream");

s1.Charset = "UTF-8";
s2.Charset = "Shift_JIS"

s1.Open();
s1.LoadFromFile("C:\\path\\to\\utf8.txt");
WScript.Echo(s1.ReadText(-1));
s1.Close();

s2.Open();
s2.LoadFromFile("C:\\path\\to\\sjis.txt");
WScript.Echo(s2.ReadText(-1));
s2.Close();

こんな感じでOK。

元の文字コードが何であれ、正しい文字コードで読み込んだ場合はWSHの場合はShift_JISで動作してるけど問題なく出力できる。

誤ったCharsetで読み込み標準出力に書き込む

var s1 = new ActiveXObject("ADODB.Stream");

s1.Charset = "UTF-8";

s1.Open();
s1.LoadFromFile("C:\\path\\to\\sjis.txt");
WScript.Echo(s1.ReadText(-1));
s1.Close();

これは何も出力されない。文字コード指定が間違えているから。


Microsoft SOAP Toolkitを使ってJScriptでSOAP - 基本編

| 16:14 |  Microsoft SOAP Toolkitを使ってJScriptでSOAP - 基本編 - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  Microsoft SOAP Toolkitを使ってJScriptでSOAP - 基本編 - Ci.nsIZIGOROu

ちょっとやりたい事があったから調べてみたよ。

ちなみにProgIDでMSSOAP.SoapClientとかがもし入ってない環境だったら、

からSDKをダウンロードしてインストールして下さい。

準備

とりあえず通信内容も見たいので、以下のようなPerlプログラムを作っておきました。

どんな物かはソース見て各自把握しよう。(ぇ

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dump qw(dump);
use HTTP::Proxy;
use HTTP::Proxy::BodyFilter::simple;

my $proxy = HTTP::Proxy->new(port => 1981);

my $body_filter = HTTP::Proxy::BodyFilter::simple->new(
    filter => sub {
        my ($self, $dataref, $message, $protocol, $buffer) = @_;

        print STDERR dump({
            data => $$dataref,
            message => $message,
            protocol => $protocol,
            buffer => $buffer
        });
    }
);

$proxy->push_filter(request => $body_filter, response => $body_filter);

$proxy->start;

これでよしなに本文はリクエストレスポンス共にdumpしてくれます。

今回試して見るサービス

にあるWSH版の奴を試す。

var soapClient = new ActiveXObject("MSSOAP.SoapClient");
// WSDLファイルで初期化する
soapClient.mssoapinit("http://ws.kanetaka.net/4dwsdl");
soapClient.ConnectorProperty("ProxyServer") = "localhost";
soapClient.ConnectorProperty("ProxyPort") = 1981; // 今、流行の年代らしいですw

WScript.Echo(soapClient.WS_Square_root(3));

事前にproxyサーバーを立ち上げておこう。

通信内容

リクエスト
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Body>
    <SOAPSDK1:WS_Square_root xmlns:SOAPSDK1="http://www.kanetaka.net/namespace/default">
      <MyInput>3</MyInput>
    </SOAPSDK1:WS_Square_root>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
レスポンス
<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SOAP-ENV:Body>
    <ns1:WS_Square_rootResponse xmlns:ns1="http://www.kanetaka.net/namespace/default" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      <Result xsi:type="xsd:float">1.73205080756887</Result>
    </ns1:WS_Square_rootResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

まとめ

とりあえず複合型が送受信データに含まれなければSoapClientだけで凄い簡単に出来る。

次回は複合型の場合について考える予定。

参考

RodriguezRodriguez2012/09/28 17:27That's not even 10 mnitues well spent!

mfojlkmfojlk2012/09/30 01:111vBeq3 , [url=http://uetxqsgbcept.com/]uetxqsgbcept[/url], [link=http://rrpikmmoyapg.com/]rrpikmmoyapg[/link], http://fdkbadzfioma.com/

mqrdvonxwkfmqrdvonxwkf2012/09/30 11:345z9xtm <a href="http://isztxmrmkykw.com/">isztxmrmkykw</a>

ysvqtuzfysvqtuzf2012/10/02 02:52jxjtOm , [url=http://yprzkgwjuvdg.com/]yprzkgwjuvdg[/url], [link=http://glnqmogpaeqw.com/]glnqmogpaeqw[/link], http://ahmjujlffyqc.com/