Soap-Client/Server "Ungültiger parameter (stdClass)"
Unten habe ich noch einen stack-trace von meinem PHP-Client, der versucht zu reden mit dem server. Client und server beide Lesen in der WSDL-Datei, so dass ein Teil, wenn nicht besorgniserregend.
Wie Sie sehen können, durch den zweiten stack-trace array-Element, ich bin vorbei in ein zwei-dimensionales array, aber wenn der SoapServer tut es __doRequest()
- Funktion, das array wurde verkettet in eine einzige, unüberschaubare string. Jede Lösung, wie dieses Problem zu beheben würde sehr geschätzt werden.
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
)
)
)
)
)
Hier ist der code, den ich rufen Sie den client mit:
$test = $client->CreatePlan(array("session-id"=>"1", "plan"=>$pa)); //$pa variable shown in stack trace
und hier ist der entsprechende code auf dem server:
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);
}
Als man erwarten würde, die Funktion schlägt fehl, auf der func_get_args()
. Diese wurde driving me völlig verrückt für die letzten paar Tage, so dass jede Beratung würde sehr geschätzt werden.
BEARBEITEN: Wenn ich sage, es scheitert an der func_get_args
ich meine, dass ich eine null-variable zurück. So im Fall der $args = func_get_args()
, $args
null ist.
EDIT 2: falls es hilft, mein Problem ist gelöst, hier ist die Fehlermeldung vom Apache-server-logs.
[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
EDIT 3: Wie pro Antrag, hier ist die WSDL-Ausschnitt des betreffenden Arten.
<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>
Den Code zum ausführen der soap-server:
$server = new SoapServer("http://192.168.1.120/Client_Billing.wsdl");
$server->setClass("Client_Billing");
$server->handle();
- Müssen die WSDL-um die Frage zu beantworten. Und der code zum erstellen der SOAP-server
- In der post heute. Danke. Gemäß der soap-server habe ich die WSDLInterpreter-Klasse zum generieren der WSDL-Datei.
$myWSDLlocation = 'http://192.168.1.120/Client_Billing.wsdl'; //where the file lives
$wsdlInterpreter = new WSDLInterpreter($myWSDLlocation); //Load interpreter class
$wsdlInterpreter->savePHP('/var/www/test_soap/'); //output PHP file location (directory only)
- Können wir sehen, die "unüberschaubar " string"? Ich vermute, es ist eine serialisierte version des 2D-array.
- Die 'unüberschaubare string' wird im ersten stack-trace-Element args[0].
- Ich Stimme mit Ihren Gebrauch von "unhandlich"..!
- Die WSDLInterpreter Klasse hast du verwendet? Bitte machen Sie es mehr Prominente in Ihrer Frage, dass Sie mit einem anderen tool (und wo Sie ihn erworben haben).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie mit
var_dump()
und betrachten Sie die Ausgabe in Ihrem browser? Es könnte sein, dass der browser versteckt sich die XML-tags, die sind tatsächlich da! Versuchen Sie "View Source" auf die Seite.Ich denke, es fing für Besonderheit die Unterstützung von dynamischen Objekten in PHP SoapServer. Wenn Sie können, versuchen zu ersetzen-array mit den beschrieben Klassen.
Nach vielen Male, die ich hatte Probleme mit soap und PHP verwende ich folgende Methode zum Debuggen:
versuchen Sie zuerst auf Ihr echo antwortet:
Wenn dort nichts weiter zu diesem Schritt:
Der beste Weg zu finden, soap-Fehler wird mit sniffer und soapUI gehen in installieren, soap-UI, dann
erstellen Sie erste Projekt ist sehr einfach:
http://www.soapui.org/Getting-Started/your-first-soapui-project.html
installieren Pakete sniffer
sobald Sie Ihr Projekt, und geben Sie Ihre WSDL-Sie werden in der Lage Aufruf der soap-service-Methoden , wenn Sie diese Methoden aufrufen geben Sie die Parameter manuell ein. geben Sie diese und führen Sie die Funktion, wenn es läuft OK, es bedeutet, dass irgendwo auf der PHP-Seite gibt es einige Fehler, oder Ihr versteckt in HTML-Kommentar.
um besser zu verstehen, wo der Fehler ist, müssen Sie den sniffer fangen die antwortet, Sie habe von der soap-Dienst, führen Sie den sniffer.
Dann müssen Sie die Ausgabe analysieren, die Sie erhalten.
Meiner Erfahrung, Debuggen von webservices in PHP ist ein Schmerz...Aber ich werde versuchen, Ihnen etwas Hilfe, wenn ich kann.
Was ist das WSDLInterpreter Sie verwenden? Ist, dass einige Dritte Klasse oder einige wrapper, die Sie entwickelt haben, nur um zu tun, einige zusätzliche Dinge, wenn Sie beim erstellen der client? Gibt es irgendeinen Grund, warum Sie nicht mit SoapClient?
Haben Sie versucht, diese zu ersetzen-arrays, die Sie senden mit den tatsächlichen Instanzen von Objekten der Klassen, die Sie verwenden, und Sie erwähnt in der WSDL?
Also falls jemand noch nach diesem thread. Ich fand heraus, was das Problem war, und ich wünschte, ich könnte sagen, ich bin nicht ein kompletter idiot für nicht sehen, aber ich glaube nicht, neigen dazu, um eine Gewohnheit zu Lügen.
Das ganze Problem ergab sich aus der Tatsache, dass mein "server" - Klasse, war sich mein "client" - Klasse, und den rekursiven Aufruf der
__soapCall()
innerhalb der soap-Aufruf selbst.