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.
balromAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Muhammad WasifCommented:
Muhammad WasifCommented:
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;
babuno5Commented:
try out this link might help
http://www.codecomments.com/message213868.html

It uses the fsockopen method to POST XML data

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
Become a CompTIA Certified Healthcare IT Tech

This course will help prep you to earn the CompTIA Healthcare IT Technician certification showing that you have the knowledge and skills needed to succeed in installing, managing, and troubleshooting IT systems in medical and clinical settings.

balromAuthor Commented:
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.
balromAuthor Commented:
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.
babuno5Commented:
can you post your code??
balromAuthor Commented:
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
babuno5Commented:
check this link it has the same bug solved
http://bugs.php.net/bug.php?id=11058
balromAuthor Commented:
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.

It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
PHP

From novice to tech pro — start learning today.