Ios 基于POST方法的Web服务问题
我在web services POST方法上遇到了困难,我在android和iOS中使用了一个服务。在android中,它工作正常,但iOS中的响应格式不正确。我使用的是iOS代码:Ios 基于POST方法的Web服务问题,ios,objective-c,web-services,post,ios8,Ios,Objective C,Web Services,Post,Ios8,我在web services POST方法上遇到了困难,我在android和iOS中使用了一个服务。在android中,它工作正常,但iOS中的响应格式不正确。我使用的是iOS代码: Label.text=@"Bangalore"; NSLog(@"text=%@",Label.text); NSString *myRequestString = [[NSString alloc] initWithFormat:@"city=%@",Label.text]; NSDa
Label.text=@"Bangalore";
NSLog(@"text=%@",Label.text);
NSString *myRequestString = [[NSString alloc] initWithFormat:@"city=%@",Label.text];
NSData *myRequestData = [ NSData dataWithBytes: [ myRequestString UTF8String ] length: [ myRequestString length ] ];
NSMutableURLRequest *request = [ [ NSMutableURLRequest alloc ] initWithURL: [ NSURL URLWithString:@"http://****************.php"]];
[request setHTTPMethod:@"POST"];
// [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];
[request setHTTPBody: myRequestData];
NSURLResponse *response;
NSError *err;
NSData *returnData = [NSURLConnection sendSynchronousRequest: request returningResponse:&response error:&err];
NSError* error;
NSMutableArray* result = [NSJSONSerialization JSONObjectWithData:returnData
options:kNilOptions
error:&error];
NSLog(@"sss=%@",result);
在这里我得到了这样的回应
sss={
Bangalore = (
{
Price = 384;
date = "01-12-2014";
},
{
Price = 384;
date = "02-12-2014";
},
{
Price = 384;
date = "03-12-2014";
},
{
Price = 374;
date = "08-12-2014";
},
{
Price = 374;
date = "09-12-2014";
},
{
Price = 365;
date = "13-12-2014";
},
{
Price = 365;
date = "14-12-2014";
},
{
Price = 369;
date = "18-12-2014";
}
);
}
在android相同的服务中,我得到了正确的响应,但我面临的问题是,它如何解决?我的代码中有任何错误吗?谢谢您@您收到了有效的JSON,但随后使用
NSJSONSerialization
成功地将其解析为一个字典数组。不要担心result
的NSLog
看起来不像JSON。这是不应该的
如果您确实想查看原始JSON,可以:
NSLog(@"Original JSON = ", [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]);
这看起来就像您所期望的(我们知道会的,因为否则JSON解析就会失败)。但不要担心这个原始JSON。只需使用结果
请注意,result
是一个NSDictionary
,而不是NSArray
(也不是NSMutableArray
)。所以你应该这样定义它
您现在可以使用结果
:
NSArray *bangalore = result[@"Bangalore"];
NSDictionary *priceObject = bangalore[0];
NSString *price = priceObject[@"Price"]; // might be NSNumber, depends on whether JSON had quotes around the price or not
NSString *date = priceObject[@"date"];
您的POST请求中有几个问题: 您没有指定
内容类型
。注意第节所述的后果:
如果内容类型标题字段不存在,则收件人可以假定媒体类型为<代码>应用程序/八位字节流代码>([RFC2046],第4.5.1节),或者检查数据以确定其类型
也就是说,服务器可能会假定内容的类型为application/octet-stream
,这在您的情况下是不合适的。我建议application/json
。尽管这也需要在服务器上进行更改,但在客户端和服务器上创建和处理要容易得多
我不推荐application/x-www-form-urlencoded
,因为它需要编码,而且使用起来更容易出错
此外,在代码中,您没有正确初始化数据对象:
`NSData*myRequestData=[NSData dataWithBytes:[myRequestString UTF8String]长度:[myRequestString长度]]
参数长度应设置为UTF-8中字符串表示的字节数,而不是[myRequestString length]
,因为这会返回字符数(更准确地说,是UTF-16代码单位数)
如前所述,在使用JSON作为底层内容类型时,可以避免一些潜在问题。首先创建一个JSON表示作为“body”。也就是说,您将创建一个带有键
@city
的NSDictionary
,其值(typeNSString
)变为Label.text
。然后使用NSJSONSerialization
将此对象序列化为JSON,成为一个NSData
对象,该对象包含一个UTF-8 JSON,并成为您的请求主体。您想要的JSON响应是什么?来自上一个,我不想要);此字段。@NaeemI只需要开括号的NSDictionary而不是NSMutable array。我也尝试过NSDictionary,我也遇到了同样的问题。Rob它工作正常,但我需要的是总计数,而不是bangalore[0],当然,请根据需要导航字典和对象数组。您也不会硬编码班加罗尔变量名。哈哈。我只是想说明一下,你正在用一系列字典处理字典,并试图鼓励你不要因为NSLog
或结果
不再像JSON就被劝阻。