65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Informatica Powercenter Designer 中使用高级标头执行 SOAP 请求

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2018 年 8 月 9 日

CPOL

2分钟阅读

viewsIcon

5584

如何在 Informatica Powercenter Designer 中使用高级标头执行 SOAP 请求

我的同事在尝试访问 SOAP Web 服务时遇到问题。具体来说,他需要根据安全要求提供扩展的 SOAP 标头,在本例中是一个 SAML 断言,而标准的 Informatica Web 转换对他帮助不大。

我们发现通过 Java 转换可以很容易地实现这一点。所以这就是我们所做的事情。

在 Informatica 中,创建 Java 转换。下图显示了它位于两个其他转换之间,我们可以看到输入和输出值是如何在它们之间传输的。

请原谅使用丹麦语;希望其大意足以说明问题。

下图进一步说明了 Java 转换的输入和输出端口。这些确切的名称立即从我们编写的 Java 代码中提供给我们。

现在,让我们添加 Java 代码,专门用于调用带有标头的 SOAP Web 服务等等。

我们在转换中可以使用多个选项卡 - 我只使用了“On Input Row”(在输入行上)和“Import Packages”(导入包)。

在“Import Packages”中,指定执行任务所需的 Java 导入。对于我的用例,这些就足够了

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.URL;

有了这些导入,我们可以继续在“On Input Row”选项卡中添加 Java 代码。请原谅大量的文本;我认为包含完整的 SOAP 请求、标头和主体以求完整性非常重要。

try {
 logInfo("Sending soap request");

 String FagsystemNavn = fagsystemnavn_Input;     // corresponds with the input variable name
 String KundeNummer = kundenummer_Input;         // corresponds with the input variable name
 String MeddelelseTypeNummer = meddelelsetypenummer_Input;  // corresponds with the 
                                                            // input variable name
 String KanalTypeNummer = kanaltypenummer_Input; // 1=mail, 2=sms, 4=brev
 Integer currentTimeInSeconds = (int) (System.currentTimeMillis() / 1000);
 String MeddelelseBatchId = currentTimeInSeconds.toString();

 String soapTemplate = "<soapenv:Envelope 
        xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" 
        xmlns:ns=\"http://skat.dk/begrebsmodel/2009/01/15/\">\n"
   + "   <soapenv:Header>\n"
   + "      <wsse:Security soapenv:mustUnderstand=\"1\" 
   xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/
   oasis-200401-wss-wssecurity-secext-1.0.xsd\">\n"
   + "         <Assertion AssertionID=\"d913c046fddbca7a55fca34caf18cafa\" 
   IssueInstant=\"2007-05-14T11:45:21.835Z\" Issuer=\"test.unsigned\" 
   MajorVersion=\"1\" MinorVersion=\"1\" 
   xmlns=\"urn:oasis:names:tc:SAML:1.0:assertion\" 
   xmlns:saml=\"urn:oasis:names:tc:SAML:1.0:assertion\" 
   xmlns:samlp=\"urn:oasis:names:tc:SAML:1.0:protocol\">\n"
   + "            <Conditions NotBefore=\"2007-05-14T11:43:21.834Z\" 
   NotOnOrAfter=\"2112-05-14T11:43:21.834Z\"/>\n"
   + "            <AuthenticationStatement 
   AuthenticationInstant=\"2007-05-14T11:45:21.834Z\" 
   AuthenticationMethod=\"urn:oasis:names:tc:SAML:1.0:am:unspecified\">\n"
   + "               <Subject>\n"
   + "                  <NameIdentifier Format=\"urn:oasis:names:
   tc:SAML:1.1:nameid-format:unspecified\" 
   NameQualifier=\"skat\">skatGuid=wEFI04,ou=skatEmployee,ou=internal,
   ou=entities,dc=skat,dc=dk</NameIdentifier>\n"
   + "                  <SubjectConfirmation>\n"
   + "                     <ConfirmationMethod>urn:oasis:names:
   tc:SAML:1.0:cm:sender-vouches</ConfirmationMethod>\n"
   + "                  </SubjectConfirmation>\n" + "
   </Subject>\n"
   + "            </AuthenticationStatement>\n" + "
   <AttributeStatement>\n"
   + "               <Subject>\n"
   + "                  <NameIdentifier 
   Format=\"urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified\" 
   NameQualifier=\"skat\">skatGuid=wEFI04,ou=skatEmployee,ou=internal,
   ou=entities,dc=skat,dc=dk</NameIdentifier>\n"
   + "                  <SubjectConfirmation>\n"
   + "                     <ConfirmationMethod>urn:oasis:names:
   tc:SAML:1.0:cm:sender-vouches</ConfirmationMethod>\n"
   + "                  </SubjectConfirmation>\n" + "
   </Subject>\n"
   + "               <Attribute AttributeName=\"Groups\" 
   AttributeNamespace=\"urn:bea:security:saml:groups\" 
   xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" 
   xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"
   + "                  <AttributeValue>
   PRIMARY_IDENTITY_skatGuid=14a2d120-bbda-4b62-aa27-1bbd8751f47f,
   ou=skatSystem,ou=internal,ou=entities,dc=skat,dc=dk</AttributeValue>\n"
   + "                  <AttributeValue>AUTH_LEVEL_6</AttributeValue>\n"
   + "                  <AttributeValue>EFISagsbehandlerPRG</AttributeValue>\n"
   + "               </Attribute>\n" + "            </AttributeStatement>\n"
   + "         </Assertion>\n" + "      </wsse:Security>\n" + 
   "   </soapenv:Header>\n"
   + "   <soapenv:Body>\n" + "
   <ns:MeddelelseMultiSend_I>\n" + 
   "         <ns:Kontekst>\n"
   + "            <tsk:HovedOplysninger 
   xmlns:tsk=\"http://skat.dk/begrebsmodel/xml/schemas/kontekst/2007/05/31/\">\n"
   + "               <tsk:TransaktionsID>A12345678ZZ</tsk:TransaktionsID>\n"
   + "               <tsk:TransaktionsTid>2010-10-14T13:30:47</tsk:TransaktionsTid>\n"
   + "            </tsk:HovedOplysninger>\n" + "         </ns:Kontekst>\n"
   + "         <ns:FagsystemNavn>${FagsystemNavn}</ns:FagsystemNavn>\n"
   + "         <ns:MeddelelseBatchID>${MeddelelseBatchId}</ns:MeddelelseBatchID>\n"
   + "         <ns:Meddelelser>\n" + "            <ns:Meddelelse>\n"
   + "               <ns:MeddelelseIndhold>\n" + "\n"
   + "                    <ns:DIASMeddelelseAnmodningSambeskatningStruktur>\n"
   + "                     <ns:Aktør>\n"
   + "                        <ns:VirksomhedNavnFirmaNavn>Et_Aktø
   r_Firmanavn</ns:VirksomhedNavnFirmaNavn>\n"
   + "                        <ns:VirksomhedCVRNummer>12345677
   </ns:VirksomhedCVRNummer>\n"
   + "                     </ns:Aktør>\n" + "
   <ns:SelskabListe>\n"
   + "                        <ns:Selskab>\n"
   + "                           <ns:VirksomhedNavnFirmaNavn>Et_Selskab_Firmanavn1
   </ns:VirksomhedNavnFirmaNavn>\n"
   + "                           <ns:VirksomhedCVRNummer>11111111
   </ns:VirksomhedCVRNummer>\n"
   + "                        </ns:Selskab>\n" + "
   <ns:Selskab>\n"
   + "                           <ns:VirksomhedNavnFirmaNavn>
   Et_Selskab_Firmanavn2</ns:VirksomhedNavnFirmaNavn>\n"
   + "                           <ns:VirksomhedCVRNummer>22222222
   </ns:VirksomhedCVRNummer>\n"
   + "                        </ns:Selskab>\n" + "
   <ns:Selskab>\n"
   + "                           <ns:VirksomhedNavnFirmaNavn>Et_Selskab_Firmanavn3
   </ns:VirksomhedNavnFirmaNavn>\n"
   + "                           <ns:VirksomhedCVRNummer>33333333
   </ns:VirksomhedCVRNummer>\n"
   + "                        </ns:Selskab>\n" + "
   </ns:SelskabListe>\n"
   + "                     <ns:SelskabSambeskatningÆndringStartDato>2014-04-11
   </ns:SelskabSambeskatningÆndringStartDato>\n"
   + "                  </ns:DIASMeddelelseAnmodningSambeskatningStruktur>\n" + "\n"
   + "               </ns:MeddelelseIndhold>\n"
   + "               <ns:MeddelelseTypeNummer>${MeddelelseTypeNummer}
   </ns:MeddelelseTypeNummer>\n"
   + "               <ns:MeddelelseAfsenderReference>99</ns:MeddelelseAfsenderReference>\n"
   + "               <ns:KundeNummer>${KundeNummer}</ns:KundeNummer>\n"
   + "               <ns:MeddelelseOprettetAfMedarbejder>w95641
   </ns:MeddelelseOprettetAfMedarbejder>\n"
   + "               <ns:KanalTypeNummer>${KanalTypeNummer}
   </ns:KanalTypeNummer>\n"
   + "   <ns:KanalAdresseStruktur>\n" + "
   <ns:AdresseValg>\n"
   + "     <ns:EmailAdresseStruktur>\n" + "
   <ns:EmailAdresse>\n"
   + "       <ns:EmailAdresseEmail>finn.danvar@skat.dk</ns:EmailAdresseEmail>\n"
   + "      </ns:EmailAdresse>\n" + "     </ns:EmailAdresseStruktur>\n"
   + "<!--\n" + "     <ns:TelefonNummerStruktur>\n"
   + "      <ns:TelefonNummerStruktur>\n"
   + "       <ns:TelefonNummer>81615902</ns:TelefonNummer>\n"
   + "      </ns:TelefonNummerStruktur>\n"
   + "     </ns:TelefonNummerStruktur>\n" + 
   "-->\n" + "    </ns:AdresseValg>\n"
   + "   </ns:KanalAdresseStruktur>\n"
   + "               <ns:MeddelelseTypeSkalIKommunikationMappe>
   true</ns:MeddelelseTypeSkalIKommunikationMappe>\n"
   + "               <ns:Filer/>\n" + "            
   </ns:Meddelelse>\n" + "         </ns:Meddelelser>\n"
   + "      </ns:MeddelelseMultiSend_I>\n" + "   
   </soapenv:Body>\n" + "</soapenv:Envelope>";

 String soapMessage = soapTemplate.replace("${FagsystemNavn}", FagsystemNavn)
   .replace("${MeddelelseBatchId}", MeddelelseBatchId)
   .replace("${MeddelelseTypeNummer}", 
   MeddelelseTypeNummer).replace("${KundeNummer}", KundeNummer)
   .replace("${KanalTypeNummer}", KanalTypeNummer);

 URL url = new URL("http://the-url-to-your-soap-service");
 HttpURLConnection connection = (HttpURLConnection) url.openConnection();

 connection.setDoOutput(true);
 connection.setDoInput(true);
 connection.setRequestMethod("POST");
 connection.setRequestProperty("Content-Type", "text/xml");
 connection.setReadTimeout(5000);
 OutputStream out = connection.getOutputStream();
 Writer wout = new OutputStreamWriter(out);

 wout.write(soapMessage);
 wout.close();
 InputStreamReader isr = null;
 if (connection.getResponseCode() <= 400) {
  isr = new InputStreamReader(connection.getInputStream());
 } else {
  isr = new InputStreamReader(connection.getErrorStream());
 }

 BufferedReader in = new BufferedReader(isr);
 StringBuffer responseSoapMessage = new StringBuffer();
 String inputLine = in.readLine();

 while (inputLine != null) {

  // the response XML contains both the merged xml and the deploy logs.
  responseSoapMessage.append(inputLine);
  inputLine = in.readLine();
 }
 in.close();
 System.out.println("responseSoapMessage" + responseSoapMessage.toString());
 int webServiceKaldSucces_Output;
 
 if (responseSoapMessage.toString().contains(
   "<n1:AdvisNummer>1001</n1:AdvisNummer>
   <n1:AdvisTekst>Request with 1 messages was acknowledged</n1:AdvisTekst>")) {
  webServiceKaldSucces_Output = 1; // success in web-service call - stored in the output variable
  logInfo("Soap request - succes");
 } else {
  webServiceKaldSucces_Output = 0; // error in web-service call  - stored in the output variable
  logInfo("Soap request - error");
 }

 generateRow(); // Required by Informatica to generate output.
 
} 
catch (Exception ex) 
{
 logError(ex.getMessage());
}

上面的代码将 SOAP 请求组合在一起,用输入端口值替换其中的特定值。然后,通过标准的 Java HttpURLConnection,它发送请求,并将响应读取到 StringBuilder 对象中。对于我们的用例,我们通过查找特定的 String 值来报告成功或失败,无需进一步解析响应。

请注意对 'generateRow()' 的调用,这是 Informatica 填充输出值所需的。

另请注意对 logInfo(message)logError(message) 的调用,它们分别启用将日志记录到 Informatica 会话日志中。所以请尽情使用它们,日志记录永远不会多。

希望对您有所帮助!

© . All rights reserved.