【问题标题】:Sending JSON to drupal server gives "Invalid Method" in Objective C将 JSON 发送到 drupal 服务器会在 Objective C 中给出“无效方法”
【发布时间】:2011-09-04 18:39:52
【问题描述】:

我正在编写一个 iPhone 应用程序并尝试使用 JSON 对象向 drupal 服务器发送 POST 请求,但它总是返回我

{"#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 problem 看到过类似的问题,但没有提到在哪里可以找到 SBJSON 类和 JSONFragment 方法。

我也下载了https://github.com/stig/json-framework/,但在任何地方都找不到 JSONFragment 方法。**

请帮我解决这个问题。 提前致谢。

【问题讨论】:

    标签: javascript objective-c drupal


    【解决方案1】:

    如果您仍然遇到此问题,我建议使用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,因为它非常简单,只有两个文件,而且根据主要作者的说法,它在效率方面胜过所有其他人......

    如果您想了解有关如何进行散列的任何详细信息,请告诉我。创作很痛苦,但我想我找到了一些不错的高效方法。

    【讨论】:

    • 顺便说一句,如果您仍想使用服务 2 使用的 API 密钥身份验证,此方法特别好...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    相关资源
    最近更新 更多