Ios 基于POST方法的Web服务问题

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

我在web services POST方法上遇到了困难,我在android和iOS中使用了一个服务。在android中,它工作正常,但iOS中的响应格式不正确。我使用的是iOS代码:

 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
,其值(type
NSString
)变为
Label.text
。然后使用
NSJSONSerialization
将此对象序列化为JSON,成为一个
NSData
对象,该对象包含一个UTF-8 JSON,并成为您的请求主体。

您想要的JSON响应是什么?来自上一个,我不想要);此字段。@NaeemI只需要开括号的NSDictionary而不是NSMutable array。我也尝试过NSDictionary,我也遇到了同样的问题。Rob它工作正常,但我需要的是总计数,而不是bangalore[0],当然,请根据需要导航字典和对象数组。您也不会硬编码班加罗尔变量名。哈哈。我只是想说明一下,你正在用一系列字典处理字典,并试图鼓励你不要因为
NSLog
结果
不再像JSON就被劝阻。