У меня проблема с моим запросом 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
‹-
Кто-нибудь знает, в чем проблема?
NSDictionary *jsonDict = @{@"id":@1,@"method":@"getHolidays",@"jsonrpc":@"2.0"}; NSData *jsonData =[NSJSONSerialization dataWithJSONObject:jsonDict options:0 error:&error];
...[request setHTTPBody:jsonData];
Если вы скопируете/вставите строку JSON в средство проверки JSON, вы увидите, что она недействительна (отсутствуют кавычки, окружающие строки). Это должен быть{"id": 1,"method": "getHolidays","jsonrpc": 2.0}
, которыйNSJSONSerialization
позаботится об этом и упростит, так как он построен из словаря (проще изменить параметр). - person Larme   schedule 27.10.2016NSJSONSerialization
, а не создавать свою строку JSON самостоятельно. Это безопаснее (есть параметр ошибки, если он недействителен, его легче изменить, особенно с изменяемым NSMutableArray/Dictionary, если есть ключ, который можно добавить или нет). Также избегайтеsendSynchronousRequest:returningResponse:error:
, предпочитая асинхронные (сNSURLSession
). - person Larme   schedule 27.10.2016