NSMutableURLRequest用空格替换'+'

时间:2013-06-15 21:48:16

标签: ios objective-c

我正在向服务器NSMutableURLRequest发送请求,如下所示,问题之一是电话号码并且带有“+”号的参数将被删除。

// 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 declared elsewhere.
        receivedData = /*[*/[NSMutableData data] /* retain]*/;
    } else {
        // Inform the user that the connection failed.

    }

注意,表单服务器端我正在使用Tomcat和Java 任何建议如何使用'+'符号保存参数?

2 个答案:

答案 0 :(得分:5)

问题是标准stringByAddingPercentEscapesUsingEncoding对加号没有做任何事情。尽管如此,核心基金会CFURLCreateStringByAddingPercentEscapes可以让您获得更多控制权。我使用NSString类别为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

然后我可以使用stringByAddingPercentEscapesForURLParameterUsingEncoding而不是stringByAddingPercentEscapesUsingEncoding,加号也会被转义。

答案 1 :(得分:1)

Yap,在网址中,+表示空格。您必须明确将其包含在要编码的字符列表中。

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