webForumDet fria alternativet

POST XML

7 svar · 391 visningar · startad av eureca

eurecaMedlem sedan sep. 20002 921 inlägg
#1

Om man ska skicka(POST) iväg ett xml-dokument från en server till en annan (genom att använda PHP alltså)... hur fördjupar man sig i detta ämne på ett enkelt sätt så man förstår hur man ska göra?

eurecaMedlem sedan sep. 20002 921 inlägg
#2

How to post XML-data

Länken ovan verkar vara exakt det jag är ute efter. Dock känner jag mig helt virrig o stressad av att läsa koden.

Var i koden skriver jag Url:en till sidan som ska ta emot xml-datan jag skickar? antar att det ska skrivas i nån av dom nedanstående?

var $path = "/"; 
var $agent_name = "MyAgent";

och hur skriver jag xml-datan i detta skript?

Jag vet att jag borde fördjupa mig i ämnet, men det är lite bråttom för mig o testa om jag ska använda mig av denna "teknik" eller inte

SPiNMedlem sedan mars 20007 896 inlägg
#3

Hm, jag orkar inte läsa artikeln - men jag kan ge dig ett litet sample som skickar med POST:

<?php
$xml = implode( '', file( "MyXML.xml" ) );

$remoteServer = "www.server.com";
$remotePort = 80;
$remotePage = "/page.php";

// Öppna en koppling mot servern
$socketPointer = fsockopen( $remoteServer, $remotePort, $errorNumber, $errorString, 25 );
if( !$socketPointer ) {
     $errorMessage = "Felnummer: " . $errorNumber . "<br />";
     $errorMessage .= "Fel: " . $errorString;

     die( $errorMessage );
}

// Skicka data till angiven sida
fputs( $socketPointer, "POST " . $remotePage . " HTTP/1.1\n" );
fputs( $socketPointer, "Host: " . $remoteServer . "\n" );
fputs( $socketPointer, "Content-Type: application/x-www-form-urlencoded\n" );
fputs( $socketPointer, "Content-Length: " . strlen( $xml ) . "\n\n" );
fputs( $socketPointer, "xml=" . rawurlencode( $xml ) );

// Ta emot resultatet
$remoteResult = "";
while( !feof( $socketPointer ) )
     $remoteResult .= fgets( $socketPointer, 128 );

fclose( $socketPointer );

echo $remoteResult;
?>
eurecaMedlem sedan sep. 20002 921 inlägg
#4

Tack spin! ska sätta tänderna i det så snart som möjligt.

Är detta föresten det som går under benämningen "webservices"? (dvs att skicka xml-data fram o tillbaka mellan servrarna)

SPiNMedlem sedan mars 20007 896 inlägg
#5

Tja, på sätt och viss åtminstone. Webservices är ju till för att man enkelt ska kunna ta emot dynamisk information från en sida. Din sida som du anropar via scriptet ( Alltså inte PHP-dokumentet som körs ) kan vara en webservice, beroende på hur den hanterar XML:en som du skickar. Ett exempel:
WebService.php

<?php
if( !isset( $_POST[ 'xml' ] ) ) {
     $errorMessage = "Your query did not contain valid data";
     die( $errorMessage );
}

$strXML = rawurldecode( $_POST[ 'xml' ] );

// Processa din XML och hämta relaterad data från t.ex. en DBMS
// Proppa in resultatet som ska skickas tillbaka, till variabeln $xmlResult

// Returnera resultatet:
echo $xmlResult;
?>

ServiceConnect.php

<?php
if( !isset( $_GET[ 'type' ] ) ) {
     $errorMessage = "What are you looking for?";
     die( $errorMessage );
}

$xml = "<" . "?" . "xml version=\"1.0\" encoding=\"ISO-8859-1\"" . "?". ">\n";
$xml .= "<rotElement>\n";
$xml .= "<element>";
$xml .= "<typ>" . $_GET[ 'type' ] . "</typ>";
$xml .= "</element>\n";
$xml .= "</rotElement>";

$remoteServer = "www.server.com";
$remotePort = 80;
$remotePage = "/XmlService.php";

// Öppna en koppling mot servern
$socketPointer = fsockopen( $remoteServer, $remotePort, $errorNumber, $errorString, 25 );
if( !$socketPointer ) {
     $errorMessage = "Felnummer: " . $errorNumber . "<br />";
     $errorMessage .= "Fel: " . $errorString;

     die( $errorMessage );
}

// Skicka data till angiven sida
fputs( $socketPointer, "POST " . $remotePage . " HTTP/1.1\n" );
fputs( $socketPointer, "Host: " . $remoteServer . "\n" );
fputs( $socketPointer, "Content-Type: application/x-www-form-urlencoded\n" );
fputs( $socketPointer, "Content-Length: " . strlen( $xml ) . "\n\n" );
fputs( $socketPointer, "xml=" . rawurlencode( $xml ) );

// Ta emot resultatet
$remoteResult = "";
while( !feof( $socketPointer ) )
     $remoteResult .= fgets( $socketPointer, 128 );

fclose( $socketPointer );

echo "Resultat från XmlService.php:<br />" . $remoteResult;
SPiNMedlem sedan mars 20007 896 inlägg
#6

Du kan också optimera min kod, så att den blir snabbare, genom att inte dela upp sändingen ( med fputs() ) som jag har gjort. Det är däremot lättare att läsa och förstå om den är uppdelad. Samma sak med konkateringen av strängarna till varaiabeln $xml.

eurecaMedlem sedan sep. 20002 921 inlägg
#7

Nu har jag testat och köra med din första kod du gav mig. När jag skickar till den mottagare jag vill skicka till så får jag dock upp felmedelandet:

"Felnummer: 9
Fel: Bad file descriptor"

Var kan man läsa mer om felnummer och vad dom innebär?
Vet inte om det är något fel i mitt skript eller om det är mottagaren som inte gillar det jag skickar bara.

SPiNMedlem sedan mars 20007 896 inlägg
#8

Testa min andra kod, jag hade hittat fel i min första innan jag redigerade, kanske hade du fått den. ;)

Felet har jag ingen aning om vad det är, men det kan vara sättet du anropar servern på. Hur ser strängen $remoteServer ut?

132 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)