0

开始与实现 Oauth 的 Web 服务 API 通信。实施 OauthConsumer 并开始使用 GET 方法构建和检索数据。一切正常,直到我尝试使用 XML 正文的 POST 方法。
起初我开始找错树,直到我发现了一些帮助我更接近解决问题的金块

  • 我需要设置 Content-Type
  • 我需要在设置 setHTTPBody 方法之前准备好请求

    OAMutableURLRequest *request = [[OAMutableURLRequest alloc] initWithURL:url
                       consumer:consumer
                          token:accessToken
                          realm:nil
              signatureProvider:nil];
    
    
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/xml" forHTTPHeaderField:@"Content-Type"];
    [request prepare];
    
    [request setHTTPBody:[xml dataUsingEncoding:NSUTF8StringEncoding]];
    
    OADataFetcher *fetcher = [[OADataFetcher alloc] init];
    
    [fetcher fetchDataWithRequest:request
                     delegate:self
            didFinishSelector:@selector(apiTicket:didPostInvoice:)
              didFailSelector:@selector(apiTicket:didFailPostInvoice:)];
    

然后我在调用 fetchDataWithRequest 时开始收到 NSRangeException。

如何阻止这种情况发生?

4

1 回答 1

0

事实证明,问题出在方法的fetchDataWithRequest调用上,这会取消prepare导致获取数据的所有良好工作。解决方案是创建一个 fetchDataWithPreparedRequest 方法以确保不再调用 prepare

@implementation OADataFetcher
...

- (void)fetchDataWithPreparedRequest:(OAMutableURLRequest *)aRequest delegate:(id)aDelegate didFinishSelector:(SEL)finishSelector didFailSelector:(SEL)failSelector {
        [request release];
        request = [aRequest retain];
        delegate = aDelegate;
        didFinishSelector = finishSelector;
        didFailSelector = failSelector;

//      [request prepare];

        connection = [[NSURLConnection alloc] initWithRequest:aRequest delegate:self];
}

@end
于 2013-05-27T04:34:48.740 回答