クラウド版 Garoon API をPerlで使用したい

現在、クラウド版 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


SOAPヘッダーにActionタグとTimestampタグが足りないのではないかと思います。
↓こちらを確認してみてください。

https://cybozudev.zendesk.com/hc/ja/articles/202228464-SOAP-API%E3%81%AE%E5%85%B1%E9%80%9A%E4%BB%95%E6%A7%98

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で作成した方がわかりやすいですね。

これを基本に他のデータも取得してみたいと思います。
本当にありがとうございました!