Отправить XML с php через сообщение


Answers

Во-первых, если ваш код написан так, я сомневаюсь, что это может быть причиной кавычек ... Вы должны использовать двойную цитату вокруг вашего xml:

$my_xml = "<?xml version='1.0' standalone='yes'?>
           <user> 
               <Name>xmltest@freightquote.com</Name> 
               <Password>XML</Password> 
           </user>";

Кроме того, вы можете использовать плакат , аддон firefox (возможно, эквивалент на хроме), чтобы помочь вам с вашими запросами, особенно если вы используете WebServices. Таким образом, вы сможете увидеть, является ли ошибка серверной или клиентской стороной.

Это должно помочь вам отладить.

Question

Я знаю, что на SO есть какое-то количество подобных вопросов, но я попытался объединиться со всеми решениями и, похоже, не смог заставить его работать. Я пытаюсь отправить xml прямо в веб-службу и получить ответ. Технически я пытаюсь подключиться к фреймворку, документации, для которой вы можете найти в правом верхнем углу этой страницы в документации. Я только упоминаю об этом, потому что я много знаю, что термин SOAP очень много в их xml, и это может иметь значение. Во всяком случае, я хочу, чтобы отправить xml на какой-то URL-адрес и получить ответ.

Поэтому, если бы у меня было следующее

$xml = "<?xml version='1.0' encoding='utf-8'?>
            <soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/' 
            xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' 
            xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
            <soap:Body>
              <GetRatingEngineQuote xmlns='http://tempuri.org/'>
                <request>
                  <CustomerId>0</CustomerId> <!-- Identifier for customer provided by Freightquote -->
                  <QuoteType>B2B</QuoteType> <!-- B2B / eBay /Freightview -->
                  <ServiceType>LTL</ServiceType> <!--  LTL / Truckload / Groupage / Haulage / Al  -->
                  <QuoteShipment>
                    <IsBlind>false</IsBlind>
                    <PickupDate>2010-09-13T00:00:00</PickupDate>
                    <SortAndSegregate>false</SortAndSegregate>
                    <ShipmentLocations>
                      <Location>
                        <LocationType>Origin</LocationType>
                        <RequiresArrivalNotification>false</RequiresArrivalNotification>
                        <HasDeliveryAppointment>false</HasDeliveryAppointment>
                        <IsLimitedAccess>false</IsLimitedAccess>
                        <HasLoadingDock>false</HasLoadingDock>
                        <IsConstructionSite>false</IsConstructionSite>
                        <RequiresInsideDelivery>false</RequiresInsideDelivery>
                        <IsTradeShow>false</IsTradeShow>
                        <IsResidential>false</IsResidential>
                        <RequiresLiftgate>false</RequiresLiftgate>
                        <LocationAddress>
                          <PostalCode>30303</PostalCode>
                          <CountryCode>US</CountryCode>
                        </LocationAddress>
                        <AdditionalServices />
                      </Location>
                      <Location>
                        <LocationType>Destination</LocationType>
                        <RequiresArrivalNotification>false</RequiresArrivalNotification>
                        <HasDeliveryAppointment>false</HasDeliveryAppointment>
                        <IsLimitedAccess>false</IsLimitedAccess>
                        <HasLoadingDock>false</HasLoadingDock>
                        <IsConstructionSite>false</IsConstructionSite>
                        <RequiresInsideDelivery>false</RequiresInsideDelivery>
                        <IsTradeShow>false</IsTradeShow>
                        <IsResidential>false</IsResidential>
                        <RequiresLiftgate>false</RequiresLiftgate>
                        <LocationAddress>
                          <PostalCode>60606</PostalCode>
                          <CountryCode>US</CountryCode>
                        </LocationAddress>
                        <AdditionalServices />
                      </Location>
                    </ShipmentLocations>
                    <ShipmentProducts>
                      <Product>
                        <Class>55</Class>
                        <Weight>1200</Weight>
                        <Length>0</Length>
                        <Width>0</Width>
                        <Height>0</Height>
                        <ProductDescription>Books</ProductDescription>
                        <PackageType>Pallets_48x48</PackageType>
                        <IsStackable>false</IsStackable>
                        <DeclaredValue>0</DeclaredValue>
                        <CommodityType>GeneralMerchandise</CommodityType>
                        <ContentType>NewCommercialGoods</ContentType>
                        <IsHazardousMaterial>false</IsHazardousMaterial>
                        <PieceCount>5</PieceCount>
                        <ItemNumber>0</ItemNumber>
                      </Product>
                    </ShipmentProducts>
                    <ShipmentContacts />
                  </QuoteShipment>
                </request>
                <user>
                  <Name>someone@something.com</Name>
                  <Password>password</Password>
                </user>
              </GetRatingEngineQuote>
            </soap:Body>
            </soap:Envelope>";

(Я отредактировал это, чтобы содержать мой фактический xml, поскольку он может предоставить некоторую перспективу

Я хочу отправить его на сайт http://www.someexample.com и получить ответ. Кроме того, мне нужно его кодировать? Я много раз отправлял xml туда и обратно с Android, и мне никогда не приходилось это делать, но это могло быть частью моей проблемы.

Моя попытка отправить информацию в настоящее время выглядит следующим образом:

$xml_post_string = 'XML='.urlencode($xml->asXML());  
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'https://b2b.Freightquote.com/WebService/QuoteService.asmx');
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_post_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($ch);
curl_close($ch);



Вы можете использовать stream_context_create и file_get_contents для отправки xml в сообщении.

$xml = "<your_xml_string>";
$send_context = stream_context_create(array(
    'http' => array(
    'method' => 'POST',
    'header' => 'Content-Type: application/xml',
    'content' => $xml
    )
));

print file_get_contents($url, false, $send_context);