Avatar billede specialty Nybegynder
27. januar 2006 - 16:37 Der er 8 kommentarer

XML Post

Hej,

Jeg har brug for at lave en alm. HTTP POST med noget XML data til en webservice.

Hvordan gør jeg dette?

Det er følgende information jeg skal poste:

<?xml version=""1.0"" encoding=""ISO-8859-1""?>
<gateway>
  <sid id="0">
    <command> -send -to -email test@test.dk</command>
  </sid>
</gateway>

Hvordan får jeg postet dette med en HTTP POST?
Avatar billede jakobdo Ekspert
27. januar 2006 - 18:38 #1
Du kan bruge noget i denne stil:

<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
  echo "$errstr ($errno)<br />\n";
} else {
  $out = "GET / HTTP/1.1\r\n";
  $out .= "Host: www.example.com\r\n";
  $out .= "Connection: Close\r\n\r\n";

  fwrite($fp, $out);
  while (!feof($fp)) {
      echo fgets($fp, 128);
  }
  fclose($fp);
}
?>

Den skal så rettes fra GET til POST!
Avatar billede specialty Nybegynder
27. januar 2006 - 19:06 #2
Ja, men hvordan får jeg så sendt XML'en med som en færdig tekst istedet for som POST normalt er variabel=value i context?
Avatar billede jakobdo Ekspert
27. januar 2006 - 19:11 #3
Prøv at se denne tråd: http://www.eksperten.dk/spm/567883
Bemærk kommetaren/svaret fra: googolplex
Avatar billede specialty Nybegynder
27. januar 2006 - 19:20 #4
Tak for henvisningen, men i det eksempel laves et array om til en post altså variabel=value.. men i mit tilfælde skal hele teksten jo sendes som en samlet XML. Er det muligt så bare at fjerne array -> post delen?

Jeg sidder nemlig ikke lige ved min arbejdscomputer så kan ikke selv lige teste.
Avatar billede jakobdo Ekspert
27. januar 2006 - 19:27 #5
<?php
function post($data, $url, $timeout=30)
{
    $url_array = parse_url($url);

  $len = strlen($data);

  $headers =
    "POST ".$url_array["path"]."?".$url_array["query"]." HTTP/1.1\n".
    "Host: $url_array[host]\n".
    "User-Agent: PHP/".phpversion()."\n".
    "Content-Type: application/x-www-form-urlencoded\n".
    "Content-Length: $len\n\n".
    "$data\n";

  $socket = fsockopen($url_array["host"], 80, $errno, $errstr, $timeout);

  if (!$socket)
  {
        return false;
  }
  else
  {
        fputs($socket, $headers);
        while(!feof($socket))
            $in .= fgets($socket, 128);
        return $in;
    }
}

$xml  = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n";
$xml .= "<gateway>\n";
$xml .= "<sid id=\"0\">\n";
$xml .= "<command> -send -to -email test@test.dk</command>\n";
$xml .= "</sid>\n";
$xml .= "</gateway>\n";

post($xml,"http://www.noget.dk");

?>
Avatar billede olebole Juniormester
27. januar 2006 - 20:05 #6
<ole>

- men brug HTTP1.0 i stedet. Det er væsentligt hurtigere  :)

/mvh
</bole>
Avatar billede olebole Juniormester
27. januar 2006 - 20:06 #7
- altså:
    "POST ".$url_array["path"]."?".$url_array["query"]." HTTP/1.0\n".
Avatar billede whatever Nybegynder
03. februar 2006 - 20:42 #8
Du kunne evt. kigge på NuSOAP http://sourceforge.net/projects/nusoap. Det er en klasse til enten at kommunikere med webservices, eller til at lave en webservice med.

Jeg har arbejdet noget med den til kommunikation med en .Net webservice. Ligeledes har jeg brugt den til en webservice, som et .Net program skal kommunikere med.

Du åbner faktisk bare en forbindelse til din webserver, og sender dine data med som en parameter. Det kræver få linier kode med klassen.
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