Почему API отклоняет мой JSON?

Я могу добавить объект в API через JSON, когда отправляю запрос с помощью byte char[], однако он не работает, когда я конвертирую NSDictionary в NSData и отправляю его. В чем проблема?

Вот когда это работает.

// Request

NSURL* URL = [NSURL URLWithString:@"SOME URL"];
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:URL];
request.HTTPMethod = @"POST";
request.timeoutInterval = 30.000000;

// Headers

[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request addValue:@"application/json" forHTTPHeaderField:@"Accept"];

// Body

const char bytes[98] = "{\n\t\"user\" :\n\t{\n\t\t\"email\" : \"[email protected]\",\n\t\t\"username\" : \"example\",\n\t\t\"password\" : \"cryptx\"\n\t}\n}";
request.HTTPBody = [NSData dataWithBytes:bytes length:98];

// Connection

NSURLConnection* connection = [NSURLConnection connectionWithRequest:request delegate:nil];
[connection start];

Это когда не работает:

    - (void)addUser:(User *)user
{
    NSURL* URL = [NSURL URLWithString:@"API_URL"];
    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:URL];
    request.HTTPMethod = @"POST";
    request.timeoutInterval = 30.000000;
    [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request addValue:@"application/json" forHTTPHeaderField:@"Accept"];
    NSData *data = [self createJSONWithUsername:@"X" andEmail:@"[email protected]" andPassword:@"pass"];
    [request setHTTPBody:data];
    NSLog(@"%@", [[NSString alloc] initWithData:request.HTTPBody encoding:NSUTF8StringEncoding]);
    NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
    [connection start];
}

- (NSData *)createJSONWithUsername:(NSString *)username andEmail:(NSString *)email andPassword:(NSString *)password
{
    NSArray *objects = [NSArray arrayWithObjects:password, email, username, nil];
    NSArray *keys = [NSArray arrayWithObjects:@"password", @"email", @"username", nil];
    NSDictionary *userDataDictionary = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
    NSDictionary *userDictionary = [NSDictionary dictionaryWithObjectsAndKeys:userDataDictionary, @"user", nil];

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:userDictionary options:NSJSONWritingPrettyPrinted error:nil];
    return jsonData;
}

Второй не добавляет пользователя, а второй добавляет.

РЕДАКТИРОВАТЬ

JSON ОТПРАВЛЯЕТСЯ, т.е. переменная jsonString

{
  "user" : {
    "email" : "[email protected]",
    "username" : "X",
    "password" : "pass"
  }
}

person Objective-J    schedule 18.03.2014    source источник
comment
Я не могу не заметить, что const char byte[96] имеет длину 98 символов... Я не работаю с Objective-C, поэтому понятия не имею, является ли это проблемой. (Во всяком случае, это в случае с этим работает.)   -  person T.J. Crowder    schedule 18.03.2014
comment
Возможно, вам действительно стоит выгрузить JSON, который вы создаете, и показать его нам.   -  person Hot Licks    schedule 18.03.2014
comment
Действительно, отправной точкой является всегда просмотр фактически отправляемых и отклоняемых данных. Единственный пример JSON в вопросе относится к случаю this work, что не так уж и полезно.   -  person T.J. Crowder    schedule 18.03.2014
comment
@HotLicks - приближается JSON ..   -  person Objective-J    schedule 18.03.2014
comment
Кстати: почему вы создаете объект NSData (jsonData), преобразуя его в NSString (jsonString) и обратно в NSData (data)?   -  person lootsch    schedule 18.03.2014
comment
@lootsch - это было где-то в сети. В любом случае, будет ли это иметь значение?   -  person Objective-J    schedule 18.03.2014
comment
@Objective-J не должно   -  person lootsch    schedule 18.03.2014
comment
В отправляемом JSON отсутствует закрывающий }. Это полный пример?   -  person Joe    schedule 18.03.2014
comment
@Джо исправил это. Добавлен }   -  person Objective-J    schedule 18.03.2014
comment
вам определенно не нужен бит, когда вы конвертируете данные в строку, а затем обратно. Просто получите данные из словаря и отправьте эти данные.   -  person Cocoadelica    schedule 18.03.2014
comment
Вы должны указать адрес указателя error* для операции NSJSONSerialization, затем после операции проверить результат на nil и, если nil, вывести значение ошибки.   -  person Hot Licks    schedule 18.03.2014
comment
Да, передайте NSData из своей подпрограммы, а не NSString.   -  person Hot Licks    schedule 18.03.2014
comment
Я отредактировал ответ.   -  person Objective-J    schedule 18.03.2014
comment
(Ваш JSON, отправленный выше, является допустимым JSON. Конечно, это может быть не то, что ожидает другой конец.)   -  person Hot Licks    schedule 18.03.2014
comment
(И обратите внимание, что если ваш JSON отклоняется, другой конец, вероятно, предоставляет какое-то полузначащее сообщение об ошибке.)   -  person Hot Licks    schedule 18.03.2014
comment
Это проблема. Он принимает его с кодом 200 OK. Но он просто не добавлен в базу данных.   -  person Objective-J    schedule 18.03.2014
comment
Исправил простым способом. Спасибо всем за ваш вклад.   -  person Objective-J    schedule 18.03.2014


Ответы (1)


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

- (void)addUser:(NSDictionary *)sentuserdetails {
  NSURL *url = [NSURL URLWithString:@"SOME URL"];
  NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];
  request.HTTPMethod = @"POST";
  request.timeoutInterval = 30.000000;
  [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
  [request addValue:@"application/json" forHTTPHeaderField:@"Accept"];
  NSData *jsonData = [NSJSONSerialization dataWithJSONObject:sentuserdetails      options:NSJSONWritingPrettyPrinted error:nil]; //don't set error to nil, handle the error
  [request setHTTPBody:jsonData];
  NSURLConnection *connection = [NSURLConnection connectionWithRequest:request           delegate:self];
  [connection start];
}
person Cocoadelica    schedule 18.03.2014