I needed to POST JSON formatted data to a RESTful web service using PHP earlier, so I thought I’d share my solution.
There are a couple of approaches that could be taken, using the CURL extension, or file_get_contents and a http context. I took the later way.
When POSTing JSON to a RESTful web service we don’t send post fields or pretend to be a form, instead we have to send the JSON data in body of the request, and let the web service know it’s JSON data by setting the Content-type header to application/json.
$article = new stdClass(); $article->title = "An example article"; $article->summary = "An example of posting JSON encoded data to a web service"; $json_data = json_encode($article); $post = file_get_contents('http://localhost/rest/articles',null,stream_context_create(array( 'http' => array( 'protocol_version' => 1.1, 'user_agent' => 'PHPExample', 'method' => 'POST', 'header' => "Content-type: application/json\r\n". "Connection: close\r\n" . "Content-length: " . strlen($json_data) . "\r\n", 'content' => $json_data, ), ))); if ($post) { echo $post; } else { echo "POST failed"; }
Here I’m first creating an example PHP stdClass
object, populating it with some data, then serialising it to a JSON string. The real magic is using file_get_contents
to POST it over HTTP to my test web service. If the POST succeeds, then it’s displayed, else an error message is shown.
It’s important to note I send the header, Connection: close
. Without this, your script will hang until the web server closes the connection. If we include it, then as soon as the data has POSTed the connection is closed and control returned to the script.