【问题标题】:when forming request using requestWithURL, url changes & also goes missing使用 requestWithURL 形成请求时,url 更改并且也丢失了
【发布时间】:2013-03-25 03:47:15
【问题描述】:

当我在 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;
    }
    

【问题讨论】:

    标签: ios objective-c httprequest afnetworking


    【解决方案1】:

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

    NSURLRequest 将您创建它的 URL 存储在它的 - URL 属性中,您可以在 the documentation 中看到该属性。这意味着您应该能够使用类似的东西:

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

    查看网址。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      • 2011-01-17
      • 1970-01-01
      相关资源
      最近更新 更多