【问题标题】:Web services issue on POST methodPOST 方法的 Web 服务问题
【发布时间】:2014-12-31 12:16:05
【问题描述】:

我在网络服务 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 相同的服务中,我得到了正确的响应,但 iOS 我面临这个问题,请问如何解决?我的代码有任何错误吗?谢谢@

【问题讨论】:

  • 你想要的 JSON 响应是什么?
  • 从我不想要的最后一个);这个字段。@Naeem
  • 我只需要开括号
  • 试试 NSDictionary 而不是 NSMutable 数组
  • 我也尝试过 NSDictionary,我遇到了同样的问题。

标签: ios objective-c web-services post ios8


【解决方案1】:

您收到了有效的 JSON,但随后使用 NSJSONSerialization 成功地将其解析为包含字典数组的字典。不要担心resultNSLog 看起来不像JSON。不应该的。

如果你真的想看原始的 JSON,你可以:

NSLog(@"Original JSON = ", [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]);

这看起来就像您所期望的那样(我们知道它会,因为否则 JSON 解析会失败)。但是不要担心这个原始的 JSON。只需使用result

但请注意,resultNSDictionary,而不是 NSArray(也不是 NSMutableArray)。所以你应该这样定义它。

您现在可以使用result

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"];

【讨论】:

  • 抢它的工作正常,但我想要总数,而不是班加罗尔[0],
  • 当然,在您认为合适的时候浏览字典和对象数组。您也不会硬编码bangalore 变量名。哈哈。我只是在说明您正在处理带有字典数组的字典,并试图鼓励您不要仅仅因为 NSLogresult 看起来不再像 JSON 而被劝阻。
【解决方案2】:

您的 POST 请求中有几个问题:

您没有指定Content-Type。请注意3.1.1.5 Content-Type 部分所述的后果:

如果 Content-Type 标头字段不存在,接收者可以假设媒体类型为application/octet-stream([RFC2046],第 4.5.1 节)或检查数据以确定其类型。 em>

也就是说,服务器可能会假定内容是 application/octet-stream 类型,这不适合您的情况。我建议application/json。尽管这也需要在服务器上进行更改 - 它更容易在客户端和服务器上创建和处理。

我会推荐application/x-www-form-urlencoded,因为它需要编码并且它的使用更容易出错。

此外,在您的代码中,您没有正确初始化数据对象:

`NSData *myRequestData = [NSData dataWithBytes: [myRequestString UTF8String] 长度: [myRequestString 长度]];

参数 length 应该设置为 UTF-8 中字符串表示的字节数 - 而不是 [myRequestString length] 因为它返回字符数(更准确地说,数字 UTF-16代码单元)。

如前所述,在使用 JSON 作为基础内容类型时,您可以避免几个潜在问题。您将首先创建一个 JSON 表示作为您的“主体”。也就是说,您将创建一个NSDictionary,其键为@city,其值(类型NSString)变为Label.text。然后使用 NSJSONSerialization 将此对象序列化为 JSON 到 NSData 对象,该对象包含一个 UTF-8 JSON 并成为您的请求正文。

【讨论】:

    猜你喜欢
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多