Mam żądanie wyglądające tak:

  1. <activateService>
  2. <msisdn>732345512</msisdn>
  3. <operation>DEACTIVATE</operation>
  4. <service>LTE</service>
  5. <params>
  6. <param key="key1" value="value1"/>
  7. <param key="key2" value="value2"/>
  8. <param key="key3" value="value3"/>
  9. <param key="key4" value="value4"/>
  10. <param key="key5" value="value5"/>
  11. </params>
  12. </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:

  1. $dom = DOMDocument::loadXML(file_get_contents('php://input'));
  2.  
  3. $activate_service_method = $dom->getElementsByTagName('activateService');
  4.  
  5. if ($activate_service_method->length === 1) {
  6. $old_params = $dom->getElementsByTagName('param');
  7. $new_params = array();
  8. for ($i = $old_params->length;--$i >= 0;) {
  9. $old_param = $old_params->item($i);
  10. $key = $old_param->getAttribute('key');
  11. $value = $old_param->getAttribute('value');
  12. $new_params[] = array('key' => $key, 'value' => $value);
  13. $old_param->parentNode->removeChild($old_param);
  14. }
  15. $params = $dom->getElementsByTagName('params')->item(0);
  16. foreach ($new_params as $new_param) {
  17. $param = $dom->createElement('param');
  18. $param_key = $dom->createElement('key');
  19. $param_value = $dom->createElement('value');
  20. $param_key_text = $dom->createTextNode($new_param['key']);
  21. $param_value_text = $dom->createTextNode($new_param['value']);
  22. $param_key->appendChild($param_key_text);
  23. $param->appendChild($param_key);
  24. $param_value->appendChild($param_value_text);
  25. $param->appendChild($param_value);
  26. $params->appendChild($param);
  27. }
  28.  
  29. $arguments = $dom->saveXML();
  30. }