繁体   English   中英

使用NSURLSession进行POST,发布变量的正确方法是什么?

[英]Using NSURLSession to POST, what is the correct way to post the variables?

我正在学习本教程: http : //www.raywenderlich.com/2965/how-to-write-an-ios-app-that-uses-a-web-service 尝试设置基本的Web服务。 似乎该教程是旧材料,并且ASIHTTPRequest不再继续。 我一直在尝试使用NSURLRequest代替。 第一个问题,NSURLRequest是执行此操作的标准方法吗? 我只想要基本的GET,POST等内容,是否应该以其他方式进行?

我的代码是:

-(BOOL)textFieldShouldReturn:(UITextField *)textField{

    NSLog(@"We want to unlock for the code %@",self.textField.text);

    //Get a device ID, (actually can't do this aymore)
    NSString *uniqueIdentifier = @"My iPhone";
    NSString *code = self.textField.text;


    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.madasd.co/promos/"]];

    request.HTTPMethod=@"POST";

    //Set the header fields
    [request setValue:@"application/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

    NSString *myString = [NSString stringWithFormat:@"rw_app_id=1&code=%@&device_id=%@",code,uniqueIdentifier];
    NSLog(@"%@",myString);
    NSData *requestBodyData = [myString dataUsingEncoding:NSUTF8StringEncoding];
    request.HTTPBody=requestBodyData;

    //Create url and fire request

    NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];

    [conn start];


    return TRUE;
}



- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{


    NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@",string);

}

第二个问题,我已经使用curl测试了后端,因此我知道它可以正常工作,但是我得到的响应是“无效请求”,我认为这是因为我发送的字符串不正确。 我是否使用var名称和&运算符正确执行此操作? 任何有关此的指示都很棒! 谢谢。 (在Linode上运行LAMP服务器!)

编辑:

还尝试过以JSON发送:

[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request addValue:@"application/json" forHTTPHeaderField:@"Accept"];
NSDictionary *mapData = [[NSDictionary alloc]initWithObjectsAndKeys:@"1",@"rw_app_id",code,@"code",uniqueIdentifier,@"device_id", nil];
NSError *error = nil;
NSData *requestBodyData = [NSJSONSerialization dataWithJSONObject:mapData options:0 error:&error];
request.HTTPBody=requestBodyData;

仍然出现相同的错误。

一些想法:

  1. 不要使用NSURLConnection 从iOS 9开始不推荐使用。使用NSURLSession 请参阅《 URL加载系统编程指南》中的“ 使用NSURLSession ”。

  2. 确定您需要准备的请求类型。 您在标头中指定了application/xml ,但正在创建一个application/x-www-form-urlencoded请求。 您的Content-Type标头必须与您构建HTTPBody

    您的服务器需要什么类型的请求? x-www-form-urlencoded XML? JSON?

    另外,您的服务器提供哪种类型的响应?

  3. 如果构建一个application/x-www-form-urlencoded请求(如请求主体所建议),则不能正确地对值进行转义(请参见https://stackoverflow.com/a/20398755/1271826 )。

  4. 如果您使用基于委托NSURLConnectionNSURLSession ,你不应该只抓的结果didReceiveData 您需要做的是

    • 在启动请求之前实例化NSMutableData

    • didReceiveData仅附加到该NSMutableData ;

    • 只有在URLSession:task:didCompleteWithError: connectionDidFinishLoading:NSURLConnection )或URLSession:task:didCompleteWithError:NSURLSession )时,才应使用NSMutableData

    另外,如果使用基于块的NSURLSession ,则可以完全消除这种担心(因为您没有实现任何委托方法)。 使用基于NSURLSession completionHandler的方法要容易得多。

  5. 如果所有这些都太复杂,则可以考虑使用AFNetworking的 AFHTTPSessionManager (而不是AFHTTPRequestOperationManager )来构建请求。 它使您摆脱了正确构建请求,实现委托方法等的麻烦。

您可能需要将字符串包装到字典中,并从对NSJSONSerialization的调用中获取NSData对象。 虽然这取决于服务器期望的形式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM