我很肯定我的问题很简单,我一定是漏掉了什么..只是不确定是什么。
我可以为粒度元素发送GET和POST (this=that之类的东西),但我也需要发送数据的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变量中提供的数据,自动设置请求是POST还是GET。
默认情况下,请求是GET,但如果PostData或Payload中有任何内容,则会转换为POST。
compileGetData和compilePostData主要只是返回组合了信息数组的格式化字符串,没有什么特别之处。
但这并不是问题所在。
看,"Payload“覆盖了"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
}当我说“不工作”时,我的意思是,我从webservice返回了一个错误的JSON数组,这基本上意味着“嘿,有效负载在哪里?”如果请求不是POST,它会返回一个通用错误,所以一切正常,那么URL显然是正确的。
我已经使用Chrome的RESTConsole测试了and服务,以确保它工作正常,它确实工作正常。
我还通过调试器检查了我发送的确切有效负载,我将其copy+pasted到RESTConsole中,它在那里工作。
我..。老实说,在这里不知所措...
发布于 2012-11-24 03:37:19
尝试使用Charles或Wireshark这样的web代理(我个人更喜欢Charles,因为它的易用性,尽管这是一个30天的试用期),并监控你从RESTConsole发出的请求和你从你的应用发出的请求,看看它们是否看起来一样。
检查任何标题、行回车和任何其他看起来不同的内容。
这是我能想到的最好的开始
https://stackoverflow.com/questions/13534804
复制相似问题