Я занимаюсь разработкой приложения для iOS, которое загружает изображение и текст на REST-сервер Drupal.Изображение и текст должны храниться в таблице MySQL.
Я использую ASIHTTPRequest для выполнения POST на моем REST-сервере.На стороне сервера я следовал этому примеру для настройки REST-сервера Drupal: http://drupal.org/node/1246470
Проблема, с которой я столкнулся, заключается в том, что я не знаю, как ссылаться на изображение на REST-сервере.Всякий раз, когда я пытаюсь отправить информацию, я получаю сообщение об ошибке «HTTP / 1.0 406 Недопустимо: отсутствует изображение атрибута проблемы» .Кто-нибудь может указать, что я делаю неправильно или чего мне не хватает?
Моя версия iOS - 5.1.Моя версия Drupal 7.8.
Мой код iOS выглядит следующим образом:
NSString* timestamp = [NSString stringWithFormat:@"%.0f", [[NSDate date] timeIntervalSince1970]];
//Add the timestamp to the filename
NSMutableString* filename = [NSMutableString stringWithString:@"issue-"];
[filename appendString: timestamp];
[filename appendString: @".png"];
//Convert the image into an NSData object
NSData* imageData = UIImagePNGRepresentation(imageView.image);
NSURL *url = [NSURL URLWithString: SERVICE_URL];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL: url];
[request setPostValue: emailAddress forKey:@"email"];
[request setPostValue: details forKey:@"details"];
[request setData: imageData withFileName: filename andContentType: @"image/png" forKey: @"image"];
[request setPostFormat:ASIMultipartFormDataPostFormat];
[request setRequestMethod:@"POST"];
[request startSynchronous];
Что касается серверной части, то здесь я настраиваю hook_services_resources:
/**
* Implementation of hook_services_services().
*/
function issue_services_resources() {
return array(
'issue' => array(
'retrieve' => array(
'help' => 'Retrieves an issue',
'file' => array('file' => 'inc', 'module' => 'issue'),
'callback' => '_issue_retrieve',
'access callback' => '_issue_access',
'access arguments' => array('view'),
'access arguments append' => TRUE,
'args' => array(
array(
'name' => 'id',
'type' => 'int',
'description' => 'The id of the issue to get',
'source' => array('path' => '0'),
'optional' => FALSE,
),
),
),
'create' => array(
'help' => 'Creates an issue',
'file' => array('file' => 'inc', 'module' => 'issue'),
'callback' => '_issue_create',
'access arguments' => array('issue service create'),
'access arguments append' => FALSE,
'args' => array(
array(
'name' => 'data',
'type' => 'struct',
'description' => 'The issue object',
'source' => 'data',
'optional' => FALSE,
),
),
),
'update' => array(
'help' => 'Updates an issue',
'file' => array('file' => 'inc', 'module' => 'issue'),
'callback' => '_issue_update',
'access callback' => '_issue_access',
'access arguments' => array('update'),
'access arguments append' => TRUE,
'args' => array(
array(
'name' => 'id',
'type' => 'int',
'description' => 'The id of the node to update',
'source' => array('path' => '0'),
'optional' => FALSE,
),
array(
'name' => 'data',
'type' => 'struct',
'description' => 'The issue data object',
'source' => 'data',
'optional' => FALSE,
),
),
),
'delete' => array(
'help' => 'Deletes an issue',
'file' => array('file' => 'inc', 'module' => 'issue'),
'callback' => '_issue_delete',
'access callback' => '_issue_access',
'access arguments' => array('delete'),
'access arguments append' => TRUE,
'args' => array(
array(
'name' => 'nid',
'type' => 'int',
'description' => 'The id of the issue to delete',
'source' => array('path' => '0'),
'optional' => FALSE,
),
),
),
'index' => array(
'help' => 'Retrieves a listing of issues',
'file' => array('file' => 'inc', 'module' => 'issue'),
'callback' => '_issue_index',
'access callback' => 'user_access',
'access arguments' => array('access content'),
'access arguments append' => FALSE,
'args' => array(
array(
'name' => 'page',
'type' => 'int',
'description' => '',
'source' => array(
'params' => 'page',
),
'optional' => TRUE,
'default value' => 0,
),
array(
'name' => 'parameters',
'type' => 'array',
'description' => '',
'source' => 'param',
'optional' => TRUE,
'default value' => array(),
),
),
),
),
);
}
У меня есть догадка, это могут быть аргументы в пользу "создания".Из того, что у меня есть, у меня есть только «данные» или тип «структура».Похоже, мне может понадобиться дополнительный аргумент для изображения?Если это так, что бы это было?
и вот где я делаю проверку и установку ошибки 406:
function _issue_create($data) {
if (isset($data) && is_array($data)) $data=(object) $data;
unset($data->id);
$data->created = time();
$data->modified = time();
if (!isset($data->email)) {
return services_error('Missing issue attribute email address', 406);
}
if (!isset($data->details)) {
return services_error('Missing issue attribute details', 406);
}
if (!isset($data->image)) {
return services_error('Missing issue attribute image', 406);
}
issue_write_issue($data);
return (object)array(
'id' => $data->id,
'uri' => services_resource_uri(array('issue', $data->id)),
);
}
Проблема в том, где я делаю проверку:
if (!isset($data->image))
Кажется, это неправильный способ проверки наличия данных изображения ... Как правильно ссылаться на данные изображения?
Заранее спасибо за помощь.