- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
好吧,这个问题让我难以自拔。我尝试使用 PHP 和 SOAP 连接到 Web 服务时未成功。我不知道出了什么问题,而且这是一项全新的服务,他们的“文档”很差。所以我不知道问题是否真的出在他们头上,但我没有足够的 SOAP 经验来确定这一点。我祈祷有人能帮助我。
我已经能够通过将 XML 直接放入 SOAP UI 来连接到该服务,但是每当我尝试使用 SoapClient 时它就会崩溃。我要发送的 XML 结构看起来像
<Envelope xmlns:ns1="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://a.uri" xmlns:ns3="http://tempuri.org/">
<Body>
<GetAuthorization>
<ns1:registrationObj ns1:type="ns2:RegistrationAuthorization">
<ns2:Company>####</ns2:Company>
<ns2:Computer>####</ns2:Computer>
<ns2:Facility>####</ns2:Facility>
</ns1:registrationObj>
</GetAuthorization>
</Body>
</Envelope>
我尝试过的方法太多了,无法一一列举。使用 __soapCall、$client->method()、SoapVar 和 SoapParam。总的来说,我发现 PHP 的 SoapClient 的文档有点稀疏。但我什至无法获得与我想要的匹配的调用结构(通过 __getLastRequest() 转储)
我注意到的一件事是客户端不断删除我的数组的第一个元素(在我尝试将参数作为普通数组传递的那些实例上。所以:
$params = array("Company" => "abc",
"Computer" => "def",
"Facility" => "ghi");
$result = $soap_client->__soapCall('GetAuthorization',$params);
返回
<env:Body>
<ns1:GetAuthorization/>
<param1>def</param1>
<param2>ghi</param2>
</env:Body>
请注意在这种情况下 GetAuthorization 如何自行关闭并丢弃第一个数组元素。我也分别经历过这两种情况(值得注意的是,我也已经正确命名了参数。我经历了太多次迭代,我不记得是什么尝试产生了哪些结果。尽管如此,SOAP 的表现并不像我希望如此。它无法正确封装数据和/或丢弃随机元素。
$parameters =
array("ra" => new SoapVar(array(
"CompanyId" => new SoapVar("####", SOAP_ENC_OBJECT, 'guid', 'http://schemas.microsoft.com/2003/10/Serialization/', 'CompanyId', 'http://schemas.datacontract.org/x/y/z.xx'),
"ComputerId" => new SoapVar("{####}", SOAP_ENC_OBJECT, 'string', 'http://www.w3.org/2001/XMLSchema', 'ComputerId', 'http://schemas.datacontract.org/x/y/z.xx'),
"FacilityId" => new SoapVar("####", SOAP_ENC_OBJECT, 'guid', 'http://schemas.microsoft.com/2003/10/Serialization/', 'FacilityId', 'http://schemas.datacontract.org/x/y/z.xx')
), SOAP_ENC_OBJECT, 'RegistrationAuthorization', 'http://schemas.datacontract.org/x/y/z.xx', 'ra', "http://schemas.datacontract.org/x/y/z.xx"
)));
$result = $auth_client->GetAuthorization($parameters);
是我最初试图插入的结构(在我简化它以试图找出问题所在之前),我想因为我需要对参数的命名空间进行如此多的控制,所以我需要这样做。但是,这只是使用自封闭元素发出请求。
有人能告诉我如何构造调用以产生适当的 XML 结构吗?这可能是在服务端,而 WSDL 有问题吗? (我不确定 WSDL 在后端负责什么。)
对于这个问题的含糊不清,我深表歉意,但我感到很迷茫,我什至不确定该问哪个问题。 :-(
最佳答案
它应该可以工作:
<?php
$client = new \SoapClient(null, array(
'uri' => 'http://localhost/stack/21150482/',
'location' => 'http://localhost/stack/21150482/server.php',
'trace' => true
));
try {
$company = new \SoapVar('XXXXX', XSD_STRING, null, null, 'Company', 'http://a.uri');
$computer = new \SoapVar('XXXXX', XSD_STRING, null, null, 'Computer', 'http://a.uri');
$facility = new \SoapVar('XXXXX', XSD_STRING, null, null, 'Facility', 'http://a.uri');
$registrationObj = new \SoapVar(
array($company,$computer,$facility),
SOAP_ENC_OBJECT,
'RegistrationAuthorization',
'http://a.uri',
'registrationObj',
'http://www.w3.org/2001/XMLSchema-instance'
);
$client->GetAuthorization($registrationObj);
} catch (\Exception $e) {
var_dump($e->getMessage());
}
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($client->__getLastRequest());
print '<pre>';
print htmlspecialchars($dom->saveXML());
我的结果是:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://localhost/stack/21150482/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://a.uri" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:GetAuthorization>
<xsi:registrationObj xsi:type="ns2:RegistrationAuthorization">
<ns2:Company xsi:type="xsd:string">XXXXX</ns2:Company>
<ns2:Computer xsi:type="xsd:string">XXXXX</ns2:Computer>
<ns2:Facility xsi:type="xsd:string">XXXXX</ns2:Facility>
</xsi:registrationObj>
</ns1:GetAuthorization>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
关于php - 如何构造复杂的嵌套 SOAP 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21150482/
谁能解释一下原因: (define a (lambda() (cons a #f))) (car (a)) ==> procedure ((car (a))) ==> (procedure . #f)
这是 PyBrain 网站的摘录。我了解大部分正在发生的事情,但是一行让我完全难住了。我以前从未在 python 代码中看到过这样的东西。这是整个循环,对于上下文: for c in [0,
我是gradle / groovy的新手。我想创建将做一些事情的自定义任务。我的第一个问题是任务完成时该如何做?我可以覆盖doFirst / doLast闭包吗?也许我可以重写某些在开始和结束时都会执
我刚刚开始评估 MS 企业库。他们使用以下指令来获取实例: var customerDb = EnterpriseLibraryContainer.Current.GetInstance("C
这是我的 if else Ansible 逻辑.. - name: Check certs exist stat: path=/etc/letsencrypt/live/{{ rootDomain
我正在使用construct 2.8 对一些失传已久的 Pascal 程序创建的一些文件的 header 进行逆向工程。 header 由许多不同的记录组成,其中一些是可选的,我不确定顺序是否固定。
我在将 getchar() 的输入放入 char *arr[] 数组时遇到问题。我这样做的原因是因为输入数据(将是一个带有命令行参数的文件)将存储在一个 char 指针数组中以传递给 execvp 函
通常我们不能约束类型参数 T派生自密封类型(例如 struct 类型)。这将毫无意义,因为只有一种类型适合,因此不需要泛型。所以约束如下: where T : string 或: where T :
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
#include using namespace std; class A { private: int m_i; friend int main(int argc, char cons
这个问题在这里已经有了答案: Are there legitimate uses for JavaScript's "with" statement? (33 个答案) 关闭 9 年前。 我有这个代
在this answer我看到了下一个 Bash 结构。 yes "$(< file.txt)" 什么意思 "$(< file.txt)" ? 我明白了 命令替换 - $(command)用命令的结
if (a == 1) //do something else if (a == 2) //do something else if (a == 3) //do somethi
关于构造的快速简单的问题。 我有以下用于将项目添加到 ListView 的代码。 ListViewItem item = new ListViewItem(); item.Text = file; i
我想使用 std::vector 来控制给定的内存。首先,我很确定这不是好的做法,但好奇心占了上风,无论如何我都想知道如何做到这一点。 我遇到的问题是这样的方法: vector getRow(unsi
下面显示了一段简单的javascript: var mystring = ("random","ignored","text","h") + ("ello world") 这个字符串会生成 hello
在 Java 中,创建对象的标准方法是使用 MyClass name = new MyClass(); 我也经常看到构造 new MyClass() { /*stuff goes in here*/
我正在编写 C++ ndarray 类。我需要动态大小和编译时大小已知的数组(分别分配自由存储和分配堆栈)。我想支持从嵌套的 std::initializer_list 进行初始化。 动态大小的没问题
我正在将一个项目从 Visual Studio 2005 转换为 Visual Studio 2008,并提出了上述结构。 using Castle.Core.Resource; using Cast
我想知道我在这里的想法是否正确,我主要针对接口(interface)进行编程,所以我想知道下面的类是否应该通过 DI 注入(inject),或者我应该自己实例化一个类... 注意:这些服务保存在我的核
我是一名优秀的程序员,十分优秀!