Pregunta

Estoy enviando una cadena Base64 al servidor PHP y funciona bien. Ahora quiero enviar otro parámetro como cadena. ¿Alguien puede decirme qué código debe agregar el siguiente código?

El siguiente código funciona bien para un solo parámetro. ¿Cómo podemos modificarlo para múltiples parámetros?

 NSData *data = [UIImageJPEGRepresentation(imgeview.image,90) base64Encoding];

// Create your request string with parameter name as defined in PHP file
NSString *myRequestString = [NSString stringWithFormat:@"question_image=%@",data];
myRequestString = [myRequestString stringByReplacingOccurrencesOfString:
                                             @"+" withString:@"%2B"];

// Create Data from request
NSData *myRequestData = [NSData dataWithBytes:[myRequestString UTF8String] 
                                       length:[myRequestString length]];
request = [[NSMutableURLRequest alloc] initWithURL:
    [NSURL URLWithString:@"http://192.168.0.101/Mobile_tutor/webservice/question_details.php"]];
// set Request Type
[request setHTTPMethod:@"POST"];
// Set content-type
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];
// Set Request Body
[request setHTTPBody:myRequestData];
// Now send a request and get Response
NSData *returnData = [NSURLConnection sendSynchronousRequest:request 
                                           returningResponse:nil 
                                                       error: nil];
// Log Response
NSString *response = [[NSString alloc] initWithBytes:[returnData bytes] 
                                              length:[returnData length]
                                            encoding:NSUTF8StringEncoding];
NSLog(@"-------------%@",response); // here you get reasponse string
¿Fue útil?

Solución

Para la operación de red, estos son mejores API de soporte como AfNetworking disponible Witch Work Async y mucho mejor para manejar

Tutoriales para AfNetworking

Obtenga de aquí

NSArray *keys = @[@"UserID", ];
NSArray *objects = @[@(userId)];

NSDictionary *parameter = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:
                            [NSURL URLWithString:BaseURLString]];
[httpClient setParameterEncoding:AFJSONParameterEncoding];
[httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];

NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST"
                                                        path:@"services/UserService.svc/GetUserInfo"
                                                  parameters:parameter];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

    NSError* error = nil;
    id jsonObject = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:&error];
    if ([jsonObject isKindOfClass:[NSDictionary class]]) {
        // do what ever
    }
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

}];

Otros consejos

Dado un NSDictionary "parámetros" cuyas claves y valores son cadenas y donde cada entrada representa una Parámetro (nombre/valor) Puede definir una categoría de ayuda:

@interface NSDictionary (FormURLEncoded)
-(NSData*) dataFormURLEncoded;
@end

dataFormURLEncoded Devuelve una secuencia de caracteres codificada correctamente de los parámetros dados en el diccionario.

El algoritmo de codificación se especifica por W3C: Datos de formulario codificados por URL / algoritmo de codificación de aplicación / x-www-form-urlencoded

Se puede implementar de la siguiente manera:

Primero, una función de ayuda que codifica un nombre de parámetro, respectivamente, un valor de parámetro:

static NSString* x_www_form_urlencoded_HTML5(NSString* s)
{
    // http://www.w3.org/html/wg/drafts/html/CR/forms.html#application/x-www-form-urlencoded-encoding-algorithm   , Editor's Draft 24 October 2013
    CFStringRef charactersToLeaveUnescaped = CFSTR(" ");
    CFStringRef legalURLCharactersToBeEscaped = CFSTR("!$&'()+,/:;=?@~");
    
    NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
                                             kCFAllocatorDefault,
                                             (__bridge CFStringRef)s,
                                             charactersToLeaveUnescaped,
                                             legalURLCharactersToBeEscaped,
                                             kCFStringEncodingUTF8));
    return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"];
}

Finalmente, dataFormURLEncoded compone la secuencia de caracteres de los parámetros codificados. Un "parámetro" se compusirá concatenando el codificado name, = y codificado value:

parameter := name "=" value

Luego, la lista de parámetros se compusirá concatenando los parámetros separándolos por un "&":

parameters  := parameter ["&" parameter]

Se puede implementar como se muestra a continuación:

@implementation NSDictionary (FormURLEncoded)

-(NSData*) dataFormURLEncoded {
    NSMutableData* data = [[NSMutableData alloc] init];
    BOOL first = YES;
    for (NSString* name in self) {
        @autoreleasepool {
            if (!first) {
                [data appendBytes:"&" length:1];
            }
            NSString* value = self[name];
            NSData* encodedName = [x_www_form_urlencoded_HTML5(name) dataUsingEncoding:NSUTF8StringEncoding];
            NSData* encodedValue = [x_www_form_urlencoded_HTML5(value) dataUsingEncoding:NSUTF8StringEncoding];
            
            [data appendData:encodedName];
            [data appendBytes:"=" length:1];
            [data appendData:encodedValue];
            first = NO;
        }
    }
    return [data copy];
}

@end

Nota: La secuencia de caracteres codifica las cadenas usando UNICODE UTF-8.

Ejemplo:

Dados sus parámetros:

NSDictionary* params = @{@"a": @"a a", @"b": @"b+b", @"c": @"ü ö"};
NSData* encodedParamData = [params dataFormURLEncoded];

Ahora, encodedParamData se agregará a su cuerpo cuyo tipo de contenido es application/x-www-form-urlencoded.

La cadena de parámetros codificados se convierte en:

a = a+a & b = b%2bb & c =%c3%bc+%c3%b6

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top