Objective-C JSON-RPC请求问题

时间:2016-10-27 15:29:11

标签: objective-c json json-rpc

我的JSON-RPC查询存在问题。

NSString *jsonString = @"{id:1,method:getHolidays,jsonrpc:2.0}";
NSString *requestString = [NSString stringWithFormat:@"%@",jsonString,nil];

NSData *requestData = [NSData dataWithBytes: [jsonString UTF8String] length: [requestString length]];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString:@"https://neilo.webuntis.com/WebUntis/jsonrpc.do?school=htl_v%C3%B6cklabruck"]];

[request setHTTPMethod: @"POST"];
[request setValue:@"Content-type: application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:requestData];

NSData *returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil ];
NSString *returnString = [[NSString alloc] initWithData:returnData encoding: NSUTF8StringEncoding];

NSLog(@"\n\n\noutput: %@",returnString);

结果我得到了这个输出:

  

{“jsonrpc”:“2.0”,“id”:null,“error”:{“code”: - 32700,“message”:“解析错误:意外字符('i'(代码105)):期待双引号开始字段名称\ n在[来源:org.apache.catalina.connector.CoyoteInputStream@7a1efafd;行:1,列:3]“}}

结果应该是: - > message = not-authenticated< -

有谁知道问题是什么?

1 个答案:

答案 0 :(得分:0)

  

期待双引号开始字段名称:

您的服务器告诉您JSON无效。

如果您在JSON验证器(例如http://jsonlint.com/)上测试{id:1,method:getHolidays,jsonrpc:2.0},它会告诉您。如上所述,它缺少每个字符串的周围引号(键/值):{"id": 1,"method": "getHolidays","jsonrpc": 2.0}有效。

所以,正如您尝试@"{\"id\":\"1\",\"method\":\"getHolidays\",\"jsonrpc\":\"2.0‌​\"}"一样。

我建议使用NSJSONSerialization,未经测试的样本(可能无法编译):

NSDictionary *jsonDict = @{@"id":@1,
                           @"method":@"getHolidays",
                           @"jsonrpc":@"2.0"};
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:0 error:&error];
...
[request setHTTPBody:jsonData];

您不必逃离"(例如\"),如果您的参数有条件,请说if(someReason){doNotPutmethodKeyInJSON},{ {1}},它更容易阅读,也更容易阅读(尤其是包含所有NSMutableDictionary的新字符串,因此更难以阅读可能存在的问题) 此外,如果JSON无效,您可以阅读\"

我不知道您放置该代码的位置,但如果它是主线程,则会阻止用户界面,因此请避免error,更喜欢异步调用(在{{的帮助下) 1}})