0

我很肯定的问题很简单,我一定是遗漏了一些东西..只是不确定是什么。

我可以发送 GET 和 POST 以获取粒度元素(this=that kind of stuff),但是我也需要发送数据的 Web 服务调用需要一个原始 JSON 块,没有“密钥”

这是我写的方法:

-(NSData *)execute {

    // Smart Chooser ?
    if(PostData.count >0 || Payload != nil)
        [self setMethod:UPLINK_METHOD_POST];
    else
        [self setMethod:UPLINK_METHOD_GET];



    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:self.connectionUrl
                                                           cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
                                                       timeoutInterval:10];


    if([UPLINK_METHOD_GET isEqualToString:self.connectionMethod])
        [request setHTTPMethod:@"GET"];
    else
        [request setHTTPMethod:@"POST"];


    NSString *gData = [self compileGetData];
    NSString *pData = [self compilePostData];

    // if we have get data, set it into the URL string
    if(GetData.count > 0) {

        [self setURLWithString:[[self.connectionUrl absoluteString] stringByAppendingString:[@"?" stringByAppendingString:gData]]];
        [request setURL:self.connectionUrl];

    }

    // if we have post data, set it in the body
    if(PostData.count > 0) {
        const char *bytes = [[NSString stringWithString:pData] UTF8String];
        [request setHTTPBody:[NSData dataWithBytes:bytes length:strlen(bytes)]];

    }

    // Override any post data if a payload is already defined.
    if(Payload != nil) {

        [request setHTTPBody:[Payload dataUsingEncoding:NSUTF8StringEncoding]];

    }

    NSLog(@"URL : %@", request.URL);


    NSURLResponse *response;
    NSError *err;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];

    if(err != nil)
        NSLog(@"here was an error: %@", err);


    return responseData;
}

-(NSDictionary *)executeAsJSON
{
    NSData *responseData = [self execute];
    NSError *e;
    return [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&e];
}

好的,这件事的工作方式是,它会根据 GetData、PostData 和 Payload vars 中提供的数据自动设置请求是 POST 还是 GET。

默认情况下,请求是 GET,但如果 PostData 或 Payload 中有任何内容,则会变成 POST。
并且大部分只是带回带有信息数组的格式化字符串,没有什么特别的compileGetDatacompilePostData

但这不是问题所在。

看,“有效负载”覆盖了其中的任何“PostData”。如果您在类中提供了 PostData 元素,那么它只会被提供的有效负载(如果确实存在)覆盖。

我需要提供这个来展示它现在存在的“工作区”,它不是线性提供的信息。

这是感兴趣的领域:

// Override any post data if a payload is already defined.
if(Payload != nil) {

    //const char *plbytes = [[NSString stringWithString:Payload] UTF8String]; // this didn't work
    [request setHTTPBody:[Payload dataUsingEncoding:NSUTF8StringEncoding]]; // inline, doesn't work either

}

当我说“不起作用”时,我的意思是,我从 web 服务返回一个错误的 JSON 数组,这基本上意味着“嘿,有效负载在哪里?”。如果请求不是 POST,它会作为一般错误返回,所以一切正常,那么 URL 显然是正确的。

我已经使用 RESTConsole for Chrome 来测试 web 服务以确保其正常工作,并且确实如此。

我还通过调试器检查了我发送的确切有效负载,我将其复制并粘贴到 RESTConsole 中,它在那里工作。

我……老实说在这里不知所措……

4

1 回答 1

1

尝试使用像CharlesWireshark这样的 Web 代理(我个人更喜欢 Charles,因为它易于使用,不过它是一个 30 天的试用版)并监控您从 RESTConsole 发出的请求以及您从应用程序发出的请求,看看它们是否看起来相同。

检查任何标题、换行符和其他任何看起来不同的东西。

这是我能想到的最好的开始

于 2012-11-23T19:37:19.387 回答