NSMutableURLRequest用空格替换了“+”号

3
我正在向服务器发送请求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个回答

5
问题在于标准的 stringByAddingPercentEscapesUsingEncoding 方法对加号不做转义处理。不过,Core Foundation 的 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
在URL中,+表示一个空格。您必须明确地将其包含在要编码的字符列表中。
NSString *encodedfullNumberFinal = (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(
    NULL,
    (__bridge CFStringRef)fullNumberFinal,
    CFSTR(""),
    CFSTR("+"), // you may want to include more valid URL characters here too
    kCFStringEncodingUTF8,
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接