gpt4 book ai didi

c - 如何从 iSeries COBOL 调用 Web 服务?

转载 作者:太空狗 更新时间:2023-10-29 15:04:40 25 4
gpt4 key购买 nike

我们需要能够从 iSeries LPAR (V6R1) 上运行的 COBOL 代码调用内部 Web 服务。我完成了一个可以在网上找到的完整示例 here .因此,我的下一步是尝试重复该过程并调用我们现有的网络服务之一。

我使用 QSH 的 WSDL2WS 命令​​生成 C 客户端 stub 。我修改了示例 COBOL 客户端程序并尝试调用我的 Web 服务。我遇到的问题似乎与示例 C 客户端方法返回指针并且 COBOL 代码将它们分配给指针这一事实有关。我怀疑我的 COBOL 代码中的错误是问题的根源,因为 WSDL2WS 为我的 Web 服务方法创建的 C 方法返回一个简单的 xsdc_string 而不是指向自定义结果类型的指针:

xsdc__string TestUnsuccessfulMessage(AXISCHANDLE stub)
{
AXISCHANDLE call = axiscStubGetCall(stub);
xsdc__string Ret = NULL;

axiscCallSetSoapFaultNamespace(call, "http://myserver/PSItemMaintenance/ItemMaintenanceService.svc");


// ======================================================================
// Initialize client engine, set SOAP version, SOAPAction, operation, etc.
// ======================================================================

if (AXISC_SUCCESS != axiscCallInitialize(call, C_DOC_PROVIDER ))
return Ret;

if (NULL==axiscCallGetTransportProperty(call,"SOAPAction",0))
axiscCallSetTransportProperty(call,AXISC_SOAPACTION_HEADER , "http://tempuri.org/IItemMaintenanceService/TestUnsuccessfulMessage");

axiscCallSetSOAPVersion(call, SOAP_VER_1_1);
axiscCallSetOperation(call, "TestUnsuccessfulMessage", "http://tempuri.org/");

// ======================================================================
// Apply SSL configuration properties and user-set SOAP headers.
// ======================================================================

axiscStubIncludeSecure(stub);
axiscStubApplyUserPreferences(stub);


// ======================================================================
// Invoke web service, send/receive operation. Handle output parameters, if any.
// ======================================================================

if (AXISC_SUCCESS == axiscCallSendAndReceive(call))
{
if(AXISC_SUCCESS == axiscCallValidateMessage(call, "TestUnsuccessfulMessageResponse", "http://tempuri.org/", true_))
{
Ret = axiscCallGetElementAsString(call, "TestUnsuccessfulMessageResult", 0);
}

axiscStubCheckForExtraneousElements(stub);
}
axiscCallUnInitialize(call);
return Ret;
}

我可以在 Debug模式下设置 Web 服务,并且可以在运行调用 COBOL 和 C 模块的程序时看到来自 iSeries 的调用。我还可以看到我正在返回一个简单的字符串值。

当 COBOL 程序试图获取返回值并使用它时,问题就来了。我相信 COBOL 代码的相关位是:

LINKAGE PROCEDURE FOR "TestSuccessfulMessage"
USING ALL DESCRIBED

LINKAGE SECTION.
01 LookupResult PIC X(1000).

CALL PROCEDURE "TestSuccessfulMessage"
USING BY VALUE STUB
RETURNING LookupResult.

以这种方式编码时,我得到了 MCH3601。如果我返回一个指针,然后将地址设置为 LookupResult,我将得到一个空值。

我希望我只是在某处遗漏了一个小细节。我的 COBOL 经验很少。我只是想创建一个引用应用程序作为我们公司内另一个团队的概念证明。任何帮助,或尝试什么的建议,将不胜感激。我可以提供更多代码。

更新:我尝试将 LookupResult 声明移动到工作存储中。虽然这消除了 MCH3601 错误,但我的显示器中出现了一堆垃圾数据。我可以在数据中看到关于我的 iSeries session 的信息片段(即设备 ID 等)。

我还尝试将 LookupResult 留在链接部分并在工作存储中创建一个指针。然后我添加了一个“将 LookupResult 的地址设置为 ResultPointer”。同样,调用结束时没有错误,但是当我显示 LookupResult 时,我得到了垃圾数据。但是,它与直接返回 LookupResult 时返回的数据不同。我可以在该数据中看到一些 SOAP 信封。

最终:我必须进行的所有更改都在 COBOL 代码中。以下是相关部分:

WORKING-STORAGE SECTION.              
01 Endpoint PIC X(100).
01 STUB USAGE POINTER.
01 ResultPointer USAGE POINTER.

LINKAGE SECTION.
01 pszEndpoint PIC X(100).
01 LookupResult PIC X(7).

CALL PROCEDURE "TestSuccessfulMessage"
USING BY VALUE STUB
RETURNING INTO ResultPointer.

SET Address of LookupResult TO ResultPointer.

最佳答案

If I return into a pointer and then set the address to LookupResult, I end up with a null value.

我是 COBOL 人,但不是 iSeries 人。买者自负。

如果 xsdc__string 解析为一个指针,那么您的 COBOL 代码应该有一个 POINTER 类型的变量用于 CALL 的 RETURNING 部分。也许 C 函数实际上返回 NULL,代码当然允许它 - 也许 axiscCallInitialize 没有返回 AXISC_SUCCESS。

至少在 z/OS 上,您可能希望 COBOL 指针变量位于工作存储或本地存储中,然后您将 SET ADDRESS OF LookupResult TO 该指针变量。我假设这不会因为您使用不同的机器架构而改变。

...FWIW

关于c - 如何从 iSeries COBOL 调用 Web 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8568679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com