Обновление XML с помощью PHP и возврат к набору данных .NET Web Service с SOAP - PullRequest
1 голос
/ 15 июля 2011

Я использую PHP5 и Codeigniter для подключения к веб-сервису .NET через запросы SOAP. У меня проблемы с обновлением этого набора данных. Это мой первый опыт работы с Codeigniter (хотя здесь он мало учитывается), SOAP, классом PHP SimpleXML и веб-сервисами .NET в целом. Например, это обновить профиль пользователя. У меня нет проблем с получением ответов, но я не уверен, как обновить это, основываясь на изменениях пользователя в профиле.

Моя строка из запроса на дамп: (Примечание: меня интересует 0, которое является началом набора данных. 1111 - это имя пользователя, а следующие 1111 - пароль)

11111111 0RandyFloydGM1955-11-05T00: 00: 00-04: 00317787129131789770001910 Проспект Э. МарквудаIndianapolisIN46227falsefalse

Это дает мне ошибку 400 Bad Request. Кажется очевидным, что это происходит из-за пробела между 0 и последним 1. Делая htmlspecialchars (), я вижу, что, похоже, объявление xml не нужно.

<?xml version="1.0"?> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-    msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"><dsEmployee xmlns="http://SHSSrv/dsEmployee.xsd"><Employee diffgr:id="Employee1" msdata:rowOrder="0"><EmplId>0</EmplId><FirstName>Randy</FirstName><LastName>Floyd</LastName><MI>G</MI><Sex>M</Sex><DOB>1955-11-05T00:00:00-04:00</DOB><HomePhoneArea>317</HomePhoneArea><HomePhone>7871291</HomePhone><WorkPhoneArea>317</WorkPhoneArea><WorkPhone>8977000</WorkPhone><Address1>1920 E. Markwood Avenue</Address1><Address2/><City>Indianapolis</City><St>IN</St><ZIP>46227</ZIP><ReceiveNewsLetter>false</ReceiveNewsLetter><PagerArea/><PagerNo/><EmailAddress>randy@test.com</EmailAddress><SpanishContact>false</SpanishContact></Employee></dsEmployee></diffgr:diffgram> 

Взяв исходный ответ и просто отправив его обратно в качестве обновления, работает следующим образом. 111111110RandyFloydGM1955-11-05T00: 00: 00-04: 00317787129131789770001910 E. Markwood AvenueIndianapolisIN46227falsefalse

И с htmlspecialchars () выглядит так (без объявления XML):

<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-    msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"><dsEmployee xmlns="http://SHSSrv/dsEmployee.xsd"><Employee diffgr:id="Employee1" msdata:rowOrder="0"><EmplId>0</EmplId><FirstName>Randy</FirstName><LastName>Floyd</LastName><MI>G</MI><Sex>M</Sex><DOB>1955-11-05T00:00:00-04:00</DOB><HomePhoneArea>317</HomePhoneArea><HomePhone>7871291</HomePhone><WorkPhoneArea>317</WorkPhoneArea><WorkPhone>8977000</WorkPhone><Address1>1920 E. Markwood Avenue</Address1><Address2/><City>Indianapolis</City><St>IN</St><ZIP>46227</ZIP><ReceiveNewsLetter>false</ReceiveNewsLetter><PagerArea/><PagerNo/><EmailAddress>randy@test.com</EmailAddress><SpanishContact>false</SpanishContact></Employee></dsEmployee></diffgr:diffgram>

Вот код:

function employee_update_request()
{

    ini_set( 'soap.wsdl_cache_ttl' , 0 );

    //Get XML from the Employee Profile Request
    $response = $this->employee_profile_request();

    //Turn the string into an object to manipulate
    $dataset = simplexml_load_string($response->any);

    //Manipulate some data from the update form
    $dataset->dsEmployee->Employee->EmailAddress = "randy@test.com";
    $dataset->dsEmployee->Employee->Address1 = "1920 E. Markwood Avenue";
    $any = $dataset->saveXML();

    //Add back the string to the original response object returned from web service         
    $response->any = $any;

    //Get username and password for the params
    $username = $this->session->userdata('username');
    $password = $this->session->userdata('password');                       
    $params = array('sUserId' => $username, 'sPassword' => $password, 'dsEmployee' => $response);

    //SOAP Options
    $options = array(
            'soap_version'=>SOAP_1_1,
            'exceptions'=> 0,
            'trace'=> 1,
        'uri' => "http://www.w3.org/2003/05/soap-envelope"
            );

        //New soap client with options
        $client = new SoapClient('http://localhost/SHSSRV/SHSSrv.asmx?WSDL', $options);
        //Request the employee profile fromt the webservice, passing in credentials

        $update_request = $client->EmployeeUpdateRequest($params);
        $update_response = $update_request->EmployeeUpdateRequestResult;

        return $update_response;

}

Мне действительно нужна помощь, мне нужно выяснить, как лучше всего обновлять эти данные. Могу ли я каким-то образом удалить объявление или мне следует попросить каким-либо образом изменить веб-сервис .NET? У меня нет прямого доступа к этому, но я могу поговорить с разработчиком, если есть лучший способ все вместе.

Спасибо!

1 Ответ

0 голосов
/ 15 июля 2011

Я решил это, сделав это. Хотелось бы узнать, есть ли лучший способ.

$no_xml_doctype = str_replace('<?xml version="1.0"?>' , '' , $any);
$trimmed = trim($no_xml_doctype);   
$response->any = $trimmed;

//Get username and password for the params
$username = rtrim($this->session->userdata('username'));
$password = rtrim($this->session->userdata('password'));                        
$params = array('sUserId' => $username, 'sPassword' => $password, 'dsEmployee' => $response);
...