POST在发送

时间:2016-09-03 19:08:05

标签: ios objective-c pdf amazon-s3

我向我的服务器发送一些字符串,它工作得非常好,但出于某种原因,当我尝试发送一个链接作为NSString时,它无法正确发送。

例如,NSString PDF_URL变量等于:

  

https://s3.amazonaws.com/the+PDFs/email%40hotmail.ca_product+name+is+something_the+keycode.PDF

在我的myRequestString PDF_URL格式正确。但是,当我查看我的电子邮件(在我的情况下,我将网址发送到我的电子邮件)时,网址最终会像这样:

  

https://s3.amazonaws.com/the PDFs/email@hotmail.ca_product name is something_the keycode.PDF

我不知道为什么客观C会替换那些角色,但它会在POST到我的服务器时执行,因为我在发送检查变量并正确格式化之前就断点了。

我的代码:

-(void)sendPDFtoEmail{

NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]];

NSURL * url = [NSURL URLWithString:@"my url"];
NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:url];



NSString *PDF_URL = [NSString stringWithFormat:@"%@%@%@%@%@%@%@", @"https://s3.amazonaws.com/the+PDFs/", email, @"_", name, @"_", keycode, @".PDF"]; 


// Create your request string with parameter name as defined in PHP file
NSString *myRequestString = [NSString stringWithFormat:@"name=%@&email=%@&keycode=%@&PDF_URL=%@", Name, email, keycode, PDF_URL];

[urlRequest setHTTPMethod:@"POST"];
[urlRequest setHTTPBody:[myRequestString dataUsingEncoding:NSUTF8StringEncoding]];

NSURLSessionDataTask * dataTask =[defaultSession dataTaskWithRequest:urlRequest
                                                   completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                                       NSLog(@"Response:%@ %@\n", response, error);
                                                       if(error == nil)
                                                       {
                                                           NSString *response = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];


                                                       }

                                                   }];
[dataTask resume];

}

也不是我的PHP,因为我在Android中将相同的字符串URL发送到同一个PHP,当我检查我的电子邮件时,链接没有格式化。

1 个答案:

答案 0 :(得分:0)

好吧,当你将www-form-urlencode字符串空格转换为+符号时(你可以在这里查看:http://www.url-encode-decode.com/)。因此,如果您想要实际传递+符号,则需要先对字符串进行编码。似乎Android本身就是这样,而iOS则不然。这就是为什么你从这两个平台得到不同的结果。

这可以帮到你:

NSCharacterSet *allowedChars = [NSCharacterSet URLQueryAllowedCharacterSet];
NSString *PDF_URL = [NSString stringWithFormat:@"%@%@%@%@%@%@%@", @"https://s3.amazonaws.com/the+PDFs/", email, @"_", name, @"_", keycode, @".PDF"];
NSString *encodedPDF_URL = [PDF_URL stringByAddingPercentEncodingWithAllowedCharacters:allowedChars];

这篇维基百科文章也值得一读:https://en.wikipedia.org/wiki/Percent-encoding#The_application.2Fx-www-form-urlencoded_type

还值得检查文档,因为还有其他预定义的集合用于编码其他URL组件 - > https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSCharacterSet_Class/#//apple_ref/occ/clm/NSCharacterSet/URLQueryAllowedCharacterSet