JSON Payload似乎没有发送

时间:2012-11-23 19:27:38

标签: objective-c ios xcode

我的问题我很积极很简单,我一定只是遗漏了什么......只是不确定是什么。

我可以为粒度元素发送GET和POST(这=那种东西),但是我需要发送数据的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];
}

好的,这个方法的工作方式是,它会自动设置请求是POST还是GET,具体取决于GetData,PostData和Payload vars中提供的数据。

默认情况下,请求是GET,但如果PostData或Payload中包含任何内容,则会变为POST compileGetDatacompilePostData大多只是将带有信息数组的格式化字符串组合在一起,没有什么特别之处。

但那不是问题所在。

请参阅“Payload”覆盖“PostData”中的任何内容。如果你已经将PostData元素提供给了类,那么只要它存在,它就会被提供的Payload覆盖。

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

这是感兴趣的领域:

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

}

当我说“不工作”时,我的意思是,我从网络服务中获取一个错误的JSON数组,基本上意味着“嘿,有效载荷?”。如果请求不是POST,则它会返回为一般错误,因此一切正常,URL显然是正确的。

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

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

我真的在这里不知所措......

1 个答案:

答案 0 :(得分:1)

尝试使用像CharlesWireshark这样的网络代理(我个人更喜欢Charles,因为它易于使用,但这是一个为期30天的试用版)并监控您从RESTConsole和你从你的应用程序中创建一个,看看它们是否一样。

检查任何标题,换行符以及其他任何看起来不同的内容。

这是我能想到的最好的