我的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
< -
有谁知道问题是什么?
答案 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}})