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

时间:2015-07-24 13:06:57

标签: ios objective-c nsurlsession

我正在关注本教程: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测试了后端,所以我知道它工作正常,但我得到的响应是#34; Invalid Request",我认为这是因为我发送的字符串不正确。我是否正确使用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;

仍然遇到同样的错误。

2 个答案:

答案 0 :(得分:2)

有几点想法:

  1. 不要使用<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <s:String x:Key="/Default/CodeInspection/CSharpLanguageProject/LanguageLevel/@EntryValue">CSharp50</s:String> </wpf:ResourceDictionary> 。自iOS 9起,它已弃用。使用NSURLConnection。请参阅 URL加载系统编程指南中的Using NSURLSession

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

    的方式相匹配

    您的服务器需要什么类型的请求? HTTPBody? XML? JSON?

    此外,您的服务器提供什么类型的响应?

  3. 如果构建x-www-form-urlencoded请求(正如您的请求正文所建议的那样),则您没有正确转义这些值的百分比(请参阅https://stackoverflow.com/a/20398755/1271826)。

  4. 如果您使用基于委托的application/x-www-form-urlencodedNSURLConnection,则不应仅仅在NSURLSession中获取结果。你需要做的是

    • 在开始请求之前实例化didReceiveData;

    • NSMutableData仅仅附加didReceiveData;

    • 只有在NSMutableDataconnectionDidFinishLoading:)或NSURLConnection(在URLSession:task:didCompleteWithError:中)被调用时,您才应该使用NSURLSession。< / p>

    或者,如果使用基于块的NSMutableData,则完全消除了这种担忧(因为您没有实现任何委托方法)。使用基于NSURLSession的{​​{1}}方法要容易得多。

  5. 如果所有这些都过于复杂,您可以考虑使用AFNetworking's completionHandler(但不是NSURLSession)来构建您的请求。它可以帮助您摆脱正确构建请求,实现委托方法等的杂草。

答案 1 :(得分:0)

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