- (NSDictionary*)PostWebService:(NSString*)completeURL param:(NSString*)value
{
@try
{
NSString *urlStr =[completeURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
//NSString *urlPart=@"req=value";
//NSString *urlPart;
NSString *urlPart=[NSString stringWithFormat:@"req=%@", value];
NSLog(@"String %@",urlPart);
NSData *requestBody = [urlPart dataUsingEncoding:NSUTF8StringEncoding];
//NSLog(@"String %@",requestBody);
[request setHTTPBody:requestBody];
NSURLResponse *response = NULL;
NSError *requestError = NULL;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding] ;
NSLog(@"String %@",responseString);
NSError* error;
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData
options:kNilOptions
error:&error];
return json;
}
@catch(NSException *e)
{
NSLog(@"reason is%@",e.reason);
}
}
我在这里称这个方法..
-(NSDictionary*)gotvall:(NSString*)req
{
@try
{
NSString *vurl=@"some url/";
// vurl=[vurl stringByAppendingString:@"req="];
// vurl=[vurl stringByAppendingString:req];
// NSLog(@"%@",vurl);
NSDictionary *json=[self PostWebService:vurl param:req];
NSLog(@"json is%@",json);
return json;
}
@catch(NSException *e)
{
NSLog(@"%@",e.reason);
}
}
调试此方法后,我得到结果,因为数据参数为nil
。
任何人都可以告诉我这里做错了什么。
我得到了完整的网址,当我在浏览器上运行该网址时,我获得了完美的数据,但是当我打印json的值时,它返回null
。
答案 0 :(得分:2)
您报告的错误是:
错误域= NSURLErrorDomain代码= -1002"不支持的网址" UserInfo = 0x8d84960 {NSErrorFailingURLStringKey =%20http://www.hugosys.in/www.nett-torg.no/api/vehicl e /,NSErrorFailingURLKey =%20http://www.hugosys.in/www.nett-torg .no / api / vehicle /,NSLocalizedDescription =不支持的URL,NSUnderlyingError = 0x8d8bfe0"不支持的URL"}
您的错误消息中的%20
是您网址开头的空格,stringByAddingPercentEscapesUsingEncoding
来电已转换为%20
。如果你删除了额外的空间,你应该保持良好状态。
其他一些观察结果:
为了警告您,使用stringByAddingPercentEscapesUsingEncoding
将正确处理req
值中空格的存在。但它无法正确处理某些其他字符(特别是&
或+
)的存在。如果这些排序字符可能出现在req
值中,您可能希望删除对整个网址的stringByAddingPercentEscapesUsingEncoding
调用,而只是使用CFURLCreateStringByAddingPercentEscapes
(只有req
值,这使您可以更多地控制转义百分比过程。请参阅此答案中的percentEscapeString
方法:Append data to a POST NSURLRequest。
在网络请求和JSON解析过程中,您将返回NSError
个对象。我可能会建议您记录这些值,如果它们不是nil
,这将有助于您将来诊断问题。
我注意到您正在使用异常处理。这在Objective-C中并不常见。正如Programming in Objective-C指南所说:
处理错误
几乎每个应用都会遇到错误。其中一些错误将超出您的控制范围,例如磁盘空间不足或网络连接中断。其中一些错误将是可恢复的,例如无效的用户输入。而且,虽然所有开发人员都在努力追求完美,但偶尔会出现程序员错误。
如果您来自其他平台和语言,您可能习惯于处理大多数错误处理的异常。当您使用Objective-C编写代码时,异常仅用于程序员错误,例如越界数组访问或无效方法参数。这些是您在发布应用程序之前应该在测试期间找到并修复的问题。
所有其他错误由
NSError
类的实例表示。本章简要介绍了如何使用NSError
对象,包括如何使用可能失败的框架方法并返回错误。有关详细信息,请参阅Error Handling Programming Guide。
结论,正如我在第二点中所提到的,您应该自己检查NSError
返回值,而不是依赖于Objective-C中的异常。