我需要从我的iPhone应用程序向Google文档进行HTTP发布。它适用于英语,但希伯来语在Google文档中显示为问号。
这是我正在做的:
NSString *post = [Util append:@"&entry.xxxxx=", self.firstName.text, @"&entry.yyyyyyy=", self.phone.text, @"&entry.zzzzzzzz=", self.email.text, nil];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:@"https://docs.google.com/forms/d/FORM_ID/formResponse"]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];
NSHTTPURLResponse* urlResponse = nil;
NSError *error = [[NSError alloc] init];
[NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];
我想念的是什么?
您已将Content-Type设置为application/x-www-form-urlencoded
,但尚未对内容进行url编码。
对您的帖子NSString进行URL编码,然后将Encoding更改为UTF-8(我不能告诉您原因,但是需要使其生效)。>>
NSString *post = [Util append:@"&entry.xxxxx=", self.firstName.text, @"&entry.yyyyyyy=", self.phone.text, @"&entry.zzzzzzzz=", self.email.text, nil]; post =[post stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
其他所有东西都可以保持不变。但是,您应该考虑使用异步请求。使用同步请求时,您的用户界面将变得无响应,直到请求完成为止。异步请求不会发生这种情况。
对于HTTP请求,我通常使用ASIHTTPRequest库:http://allseeing-i.com/ASIHTTPRequest/
整合到您的项目中需要花费几分钟,但是这使一切变得更加简单。您不必弄乱编码等。
NSURL *url =[NSURL URLWithString:@"https://docs.google.com/forms/d/FORM_ID/formResponse"]; ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; [request addPostValue:self.firstName.text forKey:@"entry.xxxx"]; [request addPostValue:self.phone.text forKey:@"entry.yyyy"]; [request addPostValue:self.email.text forKey:@"entry.zzzz"]; [request startAsynchronous];
就是这样。
要设置ASIHTTPRequest,请遵循以下说明http://allseeing-i.com/ASIHTTPRequest/Setup-instructions,如果使用ARC,请记住在项目设置->构建阶段->编译源
下的库文件中添加-fno-objc-arc
编译器标志。((这主要解释了为什么需要通过ASCII进行UTF-8编码。我不会解释此问题的URL编码部分,因为Tim Bodeit已经做得很好。)