Link to home
Start Free TrialLog in
Avatar of balrom
balrom

asked on

Do a stantard HTTP post request using PHP

Hi experts,
i need to build an interface to some web services based on standard HTTP post as communication Method.

I have a .net example here:

 Dim XMLDoc As New System.Xml.XmlDocument()
 Dim XMLRequest As System.Xml.XmlElement
 Dim XMLHeader As System.Xml.XmlElement
 Dim XMLBody As System.Xml.XmlElement
 Dim XMLNode As System.Xml.XmlElement
 Dim XMLChildNode As System.Xml.XmlElement
 Dim XMLGrandChild As System.Xml.XmlElement
 Dim ClientID As String
 Dim Language As String
 Dim EmailAddress As String
 Dim ClientPassword As String
 Dim InterfaceURL As String
 Dim ResponseURL As String
 ' client settings
 ClientID = "YourClienTID"
 EmailAddress = "YourClientEmail"
 ClientPassword = "YourClientPassword"
 Language = "YourLanguage"
 InterfaceURL = "http://www.mysite.com/api/RequestListenerServlet"
 ResponseURL = "http:// www.mysite.com/receiveRequest.asp"
 ' create xml
 ' create request header
 XMLRequest = XMLDoc.CreateElement("Request")
 XMLHeader = XMLDoc.CreateElement("Source")
 ' client details node
 XMLNode = XMLDoc.CreateElement("RequestorID")
 XMLNode.SetAttribute("Client", ClientID)
 XMLNode.SetAttribute("EMailAddress", EmailAddress)
 XMLNode.SetAttribute("Password", ClientPassword)
 XMLHeader.AppendChild(XMLNode)
 ' client preferences node
 XMLNode = XMLDoc.CreateElement("RequestorPreferences")
 XMLNode.SetAttribute("Language", Language)
 XMLChildNode = XMLDoc.CreateElement("RequestMode")
 XMLChildNode.InnerText = "SYNCHRONOUS"
 XMLNode.AppendChild(XMLChildNode)
 XMLHeader.AppendChild(XMLNode)
 ' create request body
 XMLBody = XMLDoc.CreateElement("RequestDetails")
 XMLNode = XMLDoc.CreateElement("MyRequest")
 XMLChildNode = XMLDoc.CreateElement("Item1")
 XMLChildNode.SetAttribute("Subitem1", "val1")
 XMLChildNode.SetAttribute("Subitem2", "val2")
 XMLNode.AppendChild(XMLChildNode)
 XMLChildNode = XMLDoc.CreateElement("Item2")
 XMLGrandChild = XMLDoc.CreateElement("Item3")
 XMLGrandChild.InnerText = "2005-12-01"
 XMLChildNode.AppendChild(XMLGrandChild)
 XMLGrandChild = XMLDoc.CreateElement("Item4")
 XMLGrandChild.InnerText = "2"
 XMLChildNode.AppendChild(XMLGrandChild)
 XMLNode.AppendChild(XMLChildNode)
 XMLChildNode = XMLDoc.CreateElement("item6")
 XMLGrandChild = XMLDoc.CreateElement("Item7")
 XMLGrandChild.SetAttribute("Code", "db")
 XMLGrandChild.SetAttribute("NumberOfRooms", "1")
 XMLChildNode.AppendChild(XMLGrandChild)
 XMLNode.AppendChild(XMLChildNode)
 XMLBody.AppendChild(XMLNode)
 ' create xml document
 XMLRequest.AppendChild(XMLHeader)
 XMLRequest.AppendChild(XMLBody)
 XMLDoc.AppendChild(XMLRequest)
 ' post document
 Dim encoding As New System.Text.ASCIIEncoding()
 Dim byte1 As Byte() = encoding.GetBytes(XMLDoc.OuterXml)
 Dim HttpWReq As System.Net.HttpWebRequest = _
 CType(System.Net.WebRequest.Create(InterfaceURL), System.Net.HttpWebRequest)
 HttpWReq.ContentType = "text/xml"
 HttpWReq.ContentLength = XMLDoc.OuterXml.Length
 HttpWReq.Method = "POST"
 Dim StreamData As Stream = HttpWReq.GetRequestStream()
 StreamData.Write(byte1, 0, byte1.Length)

 ' get response stream
 Dim HttpWRes As System.Net.HttpWebResponse = CType(HttpWReq.GetResponse, System.Net.HttpWebResponse)
 Dim receiveStream As Stream = HttpWRes.GetResponseStream()

How can i do the same with PHP?

Regards.
Avatar of Muhammad Wasif
Muhammad Wasif
Flag of Pakistan image

Hope this basic example help

$url = "http://www.mysite.com/api/RequestListenerServlet";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "a=3&b=5"); //data to post
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
$result = curl_exec ($ch);
curl_close($ch);
echo $result;
ASKER CERTIFIED SOLUTION
Avatar of babuno5
babuno5
Flag of India image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of balrom
balrom

ASKER

Thanks to all for your replies.
I think is more convenient the babuno5's approach(no curl required and no post vars to specify).

I need some time to do a test.

Regards.
Avatar of balrom

ASKER

Hi,
i've done a test, getting the following response:
   Warning: fsockopen(): php_network_getaddresses: getaddrinfo failed: Name or service not known in mymodule.php

any idea?

Regards.
can you post your code??
Avatar of balrom

ASKER

Babuno5,

there is the code:

    // try connection to the server
    $ConnectionServer = fsockopen($CFGURLTest, 80, $errno, $errstr, 30);
    if ($ConnectionServer) {
       ...
   } else {
      ...
   }

The variable $CFGURLTest contain the address of service that receive post request.
After the fsockopen, the control skip to the else statement.

Regards
check this link it has the same bug solved
http://bugs.php.net/bug.php?id=11058
Avatar of balrom

ASKER

Thanks babuno,

Post a request using sockets works fine, in the previuos post i was using a wrong parm in the fsockopen funtion.

For clarity to other users:
   I have to call the service with the url "http://www.myhost.com/myservice".

   for do this i first open a socket to the host:
       $Conn = fsockopen ("www.myhost.com", 80, $errno, $errstr, 30); // do not specify "http://

   then i put the post directive, specifying the service name:
      fputs($Conn, "POST /myservice HTTP/1.0\r\n");

regards.