現在、クラウド版 Garoonを社内に導入中の者です。
Garoon API を使用してデータを取得しようと考えているのですが、データのリプライが無く困っています。
ネットなど調べましたが、SOAP初心者の為、解決に至っておりません。
調べたところSOAP::Liteが使用できそうだったので、下記のように記述したのですがデータを取得できません。
ご存知の方、教えていただけないでしょうか?
=================================
use strict;
use SOAP::Lite + trace => ‘debug’;
my $wsdl = ‘https://xxxxxx.cybozu.com/g/index.csp?WSDL’;
my $proxy = ‘https://static.cybozu.com/g/F5.2.35_4.11/api/2008/util_api.wsdl’;
my $id = SOAP::Data->name(‘login_name’ => ‘xxxxxx’);
my $pass = SOAP::Data->name(‘password’ => ‘xxxxxx’);
my $service = SOAP::Lite->uri($wsdl)->proxy($proxy);
my $result = $service->UtilLogin($id, $pass);
if ($result->fault){
print $result->faultdetail;
}else{
$result->result;
}
debugで下記のように表示されているため、送信はできているのかと思うのですが…。
SOAP::Transport::HTTP::Client::send_receive: POST https://static.cybozu.com/g/F5.2.35_4.11/api/2008/util_api.wsdl HTTP/1.1
Accept: text/xml
Accept: multipart/*
Accept: application/soap
Content-Length: 550
Content-Type: text/xml; charset=utf-8
SOAPAction: “https://xxxxxx.cybozu.com/g/index.csp?WSDL#UtilLogin”
<?xml version=“1.0” encoding=“UTF-8”?><soap:Envelope soap:encodingStyle=“http://schemas.xmlsoap.org/soap/encoding/” xmlns:soap=“http://schemas.xmlsoap.org/soap/envelope/” xmlns:soapenc=“http://schemas.xmlsoap.org/soap/encoding/” xmlns:xsd=“http://www.w3.org/2001/XMLSchema” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”>soap:Body<UtilLogin xmlns="https://xxxxxx.cybozu.com/g/index.csp?WSDL"><login_name xsi:type=“xsd:string”>xxxxxx</login_name><password xsi:type=“xsd:string”>xxxxxx</password></UtilLogin>/soap:Body/soap:Envelope
SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 200 OK
Cache-Control: max-age=315360000
Connection: close
:
:
:
Hiroyuki_K様、
回答ありがとうございます。
ActionタグとTimestampタグを追加してみましたが、結果は変わらずデータ取得できませんでした。
下記のメッセージをSOAP::Liteで送っているようなのですが、仕様に記載されている内容と少し違うようです。
<?xml version=“1.0” encoding=“UTF-8”?>
<soap:Envelope soap:encodingStyle=“http://schemas.xmlsoap.org/soap/encoding/”
xmlns:soap=“http://schemas.xmlsoap.org/soap/envelope/”
xmlns:soapenc=“http://schemas.xmlsoap.org/soap/encoding/”
xmlns:xsd=“http://www.w3.org/2001/XMLSchema”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”>
soap:Header
<namesp1:Action soap:mustUnderstand=“1” xmlns:namesp1=“http://schemas.xmlsoap.org/ws/2003/03/addressing” xsi:type=“xsd:string”>UtilLogin/namesp1:Action
<namesp2:Timestamp soap:mustUnderstand=“1” xmlns:namesp2=“http://schemas.xmlsoap.org/ws/2002/07/utility”>
<Created xsi:type=“xsd:dateTime”>2015-01-06T10:45:00Z</Created>
<Expires xsi:type=“xsd:dateTime”>2037-08-12T14:45:00Z</Expires>
/namesp2:Timestamp
/soap:Header
soap:Body
<UtilLogin xmlns=“https://xxxx.cybozu.com/g/index.csp?WSDL”>
<parameters>
<login_name xsi:type=“xsd:string”>xxxx</login_name>
<password xsi:type=“xsd:string”>xxxx</password>
</parameters>
</UtilLogin>
/soap:Body
/soap:Envelope
例えば、Actionタグの中身が下記に対して
<namesp1:Action soap:mustUnderstand=“1” xmlns:namesp1=“http://schemas.xmlsoap.org/ws/2003/03/addressing” xsi:type=“xsd:string”
サンプルは
<Action SOAP-ENV:mustUnderstand=“1” xmlns=“http://schemas.xmlsoap.org/ws/2003/03/addressing”>
です。他にも少しずつ違います。この違いでデータが取得できないのでしょうか?
こちらでもSOAP::Liteを使ってみました。
WSDLモードではないのですが、とりあえず動くことが確認できました。
Perlは使い慣れていないので、おかしなところがあるかもしれませんが、
よろしければご参考ください。
コード
use strict;
use SOAP::Lite + trace => 'debug';
use Data::Dumper;
# 接続情報:各APIの情報はWSDLファイルに書かれている
my $proxy = 'https://xxxxx.cybozu.com/g/util_api/util/api.csp'; # 送信先
# リクエスト内容
my $action = 'UtilLogin';
my $login_name = 'xxxxxx';
my $password = 'xxxxxx';
# クライアント生成
my $service = SOAP::Lite->proxy($proxy);
$service->soapversion('1.2'); # ガルーンはSOAP1.2
$service->envprefix("SOAP-ENV");
#$service->readable(1);
# ヘッダーを生成
my $timestamp_header = SOAP::Header->new(
uri => 'http://schemas.xmlsoap.org/ws/2002/07/utility',
name => 'Timestamp',
prefix => '', # プレフィックスがあるとエラーになる
value =>
\SOAP::Data->value(
SOAP::Header->name('Created')->value('2037-08-12T14:45:00Z'),
SOAP::Header->name('Expires')->value('2037-08-12T14:45:00Z')
));
my $action_header = SOAP::Header->new(
uri => 'http://schemas.xmlsoap.org/ws/2003/03/addressing',
name =>'Action',
prefix => '', # プレフィックスがあるとエラーになる
value => $action);
# リクエスト内容を生成
my $parameters = SOAP::Data->new(
name => 'parameters',
value =>
\SOAP::Data->value(
SOAP::Data->name('login_name' => $login_name),
SOAP::Data->name('password' => $password)
));
# 実行
my $result = $service->call($action, $parameters, $timestamp_header, $action_header);
#### ヘッダーとリクエスト内容はXMLで作ったほうがやりやすいかもしれません
## ヘッダーを生成
#my $header_xml = <<"EOS";
#<Action xmlns="http://schemas.xmlsoap.org/ws/2003/03/addressing">$action</Action>
#<Timestamp xmlns="http://schemas.xmlsoap.org/ws/2002/07/utility">
# <Created>2037-08-12T14:45:00Z</Created>
# <Expires>2037-08-12T14:45:00Z</Expires>
#</Timestamp>
#EOS
#my $header = SOAP::Header->type('xml' => $header_xml);
#
## リクエスト内容を生成
#my $parameters_xml = <<"EOS";
#<parameters>
# <login_name xmlns="">$login_name</login_name>
# <password xmlns="">$password</password>
#</parameters>
#EOS
#my $parameters = SOAP::Data->type('xml' => $parameters_xml);
#
## 実行
#my $result = $service->call($action, $parameters, $header);
# 実行結果を確認
if ($result->fault){
print "Failed..";
}else{
print "Success!";
}
warn Dumper $result->body;
実行結果
$ perl dev.pl
SOAP::Transport::HTTP::Client::send_receive: POST https://xxxxxx.cybozu.com/g/util_api/util/api.csp HTTP/1.1
...(中略)...
Content-Type: application/soap+xml; charset=utf-8
SOAPAction: "#UtilLogin"
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="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:Header><Timestamp xmlns="http://schemas.xmlsoap.org/ws/2002/07/utility"><Created xsi:type="xsd:dateTime">2037-08-12T14:45:00Z</Created><Expires xsi:type="xsd:dateTime">2037-08-12T14:45:00Z</Expires></Timestamp><Action xmlns="http://schemas.xmlsoap.org/ws/2003/03/addressing" xsi:type="xsd:string">UtilLogin</Action></SOAP-ENV:Header><SOAP-ENV:Body><UtilLogin><parameters><login_name xsi:type="xsd:string">xxxxxx</login_name><password xsi:type="xsd:string">xxxxxx</password></parameters></UtilLogin></SOAP-ENV:Body></SOAP-ENV:Envelope>
SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 200 OK
Connection: close
...(中略)...
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:admin="http://wsdl.cybozu.co.jp/admin/2008">
<soap:Header>
<vendor>Cybozu</vendor>
<product>Garoon</product>
<version>3.12.0</version>
<apiversion>1.4.0</apiversion>
</soap:Header>
<soap:Body>
<admin:LoginResponse>
<returns>
<login_name>
xxxxxx
</login_name>
<status>
Login
</status>
<cookie>
JSESSIONID=xxxxxx; path=/
</cookie>
</returns>
</admin:LoginResponse>
</soap:Body>
</soap:Envelope>
Success!
$VAR1 = {
'LoginResponse' => {
'returns' => {
'login_name' => '
xxxxxx
',
'cookie' => '
JSESSIONID=xxxxxx; path=/
',
'status' => '
Login
'
}
}
};
Kawamukai Naoki様、
丁寧な解説ありがとうございます。
無事データを取得することができました。
ヘッダーとリクエストはXMLで作成した方がわかりやすいですね。
これを基本に他のデータも取得してみたいと思います。
本当にありがとうございました!