Отправка JSON на сервер drupal дает «Неверный метод» в Задаче C - PullRequest
0 голосов
/ 04 сентября 2011

Я пишу приложение для iPhone и пытаюсь отправить POST-запрос на сервер drupal с объектом JSON, но он всегда возвращает мне

{"# error": true, "# data":«Неверный метод

Я пытался выполнить следующее:

NSMutableURLRequest *urlReq = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://xxxxxxx/services/json"]];

[urlReq setHTTPMethod:@"POST"];

[urlReq setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

NSString *stringBody = @"{data:{\"method\":\"views.get\",\"view_name\":\"words\",\"args\":[\"wod_businessspotlight\"],\"limit\":365}}";

NSData *dataBody = [stringBody dataUsingEncoding:NSUTF8StringEncoding];

[urlReq setValue:[NSString stringWithFormat:@"%d", [dataBody length]] forHTTPHeaderField:@"Content-Length"];

[urlReq setHTTPBody:dataBody];

NSURLConnection *con = [[NSURLConnection alloc] initWithRequest:urlReq delegate:self];

[con start];

Я видел похожую проблему на iPhone + Drupal + JSON RPC Server , но этоt Где я могу найти класс SBJSON и метод JSONFragment.

Также я скачал https://github.com/stig/json-framework/, но нигде не смог найти метод JSONFragment. **

это. Заранее спасибо.

1 Ответ

0 голосов
/ 21 октября 2011

Если у вас все еще возникают проблемы с этим, я предлагаю использовать ASIHTTPRequest , что делает проблему тривиальной.

Для вашего конкретного примера views.get у вас есть параобязательные аргументы, которые вам нужно отправить: хеш, имя домена, временная метка домена, одноразовый номер и имя представления.Затем у вас есть несколько других необязательных параметров.

Я предполагаю, что вы используете сервисный модуль, однако если вы используете версию 3.x, вы можете использовать DIOS (drupal-ios-sdk), я слышал многохорошие вещи об этом.Однако, если вы используете 2.x или просто хотите сделать это самостоятельно, вот рабочий пример:

NSURL *url = [NSURL URLWithString:endpoint]; //endpoint:domain.com/services/json

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:@"view.get" forKey:@"method"];
[request setPostValue:[hash JSONString] forKey:@"hash"];
[request setPostValue:[domain JSONString] forKey:@"domain_name"];
[request setPostValue:timestamp forKey:@"domain_time_stamp"];
[request setPostValue:[nonce JSONString] forKey:@"nonce"];
[request setPostValue:[viewName JSONString] forKey:@"view_name"];
[request startSynchronous];

NSDictionary *deserializedData = 
           [[[[request responseData] objectFromJSONData] JSONString]
                                     objectFromJSONString];
NSArray *resultList = [deserializedData objectForKey:@"data"];

Как видите, только типы данных, отличные от int, за исключением имени метода, должны быть в кодировке JSON.Я не знаю, является ли это лучшей практикой, но до сих пор это работало для меня.(: Как примечание, я использую JSONKit , потому что он очень прост, всего два файла, и, по словам основного автора, превосходит все остальные по эффективности ...

Если вам нужны какие-либо подробности о том, как выполнять хеширование, пожалуйста, дайте мне знать. Создавать это было очень сложно, но я думаю, что я нашел хорошие, эффективные способы сделать это, я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...