2012-02-18 2 views
0

Я пытаюсь ПОЧТИПАТЬ несколько простых JSON для службы RESTful. Я хочу, чтобы сформировать строку JSON, которая принимает следующий вид:IOS - Как я могу проверить JSON NSData, созданный SBJson?

{username:"someuser",password:"somepassword"} 

Мой пост держит неудачу на сервере жалуясь, что посланном значения не существуют. Однако тот же сервис отлично работает, если я создаю реализацию теста JS. Поэтому я уверен, что проблема с моей клиентской реализацией SBJson является проблемой.

NSDictionary *userDict = [[NSDictionary alloc] initWithObjectsAndKeys: 
          userName,@"username", 
          password, @"password", 
          nil]; 
SBJsonWriter *writer = [[SBJsonWriter alloc]init]; 
NSData *jsonData = [writer dataWithObject:userDict];  

У jsonData, похоже, есть размер, но он пытается сериализовать его с помощью SBJson, и это не так.

NSString *test = [writer stringWithObject:jsonData]; // returns nil 

Я пытаюсь опубликовать вышеуказанное в NSMutableURLRequest. Вот моя реализация, если это помогает дать контекст:

-(void)registerUserName:(NSString *)userName andPassword:(NSString *)password{ 
responseData = nil; 
responseData = [NSMutableData data]; 
NSDictionary *userDict = [[NSDictionary alloc] initWithObjectsAndKeys: 
          userName,@"username", 
          password, @"password", 
          nil]; 
SBJsonWriter *writer = [[SBJsonWriter alloc]init]; 
NSData *jsonData = [writer dataWithObject:userDict]; 
NSString *test = [writer stringWithObject:jsonData]; //always nil 
NSURL *url = [[NSURL alloc] initWithString:@"http://localhost/~user/app_web/index.php/user/create"]; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 
[request setHTTPMethod:@"POST"]; 
[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
[request addValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[request addValue:@"form-data" forHTTPHeaderField:@"Content-Disposition"]; 
[request setHTTPBody:jsonData]; 
[[UIApplication sharedApplication]setNetworkActivityIndicatorVisible:YES ]; 
currentRequestType = REGISTER_USER; 
NSURLConnection *connection =[[NSURLConnection alloc]initWithRequest:request delegate:self]; 

Спасибо!

обновление

Используя предложения ниже я сейчас делаю это:

NSDictionary *userDict = [[NSDictionary alloc] initWithObjectsAndKeys: 
           userName,@"username", 
           password, @"password", 
           nil]; 



    NSString *jsonString = [userDict JSONRepresentation]; 
    NSData *jsonData = [jsonString dataUsingEncoding]; 
    [request setHTTPBody:jsonData]; 
     [[UIApplication sharedApplication]setNetworkActivityIndicatorVisible:YES ]; 
     currentRequestType = REGISTER_USER; 
     NSURLConnection *connection =[[NSURLConnection alloc]initWithRequest:request delegate:self]; 

К сожалению, мои отправленные значения по-прежнему не найден на сервере. Я думаю, что что-то должно быть неправильно с моим NSMutableURLRequest.

Я использую CodeIgniter на сервере. Действие выглядит так:

public function create(){ 
    if($this->input->post('username') && $this->input->post('password')){ 
     $username = $this->input->post('username'); 
     $password = $this->input->post('password'); 
     $this->load->model('User_model','users'); 
     $status = $this->users->add_user($username,$password); 
     if($status){ 
      echo json_encode(array('success'=>true)); 
     } else{ 
      echo json_encode(array('success'=>false)); 
     } 
    } 
    echo json_encode(array('success'=>false)); // when posting I arrive here 
} 

ответ

2

Чтобы сериализовать словарь userDict, вызовите следующий метод.

NSString* jsonString = [userDict JSONRepresentation]; 

Если вы хотите представление NSData вы можете использовать следующий метод

NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8Encoding]; 
+0

Спасибо .. это действительно возвращает строку json, после которой я буду. Однако setHTTPBody: принимает NSData как параметр. Я взял строку и преобразовал ее в NSData. Проблема остается. Это должно быть причиной чего-то другого во мне. – Nick

+0

Добавлен дополнительный шаг, чтобы показать, как преобразовать его в NSData * – DHamrick

1

попробовать это:

NSDictionary *userDict = [[NSDictionary alloc] initWithObjectsAndKeys: 
         userName,@"username", 
         password, @"password", 
         nil]; 
SBJsonWriter *writer = [[SBJsonWriter alloc]init]; 
NSString *test = [writer stringWithObject:userDict]; 

не забудьте освободить их

+0

Спасибо, что дало бы мне строку JSON. Это приложение использует ARC. – Nick

Смежные вопросы