I'm trying to update a node via REST PUT but failing with the "404 controller not found" error. I have tried everything I know of but still getting the same error.
(No problem on retrieve / index)
Module:
function demoapp_feedback_update($edit, $account, $category) {
cache_clear_all('demoapp_device_validate_pairing_' . $account->uid, 'cache', TRUE);
cache_clear_all('demoapp_feedback_load_feedback_article_', 'cache', TRUE);
cache_clear_all('demoapp_feedback_find_feedback_articles', 'cache', TRUE);
}
function demoapp_services_resources() {
return array(
'demoapp_feedback' => array(
'retrieve' => array(
'help' => 'Retrieves a feedback article',
'file' => array('type' => 'inc', 'module' => 'demoapp', 'name' => 'resources/feedback_resource'),
'callback' => 'demoapp_resources_feedback_retrieve',
'access callback' => 'demoapp_resources_feedback_access',
'access arguments' => array('retrieve'),
'access arguments append' => TRUE,
'args' => array(
array(
'name' => 'article_id',
'type' => 'int',
'description' => 'The id of the feedback article to get',
'source' => array('path' => '0'),
'optional' => FALSE,
),
array(
'name' => 'view_mode',
'type' => 'int',
'description' => 'Defines what data fields to return',
'source' => array('param' => 'view_mode'),
'optional' => TRUE,
'default value' => 0,
),
),
),
'index' => array(
'help' => 'Retrieves a listing of feedback articles',
'file' => array('type' => 'inc', 'module' => 'demoapp', 'name' => 'resources/feedback_resource'),
'callback' => 'demoapp_resources_feedback_index',
'access callback' => 'demoapp_resources_feedback_access',
'access arguments' => array('index'),
'access arguments append' => TRUE,
'args' => array(
array(
'name' => 'view_mode',
'type' => 'int',
'description' => 'Defines what data fields to return',
'source' => array('param' => 'view_mode'),
'optional' => TRUE,
'default value' => 0,
),
array(
'name' => 'checksum',
'type' => 'string',
'description' => 'Checksum of the local data',
'source' => array('param' => 'checksum'),
'optional' => TRUE,
'default value' => NULL,
),
array(
'name' => 'offset',
'type' => 'int',
'description' => 'Offsets a list by X number of items',
'source' => array('param' => 'offset'),
'optional' => TRUE,
'default value' => 0,
),
array(
'name' => 'limit',
'type' => 'int',
'description' => 'Limits a list by X number of items',
'source' => array('param' => 'limit'),
'optional' => TRUE,
'default value' => 10000,
),
),
),
'actions' => array(
'update_poll' => array(
'help' => 'Update a poll',
'file' => array('type' => 'inc', 'module' => 'demoapp', 'name' => 'resources/feedback_resource'),
'callback' => 'demoapp_resources_feedback_update_poll',
'access callback' => 'demoapp_resources_feedback_access',
'access arguments' => array('update_poll'),
'access arguments append' => TRUE,
'args' => array(
array(
'name' => 'node_id',
'type' => 'int',
'description' => 'The id of the node',
'source' => array('data' => 'node_id'),
'optional' => FALSE,
'default value' => 0,
),
array(
'name' => 'vote',
'type' => 'int',
'description' => 'The vote chid',
'source' => array('data' => 'chid'),
'optional' => FALSE,
),
),
),
),
),
(Inc: nothing to see here)
Resource:
function demoapp_resources_feedback_update_poll($node_id, $chid) {
global $user;
global $demoapp_device;
if (demoapp_validate_not_empty($node_id)) {
if (!demoapp_validate_not_empty($node_id) || !demoapp_validate_not_empty($chid)) {
services_error(RESOURCE_ERROR_400_MESSAGE, 400);
}
}
//
$retrievedVoteID = $chid;
$node = node_load($node_id);
$node_wrapper = entity_metadata_wrapper('node', $node);
$selectedVote = $node_wrapper->poll[$chid]['chvotes'];
$newVote = (int)$selectedVote + 1;
$node_wrapper->poll[$chid]['chvotes']->set($newVote);
$node_wrapper->save();
watchdog('Poll update', 'Retrieved poll update query', $variables = array(
'Node id' => $node_id,
'Node object' => $node,
), $severity = WATCHDOG_NOTICE, $link = NULL);
// Event (POLL_VOTE)
$event = new demoappEvent();
$event->type = 'POLL_VOTE';
$event->name = NULL;
$event->device_id = ($demoapp_device && $demoapp_device->device_id) ? $demoapp_device->device_id : NULL;
$event->user_id = $user->uid;
$event->registered = time();
$event->created = time();
$event_id = demoapp_event_create_event($event);
if (!$event_id) {
services_error(RESOURCE_ERROR_500_MESSAGE, 500);
}
//
return array('status' => 'SUCCESS:DONE');
}
function demoapp_resources_feedback_access($op, $args) {
global $user;
// Authenticate
demoapp_services_authenticate();
//
$access = FALSE;
switch ($op) {
case 'retrieve':
$access = user_access('access demoapp content');
break;
case 'index':
$access = user_access('access demoapp content');
break;
case 'update_poll':
$access = user_access('access demoapp content');
break;
}
return $access;
}
Output:
Failed to load resource: the server responded with a status of 404 (Not found : Could not find the controller.)
- Services & ops enabled
- Index/retrieve works
- Authenticated
- Permissions set up properly
Thanks for your time.
Edit: JS function
postOpinion: function(data, onProgress, onSuccess, onAbort, onError){
var httpHeaders = demoapp.auth.getHttpHeaders();
var params = {
node_id: data.nodeId,
chid: data.vote
};
console.log('Params: ', params);
demoapp.feedbackRemote.restClient.call(config.serverURL + '/' + config.serviceEndPoint + '/demoapp_feedback/update_poll', JSON.stringify(params), {requestMethod: 'PUT', requestDataType: 'application/json', httpHeaders: httpHeaders, responseDataType: 'json'},
function _onProgress() {
onProgress(demoapp.feedbackRemote.restClient);
},
function _onSuccess(result) {
onSuccess(result.status);
},
function _onAbort() {
onAbort();
},
function _onError(error) {
console.log('Error: ', error);
console.log('Sent url: ', config.serverURL + '/' + config.serviceEndPoint + '/demoapp_feedback/update_poll', JSON.stringify(params));
onError(error);
}
);
},