A Javascript client for Drupal 7 / Services Module
An installation of Drupal 7.x and Services Module
REST Server module enabled, an endpoint defined and appropriate permissions (system, user, node, etc.). In server settings, enable only response formatter json
the request parsing mime types application/json
, application/x-www-form-urlencoded
and multipart/form-data
.
A Javascript project - node.js or Titanium are known to work.
bower install drupal-client
<script src="https://github.com/jbeuckm/drupal-client/raw/master/bower_components/drupal-client/build/drupal.min.js"></script>
npm install drupal-client
var Drupal = require('drupal');
Copy lib/drupal.js and lib/field.js into your app/lib/ folder.
var Drupal = require('drupal');
Configure the client for your installation of Drupal+Services. Note that the URL includes the trailing slash.
var drupal = new Drupal();
drupal.setRestPath("http://mywebsite.com/", "rest_endpoint");
Create a Service and enable (at least) the Resources called "system" and "user".
drupal.systemConnect(
//success
function(sessionData) {
var uid = sessionData.user.uid;
console.log('session found for user '+uid);
},
//failure
function(error) {
console.log('boo :(');
}
);
var user = {
name: 'my_new_username',
pass: 'my_new_password',
mail: 'my_email@drupal.js'
};
drupal.createAccount(user,
//success
function(userData) {
console.log('yay!');
},
//failure
function(error) {
console.log('boo :(');
},
headers //optional
);
var my_username = "<DRUPAL USERNAME>";
var my_password = "<DRUPAL PASSWORD>";
var userObject;
drupal.login(my_username, my_password,
function(userData) {
console.log('User ' + userData.uid + ' has logged in.');
userObject = userData;
},
function(err){
console.log('login failed.');
}
);
This updates an account profile on the server. userObject
is a user object that may have been received from a login request (see above).
drupal.putResource("user/"+userObject.uid, userObject,
function(userData) {
console.log('user has been updated.');
},
function(err){
console.log('user update failed.');
}
);
var filename = "uploaded_file.png";
var data = require('fs').readFileSync("path/to/file/file.png");
var base64data = data.toString('base64');
var filesize = data.length;
drupal.uploadFile(base64data, filename, filesize,
function (response) {
fid = response.fid;
},
function (err) {
console.log(err);
},
function (progress_event) {
console.log(progress_event.loaded + '/' + filesize + ' uploaded');
}
);
var node = {
type: "my_content_type",
title: "My New Node",
body: drupal.field.structureField("Check out this great new node!"),
field_bool: drupal.field.structureField(1),
field_decimal: drupal.field.structureField(.1),
field_float: drupal.field.structureField(2.3),
field_integer: drupal.field.structureField(4),
field_multiple: drupal.field.structureField(["one", "two", "three"]),
field_file: drupal.field.structureField(fid, "fid"),
field_date: field.structureField(new Date())
};
drupal.createNode(node,
function (resp) {
console.log(resp);
},
function (err) {
console.log(err);
}
);
The workhorse function of the interface is makeAuthenticatedRequest(config, success, failure, headers)
. There are a few helper functions included for posting/getting nodes, getting views, uploading files, etc. They all construct a call to makeAuthenticatedRequest()
. This function should facilitate most things that people want to do with Drupal in a mobile environment. It's also easy to use `makeAuthenticatedRequest' to make requests against custom Services. The short-term roadmap includes calls to the services supporting entities.
To run the tests, rename test/config.js.example
to test/config.js
and replace strings with the url of your Drupal install and your service endpoint.
npm install
npm test