5

次のコードを使用して、SOAPAPIに頭をぶつけています。私の目標は、カスタムフィールドを使用してチケットを作成することです。カスタムフィールド部分をコメントアウトすると、このコードは正常に機能します。何が起こっているのかについて何か考えはありますか?

コード

my $soap = SOAP::Lite->service($wsdl);
my $token = $soap->login($_jira_user,$_jira_pass);

my $customFields = [
    {'customFieldId' => $_cf_map{'severity'},'values' => [SOAP::Data->type('string', $severity)]},
    {'customFieldId' => $_cf_map{'outage_start'}, 'values' => [SOAP::Data->type('string', $start)]},
    {'customFieldId' => $_cf_map{'no_auto_close'}, 'values' => [SOAP::Data->type('string', $no_auto_close == 1 ? 'Yes': 'No')]},
    {'customFieldId' => $_cf_map{'nco_serials'}, 'values' => [SOAP::Data->type('string', $serial_string)]},
    {'customFieldId' => $_cf_map{'services'}, 'values' => \@services},
];

my $remoteIssueHash = {
    'project' => SOAP::Data->type('string' => $_projectkey),
    'type' => SOAP::Data->type('string' => $_issuetype),
    'summary' => SOAP::Data->type('string' => $summary),
    'reporter' => SOAP::Data->type('string' => $user),
    'assignee' => SOAP::Data->type('string' => $user),
    'customFieldValues' => $customFields,
};

my $remote_issue = $soap->call('createIssue', $token, $remoteIssueHash);
print Dumper [$remote_issue->faultcode(), $remote_issue->faultstring(), $soap->transport()->status(), $remote_issue->result(), $remote_issue ]
exit();

出力

$VAR1 = [
      'soapenv:Server.userException',
      'org.xml.sax.SAXException: No deserializer for {http://www.w3.org/2001/XMLSchema}anyType',
      '500 Internal Server Error',
      #big soap object
      ]

XML送信

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:tns2="http://exception.rpc.jira.atlassian.com" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:namesp1="http://soap.rpc.jira.atlassian.com" xmlns:apachesoap="http://xml.apache.org/xml-soap" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns1="http://beans.soap.rpc.jira.atlassian.com" xmlns:impl="http://jira.nyc.hcmny.com:8080/rpc/soap/jirasoapservice-v2" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <soap:Body>
            <namesp1:createIssue>
                  <c-gensym6 xsi:type="xsd:string">Y6DQd1k2BL</c-gensym6>
                  <c-gensym8>
                        <assignee xsi:type="xsd:string">fgulotta</assignee>
                        <customFieldValues soapenc:arrayType="xsd:anyType[5]" xsi:type="soapenc:Array">
                              <item>
                                    <customFieldId xsi:type="xsd:string">customfield_10094</customFieldId>
                                    <values soapenc:arrayType="xsd:string[1]" xsi:type="soapenc:Array">
                                          <item xsi:type="xsd:string">4</item>
                                    </values>
                                    <key xsi:type="xsd:string" />
                              </item>
                              <item>
                                    <customFieldId xsi:type="xsd:string">customfield_10084</customFieldId>
                                    <values soapenc:arrayType="xsd:string[1]" xsi:type="soapenc:Array">
                                          <item xsi:type="xsd:string">29/Jul/11 05:46 PM</item>
                                    </values>
                                    <key xsi:type="xsd:string" />
                              </item>
                              <item>
                                    <customFieldId xsi:type="xsd:string">customfield_10100</customFieldId>
                                    <values soapenc:arrayType="xsd:string[1]" xsi:type="soapenc:Array">
                                          <item xsi:type="xsd:string">Yes</item>
                                    </values>
                                    <key xsi:type="xsd:string" />
                              </item>
                              <item>
                                    <customFieldId xsi:type="xsd:string">customfield_10093</customFieldId>
                                    <values soapenc:arrayType="xsd:string[1]" xsi:type="soapenc:Array">
                                          <item xsi:type="xsd:string" />
                                    </values>
                                    <key xsi:type="xsd:string" />
                              </item>
                              <item>
                                    <customFieldId xsi:type="xsd:string">customfield_10080</customFieldId>
                                    <values soapenc:arrayType="xsd:string[1]" xsi:type="soapenc:Array">
                                          <item xsi:type="xsd:string">intranet</item>
                                    </values>
                                    <key xsi:type="xsd:string" />
                              </item>
                        </customFieldValues>
                        <summary xsi:type="xsd:string">This is a test ticket.</summary>
                        <project xsi:type="xsd:string">MON</project>
                        <type xsi:type="xsd:string">31</type>
                        <reporter xsi:type="xsd:string">fgulotta</reporter>
                  </c-gensym8>
            </namesp1:createIssue>
      </soap:Body>
</soap:Envelope>

XMLを受信しました

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Body>
            <soapenv:Fault>
                  <faultcode>soapenv:Server.userException</faultcode>
                  <faultstring>org.xml.sax.SAXException: No deserializer for {http://www.w3.org/2001/XMLSchema}anyType</faultstring>
                  <detail>
                        <faultData xsi:type="ns1:SAXException" xmlns:ns1="http://sax.xml.org">
                              <exception xsi:type="ns2:Exception" xsi:nil="true" xmlns:ns2="http://lang.java"/>
                              <message xsi:type="xsd:string">No deserializer for {http://www.w3.org/2001/XMLSchema}anyType</message>
                        </faultData>
                        <ns3:hostname xmlns:ns3="http://xml.apache.org/axis/">deputy.811t.hcmny.com</ns3:hostname>
                  </detail>
            </soapenv:Fault>
      </soapenv:Body>
</soapenv:Envelope>

修正されたフィールド名と文字列配列の値を更新しましたが、まだ問題があります。

2回目の更新 soapサービスに対して機能するJavaコードを見つけ、それに対してテストを実行しました。次に、wiresharkを使用してxmlをスニッフィングしました。multirefを無視すると、その構造は非常に似ていますが、Soap::Liteでモデル化する方法がよくわかりません。

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Body>
            <ns1:createIssue soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://soap.rpc.jira.atlassian.com">
                  <in0 xsi:type="xsd:string">B2P69v5NrS</in0>
                  <in1 href="#id0"/>
            </ns1:createIssue>
            <multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns2:RemoteIssue" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="http://beans.soap.rpc.jira.atlassian.com">
                  <id xsi:type="xsd:string" xsi:nil="true"/>
                  <affectsVersions xsi:type="ns2:RemoteVersion" xsi:nil="true"/>
                  <assignee xsi:type="xsd:string">fgulotta</assignee>
                  <attachmentNames xsi:type="xsd:string" xsi:nil="true"/>
                  <components xsi:type="ns2:RemoteComponent" xsi:nil="true"/>
                  <created xsi:type="xsd:dateTime" xsi:nil="true"/>
                  <customFieldValues soapenc:arrayType="ns2:RemoteCustomFieldValue[3]" xsi:type="soapenc:Array">
                        <customFieldValues href="#id1"/>
                        <customFieldValues href="#id2"/>
                        <customFieldValues href="#id3"/>
                  </customFieldValues>
                  <description xsi:type="xsd:string" xsi:nil="true"/>
                  <duedate xsi:type="xsd:dateTime" xsi:nil="true"/>
                  <environment xsi:type="xsd:string" xsi:nil="true"/>
                  <fixVersions xsi:type="ns2:RemoteVersion" xsi:nil="true"/>
                  <key xsi:type="xsd:string" xsi:nil="true"/>
                  <priority xsi:type="xsd:string" xsi:nil="true"/>
                  <project xsi:type="xsd:string">MON</project>
                  <reporter xsi:type="xsd:string">fgulotta</reporter>
                  <resolution xsi:type="xsd:string" xsi:nil="true"/>
                  <status xsi:type="xsd:string" xsi:nil="true"/>
                  <summary xsi:type="xsd:string">This is a test ticket.</summary>
                  <type xsi:type="xsd:string">31</type>
                  <updated xsi:type="xsd:dateTime" xsi:nil="true"/>
                  <votes xsi:type="xsd:long" xsi:nil="true"/>
            </multiRef>
            <multiRef id="id2" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns3:RemoteCustomFieldValue" xmlns:ns3="http://beans.soap.rpc.jira.atlassian.com" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
                  <customfieldId xsi:type="xsd:string">customfield_10094</customfieldId>
                  <key xsi:type="xsd:string" xsi:nil="true"/>
                  <values soapenc:arrayType="xsd:string[1]" xsi:type="soapenc:Array">
                        <values xsi:type="xsd:string">4</values>
                  </values>
            </multiRef>
            <multiRef id="id1" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns4:RemoteCustomFieldValue" xmlns:ns4="http://beans.soap.rpc.jira.atlassian.com" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
                  <customfieldId xsi:type="xsd:string">customfield_10084</customfieldId>
                  <key xsi:type="xsd:string" xsi:nil="true"/>
                  <values soapenc:arrayType="xsd:string[1]" xsi:type="soapenc:Array">
                        <values xsi:type="xsd:string">27/Jul/11 02:21 PM</values>
                  </values>
            </multiRef>
            <multiRef id="id3" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns5:RemoteCustomFieldValue" xmlns:ns5="http://beans.soap.rpc.jira.atlassian.com" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
                  <customfieldId xsi:type="xsd:string">customfield_10100</customfieldId>
                  <key xsi:type="xsd:string" xsi:nil="true"/>
                  <values soapenc:arrayType="xsd:string[1]" xsi:type="soapenc:Array">
                        <values xsi:type="xsd:string">Yes</values>
                  </values>
            </multiRef>
      </soapenv:Body>
</soapenv:Envelope>
4

3 に答える 3

2

私はSOAP::Liteでperlを使用して問題(要件)を作成することができました。重要なのは、配列を使用してリクエストを作成し、SOAP :: Data-> type()を使用してタイプを定義することです。'fixVersions'属性を使用して修正バージョンを入力できませんでしたが、カスタムフィールド'customfield_10040'を使用して入力しました。getItem()呼び出しを使用して、ケースでどちらが使用されているかを確認できます。

my $soap = SOAP::Lite->service($URI);
my $token = $soap->login($USERNAME,$PASSWORD);

my $fieldValues = [
   SOAP::Data->type('RemoteCustomFieldValue', {'customfieldId' => 'customfield_10040',
                                               'values' => [
                                                   SOAP::Data->type('string', '10051'),
                                                   SOAP::Data->type('string', '10052')
                                                           ]
                                              }),];
my $affectedValues = [
   SOAP::Data->type('RemoteVersion', {'name' => 'FINS 1.16.1', 
                                        'id' => SOAP::Data->type('string', '10051')}),
   SOAP::Data->type('RemoteVersion', {'name' => 'FINS 1.16.1a',
                                        'id' => SOAP::Data->type('string', '10052')})
                     ];
my $fixedValues = [
                   SOAP::Data->type('RemoteVersion', {'name' => 'FINS 1.16.1', 
                                                        'id' => SOAP::Data->type('string', '10051')})
                  ];
my $customFields    = SOAP::Data->type('RemoteCustomFieldValue', $fieldValues);
my $fixVersion      = SOAP::Data->type('RemoteVersion'  , $fixedValues);
my $affectedVersion = SOAP::Data->type('RemoteVersion'  , $affectedValues);
my $component       = SOAP::Data->type('RemoteComponent', \{'name' => 'CST', 'id' => SOAP::Data->type('string', '10194')});

my $remoteIssueHash = {
    'project'           => SOAP::Data->type('string' => $PROJECT),
    'type'              => SOAP::Data->type('string' => 10),
    'summary'           => SOAP::Data->type('string' => $summary),
    'reporter'          => SOAP::Data->type('string' => $reporter),
    'assignee'          => SOAP::Data->type('string' => $assignee),
    'customFieldValues' => SOAP::Data->type('array'  => $customFields),
    'affectsVersions'   => SOAP::Data->type('array'  => $affectedVersion),
    'components'        => SOAP::Data->type('array'  => $component),
    'fixVersions'       => SOAP::Data->type('array'  => $fixVersion),  ## this doesn't do anything
    'description'       => SOAP::Data->type('string' => $description),
    'environment'       => SOAP::Data->type('string' => 'Some environment'),
};

my $remote_issue = $soap->call('createIssue', $token, $remoteIssueHash);
print Dumper [$remote_issue->faultcode(), $remote_issue->faultstring(), $soap->transport()->status(), $remote_issue->result(), $remote_issue ];
exit();

それで頑張ってください。

ダニエル

于 2011-08-22T19:08:21.730 に答える
1

createIssueはRemoteIssueオブジェクトを取ります。RemoteIssueオブジェクトには、RemoteCustomFieldValueオブジェクトのcustomFieldValuesという名前の配列があります。これまでのところすべて良い。RemoteCustomFieldValueオブジェクトには、customfieldIdという名前のフィールド(「id」ではない)と「values」という名前の文字列配列があります。$ Severityは配列ではないように見えますか?

これはすべて、RemoteIssueおよびRemoteCustomFieldValueのJavaソースからのものです。私の経験では、SOAPエラーはほとんどの場合役に立たない。

〜マット

于 2011-07-28T19:52:23.367 に答える
0

私は意味を理解しようとするのをあきらめましたSOAP::Lite。私は2005年にそのモジュールの予期せぬやり方にひどく噛まれ、それを使わないようにすることを学びました。

多くの場合、DOMを構築するための単純なLWPプラスXML::LibXMLで十分です。

XMLドキュメントをプログラム内の文字列としてハードコーディングし、変数を補間する立場にある場合もあります。きれいではありませんが、状況によっては十分です。

今、あなたはWSDLファイルに直面しており、シナリオは簡単ではない可能性があります。(知らない。)

私はつい最近、優れたMarkOvermeerのXML::Compileモジュールスイートの存在を知りました。敬意を払う必要がある場合は、敬意を払う必要があります。SOAP / MTOM / XOMサービスと統合する必要があったため、バイナリ添付ファイルを使用したXML。私はその(肥大化した企業)仕様について多くの手がかりを持っていませんでした。を使用するXML::Compile::SOAPと、3時間で動作するようになりました。ほとんどの時間は、(愚かな)試行錯誤のアプローチでしか起こらなかった些細な問題で無駄になりました。ドキュメントに従えば、1時間だったでしょう。

だから私はMarkOvermeerを強くお勧めしXML::Compile::SOAPます。それは私たちにとって非常にうまくいきました。

于 2011-07-30T06:09:04.043 に答える