我很肯定的问题很简单,我一定是遗漏了一些东西..只是不确定是什么。
我可以发送 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。
并且大部分只是带回带有信息数组的格式化字符串,没有什么特别的compileGetData
。compilePostData
但这不是问题所在。
看,“有效负载”覆盖了其中的任何“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 中,它在那里工作。
我……老实说在这里不知所措……