下面我已经包含了试图与服务器通信的PHP客户端的堆栈跟踪。客户端和服务器都在WSDL文件文件中读取,因此无论如何都是该部分。
正如您在第二个堆栈跟踪数组项中看到的那样,我传入了一个二维数组,但是当SoapServer执行它的__doRequest()
函数时,该数组已被连接成一个无法管理的字符串。关于如何解决这个问题的任何解决方案都将非常感激。
Internal Server ErrorArray
(
[0] => Array
(
[function] => __doRequest
[class] => SoapClient
[type] => ->
[args] => Array
(
[0] =>
1Colby Meiertruetrue5510.517.55601000250020100151502015302000true10false0true23true12false152002020023.51031000.345231003.25520152.45258.52011.255152012
[1] => http://192.168.1.120/test_soap/Client_Billing.php
[2] =>
[3] => 1
[4] => 0
)
)
[1] => Array
(
[file] => /var/www/test_soap/client_avid_new.php
[line] => 92
[function] => __call
[class] => SoapClient
[type] => ->
[args] => Array
(
[0] => CreatePlan
[1] => Array
(
[0] => Array
(
[session-id] => 1
[plan] => Array
(
[name] => Colby Meier
[is-public] => 1
[active] => 1
[country-id] => 5
[setup-fee] => 5
[base-rate] => 10.5
[quarterly-per-month-rate] => 17.5
[bi-annual-per-month-rate] => 56
[annual-per-month-rate] => 0
[blast-limit] => 1000
[social-limit] => 2500
[keyword-limit] => 20
[vote-limit] => 100
[auto-response-limit] => 15
[text-2-screen-limit] => 150
[survey-limit] => 20
[trivia-limit] => 15
[text-2-win-limit] => 30
[mobile-website-limit] => 2000
[enable-ftp] => 1
[ftp-fee] => 10
[enable-contact-manager] =>
[contact-manager-fee] => 0
[enable-mobile-website] => 1
[mobile-website-fee] => 23
[enable-listrak] => 1
[listrak-fee] => 12
[enable-url-qr] =>
[url-qr-fee] => 15
[mt-quota] => 200
[mt-overage] => 20
[mo-quota] => 200
[mo-overage] => 23.5
[keyword-quota] => 10
[keyword-overage] => 3
[mobile-website-quota] => 100
[mobile-website-overage] => 0.3
[keyword-campaign-quota] => 45
[keyword-campaign-overage] => 23
[vote-quota] => 100
[vote-overage] => 3.25
[auto-response-quota] => 5
[auto-response-overage] => 20
[text-2-screen-quota] => 15
[text-2-screen-overage] => 2.45
[survey-quota] => 25
[survey-overage] => 8.5
[trivia-quota] => 20
[trivia-overage] => 11.25
[text-2-win-quota] => 5
[text-2-win-overage] => 15
[social-quota] => 20
[social-overage] => 12
)
)
)
)
)
[2] => Array
(
[file] => /var/www/test_soap/client_avid_new.php
[line] => 92
[function] => CreatePlan
[class] => SoapClient
[type] => ->
[args] => Array
(
[0] => Array
(
[session-id] => 1
[plan] => Array
(
[name] => Colby Meier
[is-public] => 1
[active] => 1
[country-id] => 5
[setup-fee] => 5
[base-rate] => 10.5
[quarterly-per-month-rate] => 17.5
[bi-annual-per-month-rate] => 56
[annual-per-month-rate] => 0
[blast-limit] => 1000
[social-limit] => 2500
[keyword-limit] => 20
[vote-limit] => 100
[auto-response-limit] => 15
[text-2-screen-limit] => 150
[survey-limit] => 20
[trivia-limit] => 15
[text-2-win-limit] => 30
[mobile-website-limit] => 2000
[enable-ftp] => 1
[ftp-fee] => 10
[enable-contact-manager] =>
[contact-manager-fee] => 0
[enable-mobile-website] => 1
[mobile-website-fee] => 23
[enable-listrak] => 1
[listrak-fee] => 12
[enable-url-qr] =>
[url-qr-fee] => 15
[mt-quota] => 200
[mt-overage] => 20
[mo-quota] => 200
[mo-overage] => 23.5
[keyword-quota] => 10
[keyword-overage] => 3
[mobile-website-quota] => 100
[mobile-website-overage] => 0.3
[keyword-campaign-quota] => 45
[keyword-campaign-overage] => 23
[vote-quota] => 100
[vote-overage] => 3.25
[auto-response-quota] => 5
[auto-response-overage] => 20
[text-2-screen-quota] => 15
[text-2-screen-overage] => 2.45
[survey-quota] => 25
[survey-overage] => 8.5
[trivia-quota] => 20
[trivia-overage] => 11.25
[text-2-win-quota] => 5
[text-2-win-overage] => 15
[social-quota] => 20
[social-overage] => 12
)
)
)
)
)
以下是我通过以下方式调用客户端的代码:
$test = $client->CreatePlan(array("session-id"=>"1", "plan"=>$pa)); //$pa variable shown in stack trace
以下是服务器上的相关代码:
public function _checkArguments($arguments, $validParameters) {
$variables = "";
foreach ($arguments as $arg) {
$type = gettype($arg);
echo "type is ".$type;
if ($type == "object") {
$type = get_class($arg);
}
$variables .= "(".$type.")";
}
if (!in_array($variables, $validParameters)) {
throw new Exception("Invalid parameter types: ".str_replace(")(", ", ", $variables));
}
return true;
}
/**
* Service Call: CreatePlan
* Parameter options:
* (CreatePlan) parameters
* @param mixed,... See function description for parameter options
* @return CreatePlanResponse
* @throws Exception invalid function signature messages
*/
public function CreatePlan($mixed = null) {
$validParameters = array(
"(CreatePlan)",
);
$args = func_get_args();
echo "<pre>Args are: ".print_r($args)."</pre>";
$this->_checkArguments($args, $validParameters);
return $this->__soapCall("CreatePlan", $args);
}
正如您所期望的那样,func_get_args()
上的功能失败了。在过去的几天里,这让我完全疯了,所以任何建议都会非常感激。
编辑:当我说func_get_args
失败时,我的意思是我得到一个null变量返回。因此,对于$args = func_get_args()
,$args
为空。
编辑2 :如果它有助于解决我的问题,这是Apache服务器日志中的错误。
[error] [client 192.168.1.120] PHP Fatal error: Uncaught exception 'Exception' with message 'Invalid parameter types: (stdClass)' in /var/www/test_soap/Client_Billing.php:2200\nStack trace:\n#0 /var/www/test_soap/Client_Billing.php(2220): Client_Billing->_checkArguments(Array, Array)\n#1 [internal function]: Client_Billing->CreatePlan(Object(stdClass))\n#2 /var/www/test_soap/Client_Billing.php(2642): SoapServer->handle()\n#3 {main}\n thrown in /var/www/test_soap/Client_Billing.php on line 2200
编辑3 :根据请求,这是相关类型的WSDL代码段。
<complexType name="CreatePlanType"><!-- ns__CreatePlanType -->
<sequence>
<element name="name" type="xsd:string" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::name -->
<element name="is-public" type="xsd:boolean" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::is_public -->
<element name="active" type="xsd:boolean" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::active -->
<element name="country-id" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::country_id -->
<element name="setup-fee" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::setup_fee -->
<element name="base-rate" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::base_rate -->
<element name="quarterly-per-month-rate" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::quarterly_per_month_rate -->
<element name="bi-annual-per-month-rate" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::bi_annual_per_month_rate -->
<element name="annual-per-month-rate" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::annual_per_month_rate -->
<element name="blast-limit" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::blast_limit -->
<element name="social-limit" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::social_limit -->
<element name="keyword-limit" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::keyword_limit -->
<element name="vote-limit" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::vote_limit -->
<element name="auto-response-limit" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::auto_response_limit -->
<element name="text-2-screen-limit" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::text_2_screen_limit -->
<element name="survey-limit" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::survey_limit -->
<element name="trivia-limit" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::trivia_limit -->
<element name="text-2-win-limit" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::text_2_win_limit -->
<element name="mobile-website-limit" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::mobile_website_limit -->
<element name="enable-ftp" type="xsd:boolean" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::enable_ftp -->
<element name="ftp-fee" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::ftp_fee -->
<element name="enable-contact-manager" type="xsd:boolean" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::enable_contact_manager -->
<element name="contact-manager-fee" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::contact_manager_fee -->
<element name="enable-mobile-website" type="xsd:boolean" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::enable_mobile_website -->
<element name="mobile-website-fee" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::mobile_website_fee -->
<element name="enable-listrak" type="xsd:boolean" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::enable_listrak -->
<element name="listrak-fee" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::listrak_fee -->
<element name="enable-url-qr" type="xsd:boolean" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::enable_url_qr -->
<element name="url-qr-fee" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::url_qr_fee -->
<element name="mt-quota" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::mt_quota -->
<element name="mt-overage" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::mt_overage -->
<element name="mo-quota" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::mo_quota -->
<element name="mo-overage" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::mo_overage -->
<element name="keyword-quota" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::keyword_quota -->
<element name="keyword-overage" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::keyword_overage -->
<element name="mobile-website-quota" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::mobile_website_quota -->
<element name="mobile-website-overage" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::mobile_website_overage -->
<element name="keyword-campaign-quota" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::keyword_campaign_quota -->
<element name="keyword-campaign-overage" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::keyword_campaign_overage -->
<element name="vote-quota" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::vote_quota -->
<element name="vote-overage" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::vote_overage -->
<element name="auto-response-quota" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::auto_response_quota -->
<element name="auto-response-overage" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::auto_response_overage -->
<element name="text-2-screen-quota" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::text_2_screen_quota -->
<element name="text-2-screen-overage" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::text_2_screen_overage -->
<element name="survey-quota" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::survey_quota -->
<element name="survey-overage" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::survey_overage -->
<element name="trivia-quota" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::trivia_quota -->
<element name="trivia-overage" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::trivia_overage -->
<element name="text-2-win-quota" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::text_2_win_quota -->
<element name="text-2-win-overage" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::text_2_win_overage -->
<element name="social-quota" type="xsd:int" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::social_quota -->
<element name="social-overage" type="xsd:float" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlanType::social_overage -->
</sequence>
</complexType>
<element name="CreatePlan">
<complexType>
<sequence>
<element name="session-id" type="xsd:string" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlan::session_id -->
<element name="plan" type="ns:CreatePlanType" minOccurs="1" maxOccurs="1"/><!-- ns__CreatePlan::plan -->
</sequence>
</complexType>
</element>
运行soap服务器的代码:
$server = new SoapServer("http://192.168.1.120/Client_Billing.wsdl");
$server->setClass("Client_Billing");
$server->handle();
答案 0 :(得分:1)
您是否正在使用var_dump()
并在浏览器中查看输出?可能是浏览器隐藏了实际存在的XML标签!尝试&#34;查看来源&#34;在页面上。
答案 1 :(得分:0)
我认为它抓住了PHP SoapServer中动态对象的特殊支持。如果可以,尝试用所描述的类替换数组。
答案 2 :(得分:0)
经过多次使用soap和PHP的问题我使用以下方法进行调试: 首先尝试回应你的回应:
echo htmlentities(var_dump($test,true));
如果没有继续这一步: 找到soap错误的最好方法是使用sniffer和soapUI进入安装soap UI,然后 创建第一个项目非常简单: http://www.soapui.org/Getting-Started/your-first-soapui-project.html
安装数据包嗅探器
创建项目并输入WSDL后,您可以调用soap服务方法,当您调用这些方法时,您必须手动输入参数。输入它们并运行该函数,如果它运行正常,则意味着PHP端的某处存在一些错误,或者它隐藏在HTML注释中。 为了更好地理解你必须使用嗅探器捕获你从soap服务获得的响应,运行嗅探器的错误。 然后你必须分析你得到的输出。
答案 3 :(得分:0)
根据我的经验,在PHP中调试webservices是一件痛苦的事情......但如果可以,我会尝试给你一些帮助。
您使用的WSDLInterpreter是什么?在创建客户端时,您开发的某些第三方类或某些包装器是为了做一些额外的事情吗?您有没有理由不使用SoapClient?
您是否尝试使用您正在使用的类的对象的实际实例并在WSDL中提及来替换您发送的数组?
答案 4 :(得分:0)
所以如果有人仍然关注这个帖子。我发现问题是什么,我希望我能说我不是一个完全白痴因为没有看到它,但我不习惯撒谎。
整个问题源于我的“服务器”类正在扩展我的“客户端”类,并在soap调用本身内递归调用__soapCall()
。