当我尝试使用json从Web服务获取数据时,data参数为nil

时间:2014-04-01 04:39:20

标签: objective-c

- (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

1 个答案:

答案 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。如果你删除了额外的空间,你应该保持良好状态。

其他一些观察结果:

  1. 为了警告您,使用stringByAddingPercentEscapesUsingEncoding将正确处理req值中空格的存在。但它无法正确处理某些其他字符(特别是&+)的存在。如果这些排序字符可能出现在req值中,您可能希望删除对整个网址的stringByAddingPercentEscapesUsingEncoding调用,而只是使用CFURLCreateStringByAddingPercentEscapes(只有req值,这使您可以更多地控制转义百分比过程。请参阅此答案中的percentEscapeString方法:Append data to a POST NSURLRequest

  2. 在网络请求和JSON解析过程中,您将返回NSError个对象。我可能会建议您记录这些值,如果它们不是nil,这将有助于您将来诊断问题。

  3. 我注意到您正在使用异常处理。这在Objective-C中并不常见。正如Programming in Objective-C指南所说:

      

    处理错误

         

    几乎每个应用都会遇到错误。其中一些错误将超出您的控制范围,例如磁盘空间不足或网络连接中断。其中一些错误将是可恢复的,例如无效的用户输入。而且,虽然所有开发人员都在努力追求完美,但偶尔会出现程序员错误。

         

    如果您来自其他平台和语言,您可能习惯于处理大多数错误处理的异常。当您使用Objective-C编写代码时,异常仅用于程序员错误,例如越界数组访问或无效方法参数。这些是您在发布应用程序之前应该在测试期间找到并修复的问题。

         

    所有其他错误由NSError类的实例表示。本章简要介绍了如何使用NSError对象,包括如何使用可能失败的框架方法并返回错误。有关详细信息,请参阅Error Handling Programming Guide

    结论,正如我在第二点中所提到的,您应该自己检查NSError返回值,而不是依赖于Objective-C中的异常。