<activateService> <msisdn>732345512</msisdn> <operation>DEACTIVATE</operation> <service>LTE</service> <params> <param key="key1" value="value1"/> <param key="key2" value="value2"/> <param key="key3" value="value3"/> <param key="key4" value="value4"/> <param key="key5" value="value5"/> </params> </activateService>
Po stronie serwera w metodzie odpowiedzialnej za obsługę żądania widzę że przychodzi coś takiego (var_export):
Kod
stdClass::__set_state(array(\n 'msisdn' => 732345512,\n 'operation' => 'DEACTIVATE',\n 'service' => 'LTE',\n 'params' => \n stdClass::__set_state(array(\n 'param' => \n array (\n 0 => '',\n 1 => '',\n 2 => '',\n 3 => '',\n 4 => '',\n ),\n )),\n))
czyli parametry są puste, bra informacji o przesłanych atrybutach. W jaki sposób mogę odebrać atrybuty?
Odpowiem sobie sam, może kiedyś komuś się przyda. Po godzinach walki okazało się, że nie da się tego prawdopodobnie zrobić w SoapServer. Rozwiązaniem jest złapanie XML zanim zostanie wywołana metoda handle, przetworzenie go przy pomocy np. DOMDocument i przekazanie nowego XML jako parametr metody handle:
$activate_service_method = $dom->getElementsByTagName('activateService'); if ($activate_service_method->length === 1) { $old_params = $dom->getElementsByTagName('param'); for ($i = $old_params->length;--$i >= 0;) { $old_param = $old_params->item($i); $key = $old_param->getAttribute('key'); $value = $old_param->getAttribute('value'); $old_param->parentNode->removeChild($old_param); } $params = $dom->getElementsByTagName('params')->item(0); foreach ($new_params as $new_param) { $param = $dom->createElement('param'); $param_key = $dom->createElement('key'); $param_value = $dom->createElement('value'); $param_key_text = $dom->createTextNode($new_param['key']); $param_value_text = $dom->createTextNode($new_param['value']); $param_key->appendChild($param_key_text); $param->appendChild($param_key); $param_value->appendChild($param_value_text); $param->appendChild($param_value); $params->appendChild($param); } $arguments = $dom->saveXML(); }