• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 231
  • Last Modified:

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.
0
balrom
Asked:
balrom
  • 4
  • 3
  • 2
1 Solution
 
Muhammad WasifCommented:
0
 
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;
0
 
babuno5Commented:
try out this link might help
http://www.codecomments.com/message213868.html

It uses the fsockopen method to POST XML data
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

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

0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

  • 4
  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now