当使用requestWithURL形成请求时,url更改&也失踪了

时间:2013-03-25 03:47:16

标签: ios objective-c httprequest afnetworking

当我在xcode调试模式下研究这个方法时,在构造请求时会发生一些奇怪的事情。

  1. 额外字符会添加到urlString。例如,if SessionId = "abc",然后在执行从NSURLRequest *request...开始的行之后,调试器显示SessionUrlString = "...session/abc\x03" instead of simply "...session/abc"。尽管调试器仍然显示SessionId = "abc"。这是为什么?
  2. 请求对象似乎不包含url 在任何地方,即使它的构造函数只是将url作为变量。它去了哪里?它是存储在AFHTTPCLient对象中的某个请求对象中吗?

    -(NSObject*)makeRequestForSessionUsingId: (NSString *)SessionId{
    
      NSString *baseSessionURLString = [kCwAPIBaseURLString stringByAppendingString:@"session/"];
      NSString *SessionURLString = [baseSessionURLString stringByAppendingString:SessionId];
    
      NSURL *url = [NSURL URLWithString:SessionURLString];
      NSURLRequest *request = [NSURLRequest requestWithURL:url];
      __block NSObject *sessionJSON = [[NSObject alloc] init];
    
      AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        NSLog(@"IP Address: %@", [JSON valueForKeyPath:@"origin"]);
        sessionJSON = JSON;
    } failure:nil];
    
      [operation start];
      return sessionJSON;
    }
    

1 个答案:

答案 0 :(得分:0)

我不确定是什么导致了URL字符串中的尾随字符,但是如果你可以在NSLog语句中输出它并且它正确显示它可能是正确的。

NSURLRequest将您创建的网址存储在- URL属性中,您可以在the documentation中看到该属性。这意味着您应该可以使用以下内容:

NSLog(@"Request URL: %@", [request URL]);

查看网址。

我在这里看到的更大问题是你的回归模式。如果此AFJSONRequestOperation花费任何时间,则返回的值将为空sessionJSON变量。当您运行[operation start];时,默认情况下,操作不会在返回您指定的值之前等待完成。有一种方法可以让它等待,但你永远不想阻止等待网络请求的任何线程可能需要比你希望的更长的时间。你可以在这里做一些其他的选择,但主要是你必须以不同的方式思考它。您想要对网络请求的响应做的所有事情都需要在成功和失败块中完成。此方法不应尝试返回值(除非它以另一个块的形式)。有些方法可以做到这一点:

  1. 将响应JSON存储在班级的@property中。执行此操作后,调用方法[self foo];,然后使用存储的响应执行您想要的操作。
  2. 在块中调用传递响应json [self foo:JSON]
  3. 的方法
  4. 以响应作为对象发布NSNotification
  5. 将一个块传递给此方法,然后调用该方法将响应传递回原始调用方。