我正在尝试使用基于 Codeigniter 的 API 来连接 iOS 并使用 NSURLRequest。 该 API 位于
debugMode
中,目前它返回与您发布的 JSON 相同的键值对。我已尝试通过邮递员将值发布到链接,并且它可以正常工作,但是当我通过 iOS 应用程序发布它时,会收到 JSON 响应,但应包含发布值的数组为空。
这是 iOS 代码片段:
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",BASEURL,service]];
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:request delegate:self];
NSString * params = @"authkey=waris";
NSData * postData = [params dataUsingEncoding:NSUTF8StringEncoding];
NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[postData length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];;
[request setHTTPMethod:@"POST"];
[request setHTTPBody:postData];
NSLog(@"Posting : '%@' to %@",params,url);
[connection start];
这是我通过 Postman(Chrome 的 RESTFUL 客户端)发布相同参数时的响应
{
"status": "1",
"data": {
"authkey": "warisali"
}
}
但是,当我从上面的 iOS 代码查询相同的 API 时,我得到了这个:
{
data = 0;
status = 1;
}
任何有关此事的帮助将不胜感激!
我有同样的问题(不是 CodeIgniter 而是 Ruby ...) 尝试这样的方法,解决了我的问题。
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",BASEURL,service]];
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:request delegate:self];
NSDictionary *paramDict = @{@"authkey": @"waris"};
NSError *error = nil;
NSData *postData = [NSJSONSerialization dataWithJSONObject:paramDict options:NSJSONWritingPrettyPrinted error:&error];
if (error)
{
NSLog(@"error while creating data %@", error);
return;
}
NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[postData length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];;
[request setHTTPMethod:@"POST"];
[request setHTTPBody:postData];
NSLog(@"Posting : '%@' to %@",params,url);
[connection start];
我最终使用了 ASIHttpRequest + SBJson 组合,效果非常好!
添加 ASIHttpRequest 核心类和 SBJson 类来解析 JSON 后,我能够实现我想要的!
问题在于,由于您创建连接的方式,它会在您完成配置请求之前立即启动。因此,您正在创建一个可变请求,创建并启动连接,然后尝试修改请求,然后尝试再次启动请求。
您可以通过更改以下行来解决此问题:
NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:request delegate:self];
说:
NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
或者更简单,只需在完成请求配置后移动
NSURLConnection
的原始实例(不带 startImmediately:NO
),然后完全消除 [connection start]
行。