在 Informatica Powercenter Designer 中使用高级标头执行 SOAP 请求
如何在 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 会话日志中。所以请尽情使用它们,日志记录永远不会多。
希望对您有所帮助!