2012-07-11 12 views
7

Deseo enviar un nuevo objeto creado en iOS a un servidor receptor con un método POST utilizando el tipo de datos JSON. De lo que sé sobre la recepción de datos desde el servidor en iOS, es que todo el manejo de JSON fue simplificado por Apple con la introducción de iOS 5. Pero a diferencia de OBTENER objetos JSON, POSTing esos realmente no se describe en ningún lugar que pueda encontrar ...¿Cómo PUESO un objeto de datos JSON al servidor en iOS5?

los primeros pasos que tomó para tratar de resolver el problema parecía como sigue:

//build an info object and convert to json 
    NSDictionary *newDatasetInfo = [NSDictionary dictionaryWithObjectsAndKeys:name, @"name", language, @"language", nil]; 

    //convert object to data 
    NSData* jsonData = [NSJSONSerialization dataWithJSONObject:newDatasetInfo options:kNilOptions error:&error]; 

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:someURLSetBefore]; 
    [request setHTTPMethod:@"POST"]; 
    // any other things to set in request? or working this way? 

    [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    // What to do with NSURLConnection? Or how to send differently? 

Pero realmente no sé cómo enviar un objeto JSON a un servidor utilizando un método POST en absoluto. ¿Alguien podría ayudarme?

Respuesta

16

I trabajado a cabo tratando un poco alrededor, aquí está mi código:

//build an info object and convert to json 
    NSDictionary *newDatasetInfo = [NSDictionary dictionaryWithObjectsAndKeys:name, @"name", language, @"language", nil]; 

    //convert object to data 
    NSData* jsonData = [NSJSONSerialization dataWithJSONObject:newDatasetInfo options:kNilOptions error:&error]; 

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:someURLSetBefore]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
    [request setHTTPBody:jsonData]; 

    // print json: 
    NSLog(@"JSON summary: %@", [[NSString alloc] initWithData:jsonData 
                encoding:NSUTF8StringEncoding]); 
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    [connection start]; 
+0

Podría posiblemente más detalles sobre lo que está sucediendo en su código? Lo he usado en mi propia aplicación ahora, pero honestamente no sé mucho sobre lo que está haciendo. Comprendo el diccionario y convirtiéndolo en datos para JSON, pero todo con el URLRequest y el URLConnection es desconocido para mí. ¡Cualquier aclaración sería genial! – Jonathan

+1

Un NSURLRequest es básicamente un objeto para establecer las propiedades de su búsqueda web. En las recuperaciones normales, los valores predeterminados más utilizados se configuran automáticamente, pero como deseo enviar datos, quiero usar el método HTTP POST y porque quiero recibir un objeto JSON, se lo digo al servidor estableciendo el tipo de contenido. y Aceptar campos de encabezado HTTP en formato JSON. Para obtener más información sobre el protocolo HTTP y especialmente sobre el encabezado HTTP, simplemente búsquelos o lea aquí http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol y aquí http://en.wikipedia.org/wiki/List_of_HTTP_header_fields. – CGee

+0

Para obtener más información sobre NSURLConnection, creo que la mejor manera es simplemente leer su referencia de clase en la documentación de Apple aquí https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/ Reference.html. En general, solo puedo alentarlo a que primero eche un vistazo a la documentación de Apple, ya que es una gran fuente (y definitivamente actualizada) para aprender estas cosas. – CGee

0
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://webstar52.com/demo/webcommunity/work.php"]]]; 
    NSString *post = [NSString stringWithFormat:@"&tag=%@&user_id=%@",@"getcontact",@"10408"]; 
    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    NSString *postLength = [NSString stringWithFormat:@"%d",[postData length]]; 
    [request setHTTPMethod:@"POST"];  
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Current-Type"]; 
    [request setHTTPBody:postData]; 
    conn = [[NSURLConnection alloc]initWithRequest:request delegate:self]; 
1

NSString * strURL = @ "URL"; NSURL * url = [NSURL URLWithString: strUrl];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0]; 

// For set postdata in string 
NSString *strPatientID = [NSString stringWithFormat:@"%@%@%@%@",self.txtDegit1.text,self.txtDegit2.text,self.txtDegit3.text,self.txtDegit4.text]; 
NSString *deviceToken = @""; 
postString = [NSString stringWithFormat:@"practiceid=%@&email=%@&password=%@&devicetoken=%@",strPatientID,self.txtUsername.text,self.txtPassword.text,deviceToken]; 


NSMutableData *httpDataBody = [NSMutableData data]; 
[httpDataBody appendData:[postString dataUsingEncoding:NSUTF8StringEncoding]]; 

NSString *strPostLength = [NSString stringWithFormat:@"%lu",[httpDataBody length]]; 

if ([httpDataBody length ] > 0){ 

    [request addValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPMethod:@"POST"]; 
    [request addValue:strPostLength forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPBody:httpDataBody]; 

} 

urlConnection = [[NSURLConnection alloc]initWithRequest:request delegate:self]; 
[urlConnection start]; 
2
- (IBAction)txtFetchData2:(id)sender { 
NSString *queryString = [NSString stringWithFormat:@"http://example.com/username.php?name=%@", [self.txtName text]]; 
NSMutableURLRequest *theRequest=[NSMutableURLRequest 
          requestWithURL:[NSURL URLWithString: 
              queryString] 
          cachePolicy:NSURLRequestUseProtocolCachePolicy 
          timeoutInterval:60.0]; 
NSDictionary* jsonDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
           @"Value1", @"Key1", 
           @"Value2", @"Key2", 
           nil]; 
NSError *error; 
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:jsonDictionary 
         options:NSJSONWritingPrettyPrinted error:&error]; 
[theRequest setHTTPMethod:@"POST"]; 
[theRequest addValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
// should check for and handle errors here but we aren't 
[theRequest setHTTPBody:jsonData]; 
[NSURLConnection sendAsynchronousRequest:theRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
    if (error) { 
     //do something with error 
    } else { 
     NSString *responseText = [[NSString alloc] initWithData:data encoding: NSASCIIStringEncoding]; 
     NSLog(@"Response: %@", responseText); 

     NSString *newLineStr = @"\n"; 
     responseText = [responseText stringByReplacingOccurrencesOfString:@"<br />" withString:newLineStr];    
     [self.lblData setText:responseText]; 
    } 
}]; 
} 
Cuestiones relacionadas