Posting Requests in PHP without CURL
Can it be done? YES! Luckily, functions like
file_get_contents() support stream contexts.
In this example, I want to post to my form my login credentials of username
aaron and password
chicken. This will be posting to the URL of
http://test.com/login.do.php. I’ll show the code first, and then let’s talk about what it does.
$args = array ('username'=>'aaron', 'password'=>'chicken'); $uri = 'http://test.com/login.do.php'; $opts = array( 'http' => array( 'method'=>'POST', 'header'=>'Content-Type: application/x-www-form-urlencoded', 'content'=>http_build_query($args) ) ); $context = stream_context_create($opts); $result = file_get_contents($uri, false, $context); print $result;
Let’s dissect line by line:
The first line dealing with
$args is setting up our post parameters. The next line is our uri target. If this was an HTML form, it might look like this:
<form action="http://test.com/login.do.php" method="POST"> Username: <input name="username"></input><br></br> Password: <input name="password"></input><br></br> <input type="submit"></input> </form>
The next line is the
$opts array. This will be the options that we send to the stream context. The array is keyed by the type of stream we’re creating here - in this case
http. This points to an array of options. First, the method of the request, in this case
POST. Next, the header that must be sent in order to submit the request. For the most part, your browser handles sending this - but we have to specify it here. It simply is keying the request to let it know that its a form submission. The final key is the content key - which is what is submitted in a typical request below the headers. Here we’re using PHP’s
http_build_query() to save ourselves some time.
Moving on, we create a new context using
stream_context_create(), assign that to $context using
$opts as our parameter. Think of
$context not as a value, but as a handle - similar to an fopen or other resource handle.
Finally, we retrieve the contents of our request using
file_get_contents(). Do note: you must have
fopen_url = true in your
php.ini. This allows us to retrieve content via an external URL. We pass the location of our post request, false because we don’t want send any additional flags, and a pointer to our stream context.
After this is complete, we should have the output in the