NSMutableURLRequest reemplazó '+' por espacio

Estoy enviando la request al server NSMutableURLRequest como se muestra a continuación, se NSMutableURLRequest el problema del parámetro que es un número de teléfono y tiene el signo '+'.

 // Create the request. NSMutableURLRequest *theRequest=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:myURL ] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0]; /** add post ****/ [theRequest setHTTPMethod:@"POST"]; NSString *encodedfullNumberFinal= [ fullNumberFinal stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *append2URL=[NSString stringWithFormat:@"deviceType=%d&token=%@&mobileNumber=%@&code=%@", 1, token, encodedfullNumberFinal ,myBid ]; [theRequest setHTTPBody:[append2URL dataUsingEncoding:NSUTF8StringEncoding /*NSUnicodeStringEncoding*/]]; // create the connection with the request // and start loading the data NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; if (theConnection) { // Create the NSMutableData to hold the received data. // receivedData is an instance variable declanetworking elsewhere. receivedData = /*[*/[NSMutableData data] /* retain]*/; } else { // Inform the user that the connection failed. } 

Aviso, lado del server de formularios Estoy usando Tomcat y Java.
¿Algún consejo sobre cómo conservar el parámetro con el signo '+'?

El problema es que el stringByAddingPercentEscapesUsingEncoding estándar no hace nada con signos más. Sin CFURLCreateStringByAddingPercentEscapes , la Core Foundation CFURLCreateStringByAddingPercentEscapes le brinda más control. Y utilizo una categoría NSString que proporciona una interfaz simple a CFURLCreateStringByAddingPercentEscapes :

 @implementation NSString (UrlEncode) + (NSString *)stringByAddingPercentEscapesFor:(NSString *)string legalURLCharactersToBeEscaped:(NSString *)legalURLCharactersToBeEscaped usingEncoding:(NSStringEncoding)encoding { return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)string, NULL, (CFStringRef)legalURLCharactersToBeEscaped, CFStringConvertNSStringEncodingToEncoding(encoding) )); } - (NSString *)stringByAddingPercentEscapesFor:(NSString *)legalURLCharactersToBeEscaped usingEncoding:(NSStringEncoding)encoding { return [NSString stringByAddingPercentEscapesFor:self legalURLCharactersToBeEscaped:legalURLCharactersToBeEscaped usingEncoding:encoding]; } - (NSString *)stringByAddingPercentEscapesForURLParameterUsingEncoding:(NSStringEncoding)encoding { return [NSString stringByAddingPercentEscapesFor:self legalURLCharactersToBeEscaped:@":/?@!$&'()*+,;=" usingEncoding:encoding]; } @end 

Entonces puedo usar stringByAddingPercentEscapesForURLParameterUsingEncoding lugar de stringByAddingPercentEscapesUsingEncoding , y el signo más también se stringByAddingPercentEscapesUsingEncoding .

Yap, en las URL, + indica un espacio. Debes ser explícito sobre cómo include eso en la list de caracteres que se codificarán.

 NSString *encodedfullNumberFinal = (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes( NULL, (__bridge CFStringRef)fullNumberFinal, CFSTR(""), CFSTR("+"), // you may want to include more valid URL characters here too kCFStringEncodingUTF8, );