2014-07-06 4 views
0

서버에 데이터를 게시하는 것은 처음입니다. 요청 형식이 있으며 요청을 보내려고하지만 오류 응답이 표시됩니다. 아래의 요청입니다 : JSON을 객관적인 c에 게시하는 방법은 무엇입니까?

{ 
    jsonrpc : 2.0, 
    method : newPatient, 
    params : { 
    data : { 
first_name : <string>, 
    middle_name : <string>,  //optional 
    last_name : <string>,   //optional 
    id_number : <string>,   //optional 
    age : <int>,    //optional 
    phone : <string>,   //optional 
    city : <string>,   //optional 
    country_id : <string>, 
    address_line : <string>,  //optional 
    email : <string>, 
    password : <string>   //hash 
} 
} 
id : 0 
} 

나는 아래의 요청을하지만 서버에 게시 할 수 없습니다! 정확한 요청을 도와 줄 수 있습니까?

NSString *jsonRequest = [NSString stringWithFormat:@"{\n\"jsonrpc\":\"2.0\",\n\"method\":\"newPatient\",\n\"params\": { \n\"data\": {\n\"first_name\":\"%@\",\n\"country_id \":\"%@\",\n\"email\":\"%@\",\n\"password\":\"%@\"\n} \n}\n \"id\":\"0\"\n}",UserName.text,UserCountry.text,Emailtextview.text,Password.text]; 
    NSLog(@"%@ jsonreq",jsonRequest); 


    jsonRequest = [NSString stringWithFormat:@"&json_data=%@",jsonRequest]; 

    NSData *json_data = [NSData dataWithBytes:[jsonRequest UTF8String] length:[jsonRequest length]]; 

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 

    [request setHTTPMethod:@"POST"]; 
    [request setHTTPBody: json_data]; 

    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[json_data length]] forHTTPHeaderField:@"Content-Length"]; 
    [request setHTTPBody:[[jsonRequest stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding] 
          dataUsingEncoding:NSUTF8StringEncoding 
          allowLossyConversion:YES]]; 

    NSURLConnection* passwordConnection = [NSURLConnection connectionWithRequest:request delegate:self]; 
    NSLog(@"passconn%@",passwordConnection); 
     NSURLResponse *response; 
     NSError *err; 

     NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err]; 
    NSLog(@"Res%@",responseData); 

    // NSData* result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err ]; 
    NSString* ResultString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
    //resultString is the returned buffer from calling the page 
    NSLog(@"error:%@", err); 
    NSLog(@"this is what the server sends:%@",Result 

문자열);

는 Console의 jsonRequest 문자열 :

{ 
"jsonrpc":"2.0", 
"method":"newPatient", 
"params": { 
"data": { 
"first_name":"hh", 
"country_id ":"Dd", 
"email":"ss", 
"password":"Dd" 
} 
} 
"id":"0" 
} 
} 
+1

1) 서버에서 오류 응답을 받으면 질문에 오류 메시지를 추가해야합니다. - 2) JSON 요청이 유효하지 않습니다 (http://jsonlint.com에서 확인). - 3) "수동으로"JSON 데이터를 만드는 대신 NSJSONSerialization을 사용하십시오. –

+0

Martin R이 답장을 보내 주셔서 감사합니다. JSON 요청이 jsonrequest 문자열이 올바르지 않아서 알 수없는 응답을 받았다고 생각하면 NSJSONSerialization을 작성하는 것이 nsdictionary이어야합니다! 문자열을 사전으로 변환하는 것을 도와 줄 수 있습니까? –

답변

0

당신의 사전을 변환 Fo로 당신이 아래의 API를 사용할 필요가 JSON 할 수 있습니다. obj 매개 변수 내에서 위의 사전 객체를 전달하십시오.

+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error 
1

귀하의 오류는 유효하지 않은 (그래서 구문 분석되지 않음) JSON으로 끝낼 있도록 jsonRequest 문자열을 만들 때 쉼표의 번호를 누락 것입니다. 이 문제를 해결할 수는 있지만 이런 방식으로 작업하는 것은 쉽지 않습니다.

대신, 보내려는 요청 콘텐츠를 구성하는 사전을 만들고 NSJSONSerialization을 사용하여 최상위 수준 사전을 보낼 데이터 페이로드로 변환하십시오.

사전을 작성하고 채울 때 텍스트 입력란 (사용자 입력)에서 오는 원본 데이터의 유효성을 검사해야하며 잘못된 콘텐츠가 포함될 수 있습니다.

마지막으로 동기 연결을 사용하여 데이터를 보내고 이것이 어디에서 트리거 될지 다시 생각해보십시오. 사용자가이 업로드를 실행하고 메인 스레드에서 실행되는 경우 업로드가 처리되는 동안 앱이 응답하지 않으므로 사용자 환경이 좋지 않습니다.

관련 문제