Avatar billede nightcoder Nybegynder
15. oktober 2009 - 07:05 Der er 4 kommentarer

xml gennem socket

Har et problem med at parse noget xml til en socket connection. Jeg har oprettet en socket connection til en ekstern service, hvor jeg sender noget xml til, men de returnerer følgende fejl:

<parse_error>
  <error_reason>Invalid xml declaration.
  </error_reason>
  <error_line>2</error_line>
  <error_linepos>3</error_linepos>
  <error_srcText><?xml version="1.0" standalone="no"?></error_srcText>
</parse_error>

Har lurret at linjen de melder fejl på er linje 2, hvilket der tyder på at der må være en tom linje øverst i den xml de modtager fra mig. Er der nogen som har en ide om hvordan man fjerner denne, synes jeg har prøvet alt. Her er mit script:

<?php

  header ("content-type: text/xml");
  function readUrlUsingSocket($xml){
       
    $xml = trim($xml);
      $xml = urlencode($xml);     
      $host = "host";
     
      // Open a connection
      $socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
      if ($socket === false)
        die("socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n");
     
      $result = @socket_connect($socket, $host, 80);
      if ($result === false)
        die("socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n");

      // Send the request
      $request  = "POST /path.asp HTTP/1.0\r\n";
      $request .= "Accept: */*\r\n";
      $request .= "User-Agent: request_socket/1.0\r\n";
      $request .= "Content-type: application/x-www-form-urlencoded\r\n";
      $request .= "Content-length: ".(strlen($xml)+7)."\r\n";
      $request .= "\r\n";
      $request .= "xml_in=".$xml."\r\n";
      $request .= "Connection: close";
      socket_write($socket, $request, strlen($request));
     
      // Retrieving the response
      $response = "";
      while ( ($out = @socket_read($socket, 4096, PHP_BINARY_READ)) != "" )
        $response = $response . $out;
      if ($out===false)
      die(socket_strerror(socket_last_error($socket)));
      socket_close($socket);
     
      // Split the header/body of the response
      $response_r = split("\r\n\r\n", $response, 2);
     
      // Handled the permanent redirection as per http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30
      if (preg_match("/Location: ([^\r\n]+)/i", $response_r[0], $matches ))
        return readUrlUsingSocket($matches[1]);
      else
        return $response_r[1];
}
$xml = '<?xml version="1.0" standalone="no"?>
                <REQUEST>
                    <LOGIN>
                        <USERNAME>brugernavn</USERNAME>
                        <PASSWORD>password</PASSWORD>
                    </LOGIN>
                </REQUEST>';

  echo readUrlUsingSocket($xml);
Avatar billede repox Seniormester
15. oktober 2009 - 08:32 #1
Prøv lige det her istedet:


<?php

$xml = "<?xml version=\"1.0\" standalone=\"no\"  encoding=\"UTF-8\"?>
                <REQUEST>
                    <LOGIN>
                        <USERNAME>brugernavn</USERNAME>
                        <PASSWORD>password</PASSWORD>
                    </LOGIN>
                </REQUEST>";


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://domæne.dk/path.asp");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //kan give ballade med safe_mode=On
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);

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

var_dump($response);


?>


Ovenstående er utestet, så bær over med syntaks fejl - virker selvfølgelig kun hvis du har cURL tilgængelig (men det har de fleste).
Avatar billede nightcoder Nybegynder
15. oktober 2009 - 09:07 #2
Rettede lige til curl_setopt($ch, CURLOPT_POSTFIELDS, "xml_in".$xml); og så gik den igennem. Fik dog følgende fejl:

<parse_error>
<error_reason>A name contained an invalid character.
</error_reason>
<error_line>2</error_line>
<error_linepos>13</error_linepos>
&#8722;
<error_srcText>
<?xmlversion="1.0"standalone="no"encoding="UTF-8"?><PRICEREQUEST><LOGIN><COMPANY>YOURUSERID</COMPANY><PASSWORD>YOURPASSWORD</PASSWORD><APPID>PC</APPID></LOGIN><DATASETS><COUNTRY>1.0</COUNTRY><CURRENCY>1.0</CURRENCY><POSTCODEMASK>1.0</POSTCODEMASK><TOWNGROUP>1.0</TOWNGROUP><SERVICE>1.0</SERVICE><OPTION>1.0</OPTION></DATASETS><PRICECHECK><RATEID>rate1</RATEID><ORIGINCOUNTRY>GB</ORIGINCOUNTRY><ORIGINTOWNNAME></ORIGINTOWNNAME><ORIGINPOSTCODE></ORIGINPOSTCODE><ORIGINTOWNGROUP></ORIGINTOWNGROUP><DESTCOUNTRY>AU</DESTCOUNTRY><DESTTOWNNAME></DESTTOWNNAME><DESTPOSTCODE></DESTPOSTCODE><DESTTOWNGROUP></DESTTOWNGROUP><CONTYPE>D</CONTYPE><CURRENCY>GBP</CURRENCY><WEIGHT>0.2</WEIGHT><VOLUME>0</VOLUME><ACCOUNT></ACCOUNT><ITEMS>1</ITEMS></PRICECHECK></PRICEREQUEST>
</error_srcText>
</parse_error>


Så prøvede jeg at urlencode xml´en, og fik samme fejl som jeg fik med det oprindelige script :-(
Avatar billede repox Seniormester
15. oktober 2009 - 10:06 #3
Du skal ikke urlencode XML'en, det betyder bare at alle dine /, < og > bliver konverteret til en URL sikker streng i stedet.
Der er noget galt i det output du sender afsted. Umiddelbart kan jeg ikke se hvad der er galt.
Har du et link til noget dokumentation hvor den service du forsøger at bruge er beskrevet?
Avatar billede nightcoder Nybegynder
15. oktober 2009 - 10:15 #4
Synes bare der står i doc´en at det skal encodes:

http://tntna.com/ec/TNT_v2_iConnections_Shipping.pdf
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester