[PHP] reading incoming xml
I am running apache with php. I set up a curl script to send an xml request to the php page I'm authoring and want to handle the xml on the incoming message. My $_POST array is empty though. Is there some other place I should be looking? $_SERVER shows the incoming message as a post but again the data isn't there. Does apache/php place the xml in some other location for me to access? Larry -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] reading incoming xml
On Sat, Mar 1, 2008 at 4:12 PM, Larry Brown [EMAIL PROTECTED] wrote: I am running apache with php. I set up a curl script to send an xml request to the php page did you use a request header to somehow set a mime type to indicate youre looking for xml? could you show us this request, im not sure how to request for xml specifically.. My $_POST array is empty though. is this on the system where the xml will be sent from? you have to populate the post fields in the request by using the curl option CURLOPT_POST to indicate you are posting, and CURLOPT_POSTFIELDS, to pass an array of parameters that will be used as post fields. then the $_POST array will be populated on the provider system. Is there some other place I should be looking? $_SERVER shows the incoming message as a post but again the data isn't there. still curious if youre looking on the consumer (system sending curl request) or the provider, (system providing the xml data via response). Does apache/php place the xml in some other location for me to access? depending on how you configure curl, the data can be in different places. the easiest way (i think) is to use the CURLOPT_RETURNTRANSFER option. then the response will be returned from curl_exec() (rather than a boolean success flag). here is sample code from a consumer and a provider; theyre up on my server so you can try using the consumer if you want. CONSUMER --- ?php $curlHandle = curl_init('http://nathan.moxune.com/postXml.php'); curl_setopt_array($curlHandle, array( CURLOPT_RETURNTRANSFER = true, CURLOPT_POST = true, CURLOPT_POSTFIELDS = array( 'token' = 1 ) )); $response = curl_exec($curlHandle); if(!empty($response)) { try { $sxml = new SimpleXmlElement($response); echo $sxml-asXML(); } catch(Exception $e) { die($e-getMessage()); } } ? PROVIDER - ?php if($_POST['token'] == 1) { ? someString moreHere lessHere / /moreHere /someString ?php } ? -nathan
Re: [PHP] reading incoming xml
I'm sending from a php cli with: $post = '?xml version=1.0 encoding=UTF-8?Data'.$vendorCompanyID.'/Data'; $message = generatePage($page, $post); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,'https://myserver/mytestpage.php'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 4); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $message); $data=curl_exec($ch); I've the server page (mytestpage.php) set up as: echo hello\n; print_r($_SERVER); where I replace SERVER with POST etc and I can't find the string '?xml version=1.0 encoding=UTF-8?Data'.$vendorCompanyID.'/Data' in the $data output. I do get the hello so I know I am hitting the server and when it is set to $_SERVER as listed above I get the expected array but $_POST is empty. Larry On Sat, 2008-03-01 at 16:59 -0500, Nathan Nobbe wrote: On Sat, Mar 1, 2008 at 4:12 PM, Larry Brown [EMAIL PROTECTED] wrote: I am running apache with php. I set up a curl script to send an xml request to the php page did you use a request header to somehow set a mime type to indicate youre looking for xml? could you show us this request, im not sure how to request for xml specifically.. My $_POST array is empty though. is this on the system where the xml will be sent from? you have to populate the post fields in the request by using the curl option CURLOPT_POST to indicate you are posting, and CURLOPT_POSTFIELDS, to pass an array of parameters that will be used as post fields. then the $_POST array will be populated on the provider system. Is there some other place I should be looking? $_SERVER shows the incoming message as a post but again the data isn't there. still curious if youre looking on the consumer (system sending curl request) or the provider, (system providing the xml data via response). Does apache/php place the xml in some other location for me to access? depending on how you configure curl, the data can be in different places. the easiest way (i think) is to use the CURLOPT_RETURNTRANSFER option. then the response will be returned from curl_exec() (rather than a boolean success flag). here is sample code from a consumer and a provider; theyre up on my server so you can try using the consumer if you want. CONSUMER --- ?php $curlHandle = curl_init('http://nathan.moxune.com/postXml.php'); curl_setopt_array($curlHandle, array( CURLOPT_RETURNTRANSFER = true, CURLOPT_POST = true, CURLOPT_POSTFIELDS = array( 'token' = 1 ) )); $response = curl_exec($curlHandle); if(!empty($response)) { try { $sxml = new SimpleXmlElement($response); echo $sxml-asXML(); } catch(Exception $e) { die($e-getMessage()); } } ? PROVIDER - ?php if($_POST['token'] == 1) { ? someString moreHere lessHere / /moreHere /someString ?php } ? -nathan -- Larry Brown [EMAIL PROTECTED] -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] reading incoming xml
On Sat, Mar 1, 2008 at 5:17 PM, Larry Brown [EMAIL PROTECTED] wrote: I'm sending from a php cli with: $post = '?xml version=1.0 encoding=UTF-8?Data'.$vendorCompanyID.'/Data'; $message = generatePage($page, $post); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,'https://myserver/mytestpage.php'https://myserver/mytestpage.php%27 ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 4); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $message); $data=curl_exec($ch); I've the server page (mytestpage.php) set up as: echo hello\n; print_r($_SERVER); where I replace SERVER with POST etc and I can't find the string '?xml version=1.0 encoding=UTF-8?Data'.$vendorCompanyID.'/Data' in the $data output. I do get the hello so I know I am hitting the server and when it is set to $_SERVER as listed above I get the expected array but $_POST is empty. hmm, it looks to me like you want to post a bunch of raw data to the server. im not sure exactly how to do that w/ the php curl functions... everything ive seen uses CURLOPT_POSTFIELDS to supply an associative array of data to be posted. in this case you could easily send you data across by choosing a name for the index, something like 'postdata', anything will do, then it will be accessible on the system youre posting to via $_POST['postdata']. also, inlooking at your usage of CURLOPT_CUSTOMREQUEST, i dont believe youre using it correctly, i think youre just supposed to put a string representing the desired http method in there, so something like 'HEAD', 'PUT', or in this case 'POST'. then you would supply the data as i said earlier, using CURLOPT_POSTFIELDS. so in all, i think something like this would work for you, $post = '?xml version=1.0 encoding=UTF-8?Data'. $vendorCompanyID.'/Data'; $message = generatePage($page, $post); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,'https://myserver/mytestpage.php'https://myserver/mytestpage.php%27 ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 4); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_POSTFIELDS, array('postdata' = $message)); $data=curl_exec($ch); and also, in reading the warning about CURLOPT_CUSTOMREQUEST, you might just go with CURLOPT_POST = true, since you arent using an obscure http method. im not sure exactly how to determine if the server supports this method or not. anyway, i found this in 'man curl_easy_setopt' (thats the manpage for the c function php uses for the CURLOPT_CUSTOMREQUEST option). Many people have wrongly used this option to replace the entire request with their own, including multiple headers and POST contents. While that might work in many cases, it will cause libcurl to send invalid requests and it could possibly confuse the remote server badly. Use CURLOPT_POST and CUR- LOPT_POSTFIELDS to set POST data. Use CURLOPT_HTTPHEADER to replace or extend the set of headers sent by libcurl. Use CURLOPT_HTTP_VERSION to change HTTP version. -nathan
Re: [PHP] reading incoming xml
Thanks for the help Nathan. What I'm looking for though is how to accept and read the incoming XML the way I was sending it in curl. I am currently using that curl mechanism on the cli to connect to another remote XML server successfully. I want to keep that side of the equation the same. I need to find out if I can access the incoming data on the server side. I don't need or want to use curl on the server side. I just want to handle the incoming XML. How does SOAP and XML-RPC get to the incoming XML? Is the incoming SOAP and XML-RPC packages arriving in html posts? I tried looking at the nusoap code to determine this to no avail. Larry On Sat, 2008-03-01 at 18:08 -0500, Nathan Nobbe wrote: hmm, it looks to me like you want to post a bunch of raw data to the server. im not sure exactly how to do that w/ the php curl functions... everything ive seen uses CURLOPT_POSTFIELDS to supply an associative array of data to be posted. in this case you could easily send you data across by choosing a name for the index, something like 'postdata', anything will do, then it will be accessible on the system youre posting to via $_POST['postdata']. also, inlooking at your usage of CURLOPT_CUSTOMREQUEST, i dont believe youre using it correctly, i think youre just supposed to put a string representing the desired http method in there, so something like 'HEAD', 'PUT', or in this case 'POST'. then you would supply the data as i said earlier, using CURLOPT_POSTFIELDS. so in all, i think something like this would work for you, and also, in reading the warning about CURLOPT_CUSTOMREQUEST, you might just go with CURLOPT_POST = true, since you arent using an obscure http method. im not sure exactly how to determine if the server supports this method or not. anyway, i found this in 'man curl_easy_setopt' (thats the manpage for the c function php uses for the CURLOPT_CUSTOMREQUEST option). Many people have wrongly used this option to replace the entire request with their own, including multiple headers and POST contents. While that might work in many cases, it will cause libcurl to send invalid requests and it could possibly confuse the remote server badly. Use CURLOPT_POST and CUR- LOPT_POSTFIELDS to set POST data. Use CURLOPT_HTTPHEADER to replace or extend the set of headers sent by libcurl. Use CURLOPT_HTTP_VERSION to change HTTP version. -nathan -- Larry Brown [EMAIL PROTECTED] -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] reading incoming xml
The incoming message to the server is: POST /vendorXML.html HTTP/1.0 MIME-Version: 1.0 Content-type: text/html Content-length: 114 Content-transfer-encoding: text Request-number: 1 Document-type: Request Interface-Version: Test 1.4 Connection: close ?xml version=1.0 encoding=UTF-8?DatavendorCompanyID/Data Larry On Sat, 2008-03-01 at 18:08 -0500, Nathan Nobbe wrote: hmm, it looks to me like you want to post a bunch of raw data to the server. im not sure exactly how to do that w/ the php curl functions... everything ive seen uses CURLOPT_POSTFIELDS to supply an associative array of data to be posted. in this case you could easily send you data across by choosing a name for the index, something like 'postdata', anything will do, then it will be accessible on the system youre posting to via $_POST['postdata']. also, inlooking at your usage of CURLOPT_CUSTOMREQUEST, i dont believe youre using it correctly, i think youre just supposed to put a string representing the desired http method in there, so something like 'HEAD', 'PUT', or in this case 'POST'. then you would supply the data as i said earlier, using CURLOPT_POSTFIELDS. so in all, i think something like this would work for you, and also, in reading the warning about CURLOPT_CUSTOMREQUEST, you might just go with CURLOPT_POST = true, since you arent using an obscure http method. im not sure exactly how to determine if the server supports this method or not. anyway, i found this in 'man curl_easy_setopt' (thats the manpage for the c function php uses for the CURLOPT_CUSTOMREQUEST option). Many people have wrongly used this option to replace the entire request with their own, including multiple headers and POST contents. While that might work in many cases, it will cause libcurl to send invalid requests and it could possibly confuse the remote server badly. Use CURLOPT_POST and CUR- LOPT_POSTFIELDS to set POST data. Use CURLOPT_HTTPHEADER to replace or extend the set of headers sent by libcurl. Use CURLOPT_HTTP_VERSION to change HTTP version. -nathan -- Larry Brown [EMAIL PROTECTED] -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] reading incoming xml
On Sat, Mar 1, 2008 at 9:33 PM, Larry Brown [EMAIL PROTECTED] wrote: Thanks for the help Nathan. What I'm looking for though is how to accept and read the incoming XML the way I was sending it in curl. I am currently using that curl mechanism on the cli to connect to another remote XML server successfully. I want to keep that side of the equation the same. I need to find out if I can access the incoming data on the server side. I don't need or want to use curl on the server side. I just want to handle the incoming XML. Larry, I'm sorry that I'm not certain what you mean by remote XML server, since XML is a markup language and a server (in this context) insinuates an HTTP (protocol) web server, but perhaps a combination of file_get_contents() and the information from the following manual entry will help you. http://www.php.net/xml -- /Dan Daniel P. Brown Senior Unix Geek ? while(1) { $me = $mind--; sleep(86400); } ? -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
RE: [PHP] reading incoming xml
You can get what you post either with: $postText = trim(file_get_contents('php://input'); Or with: $postText = $GLOBALS[HTTP_RAW_POST_DATA]; About HTTP_RAW_POST_DATA http://us2.php.net/manual/en/reserved.variables.php Read the notes here http://us2.php.net/variables.predefined It should be noted that $HTTP_RAW_POST_DATA only exists if the encoding type of the data is -not- the default of application/x-www.form-urlencoded, and so, to accessing raw post data from an HTTP form requires setting enctype= in your HTML. So, if $RAW_POST_DATA doesn't exist, it is because you should be able to use $_POST (unless you set PHP to always populate raw post data in php.ini). The preferred method is, however, to read 'php://input' Then after you get the XML body, you must use one of the XML extensions available in PHP to parse the XML data (search for it as it's not part of this help pack ;) ). Regards, Rob(inet) Andrés Robinet | Lead Developer | BESTPLACE CORPORATION 5100 Bayview Drive 206, Royal Lauderdale Landings, Fort Lauderdale, FL 33308 | TEL 954-607-4207 | FAX 954-337-2695 | Email: [EMAIL PROTECTED] | MSN Chat: [EMAIL PROTECTED] | SKYPE: bestplace | Web: bestplace.biz | Web: seo-diy.com -Original Message- From: Larry Brown [mailto:[EMAIL PROTECTED] Sent: Saturday, March 01, 2008 9:43 PM To: Nathan Nobbe Cc: php Subject: Re: [PHP] reading incoming xml The incoming message to the server is: POST /vendorXML.html HTTP/1.0 MIME-Version: 1.0 Content-type: text/html Content-length: 114 Content-transfer-encoding: text Request-number: 1 Document-type: Request Interface-Version: Test 1.4 Connection: close ?xml version=1.0 encoding=UTF-8?DatavendorCompanyID/Data Larry On Sat, 2008-03-01 at 18:08 -0500, Nathan Nobbe wrote: hmm, it looks to me like you want to post a bunch of raw data to the server. im not sure exactly how to do that w/ the php curl functions... everything ive seen uses CURLOPT_POSTFIELDS to supply an associative array of data to be posted. in this case you could easily send you data across by choosing a name for the index, something like 'postdata', anything will do, then it will be accessible on the system youre posting to via $_POST['postdata']. also, inlooking at your usage of CURLOPT_CUSTOMREQUEST, i dont believe youre using it correctly, i think youre just supposed to put a string representing the desired http method in there, so something like 'HEAD', 'PUT', or in this case 'POST'. then you would supply the data as i said earlier, using CURLOPT_POSTFIELDS. so in all, i think something like this would work for you, and also, in reading the warning about CURLOPT_CUSTOMREQUEST, you might just go with CURLOPT_POST = true, since you arent using an obscure http method. im not sure exactly how to determine if the server supports this method or not. anyway, i found this in 'man curl_easy_setopt' (thats the manpage for the c function php uses for the CURLOPT_CUSTOMREQUEST option). Many people have wrongly used this option to replace the entire request with their own, including multiple headers and POST contents. While that might work in many cases, it will cause libcurl to send invalid requests and it could possibly confuse the remote server badly. Use CURLOPT_POST and CUR- LOPT_POSTFIELDS to set POST data. Use CURLOPT_HTTPHEADER to replace or extend the set of headers sent by libcurl. Use CURLOPT_HTTP_VERSION to change HTTP version. -nathan -- Larry Brown [EMAIL PROTECTED] -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP] reading incoming xml
On Sat, Mar 1, 2008 at 9:33 PM, Larry Brown [EMAIL PROTECTED] wrote: Thanks for the help Nathan. What I'm looking for though is how to accept and read the incoming XML the way I was sending it in curl. I am currently using that curl mechanism on the cli to connect to another remote XML server successfully. I want to keep that side of the equation the same. I need to find out if I can access the incoming data on the server side. I don't need or want to use curl on the server side. I just want to handle the incoming XML. How does SOAP and XML-RPC get to the incoming XML? Is the incoming SOAP and XML-RPC packages arriving in html posts? I tried looking at the nusoap code to determine this to no avail. im sorry to say this larry, but at this point im a little bit confused. as dan said, xml is a markup language not a protocol, and as i said there are 2 ways to send data using an HTTP POST request and curl, per my previous post. the only thing youd have to do is come up w/ an index for the array you supply to the curl option CURLOPT_POSTFIELDS and viola, you will have the data available in the $_POST array on the server you are posting to via curl. you can also try what Rob said as well to grab the raw POST response. however, im not sure i would use CURLOPT_CUSTOMREQUEST in the way you are, in fact im surprised its even generating a POST request, because i dont see how youve specified it in your request, and GET is the default curl HTTP request method. im also a little lost when you say you dont want to use curl on the server side. if you used CURLOPT_POSTFIELDS (on the 'client side') as i recommended in my previous post all you have to do is grab the response from the $_POST array on the 'server side', ergo no curl involved server side. so, in summary, im not trying to be rude, im just trying to get on the same page, lingo wise, and understand what was insufficient about my previous suggestion. -nathan
RE: [PHP] reading incoming xml
This is what I was looking for. Thank you. I could not change the client since that client is being used for other servers in its current configuration. All I needed was a way to get to the XML string coming in. $postText = trim(file_get_contents('php://input'); worked perfectly. Now that I have this blob of XML I can give it to simpleXML or another parser I was recently shown to work with it. I'm surprised it was so difficult to find. $GLOBALS['HTTP_RAW_POST_DATA'] was empty by the way and that I'd seen before. Also, sorry if I threw anyone off by referring to the other server the client works with as an XML server. I only referred to it as such because it is a server that accepts XML input and responds with XML output to a number of clients. It is not used as a typical html server for browsing etc. Anyway, I was looking to get a hold of the raw data coming in and it looks like this was it. I really do appreciate the help... Larry On Sat, 2008-03-01 at 22:06 -0500, Andrés Robinet wrote: You can get what you post either with: $postText = trim(file_get_contents('php://input'); Or with: $postText = $GLOBALS[HTTP_RAW_POST_DATA]; About HTTP_RAW_POST_DATA http://us2.php.net/manual/en/reserved.variables.php Read the notes here http://us2.php.net/variables.predefined It should be noted that $HTTP_RAW_POST_DATA only exists if the encoding type of the data is -not- the default of application/x-www.form-urlencoded, and so, to accessing raw post data from an HTTP form requires setting enctype= in your HTML. So, if $RAW_POST_DATA doesn't exist, it is because you should be able to use $_POST (unless you set PHP to always populate raw post data in php.ini). The preferred method is, however, to read 'php://input' Then after you get the XML body, you must use one of the XML extensions available in PHP to parse the XML data (search for it as it's not part of this help pack ;) ). Regards, Rob(inet) Andrés Robinet | Lead Developer | BESTPLACE CORPORATION 5100 Bayview Drive 206, Royal Lauderdale Landings, Fort Lauderdale, FL 33308 | TEL 954-607-4207 | FAX 954-337-2695 | Email: [EMAIL PROTECTED] | MSN Chat: [EMAIL PROTECTED] | SKYPE: bestplace | Web: bestplace.biz | Web: seo-diy.com -Original Message- From: Larry Brown [mailto:[EMAIL PROTECTED] Sent: Saturday, March 01, 2008 9:43 PM To: Nathan Nobbe Cc: php Subject: Re: [PHP] reading incoming xml The incoming message to the server is: POST /vendorXML.html HTTP/1.0 MIME-Version: 1.0 Content-type: text/html Content-length: 114 Content-transfer-encoding: text Request-number: 1 Document-type: Request Interface-Version: Test 1.4 Connection: close ?xml version=1.0 encoding=UTF-8?DatavendorCompanyID/Data Larry On Sat, 2008-03-01 at 18:08 -0500, Nathan Nobbe wrote: hmm, it looks to me like you want to post a bunch of raw data to the server. im not sure exactly how to do that w/ the php curl functions... everything ive seen uses CURLOPT_POSTFIELDS to supply an associative array of data to be posted. in this case you could easily send you data across by choosing a name for the index, something like 'postdata', anything will do, then it will be accessible on the system youre posting to via $_POST['postdata']. also, inlooking at your usage of CURLOPT_CUSTOMREQUEST, i dont believe youre using it correctly, i think youre just supposed to put a string representing the desired http method in there, so something like 'HEAD', 'PUT', or in this case 'POST'. then you would supply the data as i said earlier, using CURLOPT_POSTFIELDS. so in all, i think something like this would work for you, and also, in reading the warning about CURLOPT_CUSTOMREQUEST, you might just go with CURLOPT_POST = true, since you arent using an obscure http method. im not sure exactly how to determine if the server supports this method or not. anyway, i found this in 'man curl_easy_setopt' (thats the manpage for the c function php uses for the CURLOPT_CUSTOMREQUEST option). Many people have wrongly used this option to replace the entire request with their own, including multiple headers and POST contents. While that might work in many cases, it will cause libcurl to send invalid requests and it could possibly confuse the remote server badly. Use CURLOPT_POST and CUR- LOPT_POSTFIELDS to set POST data. Use CURLOPT_HTTPHEADER to replace or extend the set of headers sent by libcurl. Use CURLOPT_HTTP_VERSION to change HTTP version. -nathan -- Larry Brown [EMAIL PROTECTED] -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php -- Larry Brown [EMAIL PROTECTED] -- PHP General Mailing List (http://www.php.net/) To unsubscribe