views:

41

answers:

2

I'm trying to write a php script to send a http post request to a url. It doesnt seem to pass through for the server is not receiving it. Can anyone help?

<?php  
function postXMLToURL ($server, $path, $xmlDocument) {
    $xmlSource = $xmlDocument;
    $contentLength = strlen($xmlSource);
    //$fp = fsockopen($server, 80);
    $fp = fsockopen($server,8080);
    fwrite($fp, "POST $path HTTP/1.0\r\n");
    fwrite($fp, "Host: $server\r\n");
    fwrite($fp, "Content-Type: application/xml\r\n");
    fwrite($fp, "Content-Length: $contentLength\r\n");
    fwrite($fp, "Connection: close\r\n");
    fwrite($fp, "\r\n"); // all headers sent
    fwrite($fp, $xmlSource);
    $result = '';
    while (!feof($fp)) {
        $result .= fgets($fp, 128);
    }      
    return $result;
}

function getBody ($httpResponse) {
    $lines = preg_split('/(\r\n|\r|\n)/', $httpResponse);
    $responseBody = '';
    $lineCount = count($lines);
    for ($i = 0; $i < $lineCount; $i++) {
        if ($lines[$i] == '') {
            break;
        }
    }
    for ($j = $i + 1; $j < $lineCount; $j++) {
        $responseBody .= $lines[$j] . "\n";
    }
    return $responseBody;
}

$xmlDocument =  new DomDocument($final_xml); //final_xml is my xml in a string

$result = postXMLtoURL("localhost", "/resources", $xmlDocument);
$responseBody = getBody($result);

$resultDocument = new DOMDocument();
$resultDocument->loadXML($responseBody);

header('Content-Type: application/xml');
echo $resultDocument->saveXML();
}
?>
A: 

You need to learn how to help yourself.

There's no error detection in the code - you should at least check fp is valid after the call to fsockopen, for preference there should be a LOT more error checking.

Also, get hold of something like wireshark and see what packets your code is generating.

C.

symcbean
A: 

You could aso use stream_context_create(); Once i wrote a php class you are wecome to use it.

<?php

class HTTPRequest
{
    protected $url;

    protected $method;    

    protected $headers;

    protected $data = "";

    protected $useragent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";


    public function __construct(){}


    public function setHeaders($headers)
    {
        if(is_array($headers))
        {
            $this->headers = $headers;
            return true;            
        }
        return false;

    }

    public function get($request)
    {
        if(!$this->headers)
        {
            throw new Exception("Please set Headers");
        }
        $this->url         = $request;
        $this->method      = "GET";
        return $this->send();
    }

    public function put($request,$xml)
    {
        if(!$this->header)
        {
            throw new Exception("Please set Headers");
        }

        $this->url         = $request;
        $this->method      = "PUT";
        $this->data        = $xml;

        return $this->send();   

    }


    public function post($request,$xml)
    {
        if(!$this->headers)
        {
            throw new Exception("Please set Headers");
        }

        $this->url         = $request;
        $this->method      = "POST";
        $this->data        = $xml;

        return $this->send();
    }


    public function delete($request)
    {
        if(!$this->headers)
        {
            throw new Exception("Please set Headers");
        }

        $this->url         = $request;
        $this->method      = "DELETE";
        return $this->send();

    }



    public function setUserAgent($useragent)
    {
        $this->useragent   = $useragent;
    }

    protected function send()
    {

        $params = array('http'   => array
                                        (
                                         'method'     => $this->method,
                                         'content'    => $this->data,
                                         'user_agent' => $this->useragent 
                                        )
                        );
        $headers = "";

        if (!empty($this->headers) && is_array($this->headers))
        {
            foreach ($this->headers as $header)
            {
                $headers .= $header."\n";
            }
        }

        $params['http']['header'] = $headers;

        $context    = stream_context_create($params);

        $fp         = fopen($this->url, 'r', false, $context);

        if (!$fp)
        {
            throw new Exception("Problem with ".$this->url);
        }

        $response   = stream_get_contents($fp);

        if ($response === false)
        {
            throw new Exception("Problem reading data from ".$this->url);
        }

        return $response;
    }
}
?>
streetparade