【问题标题】:How to send JSON data over NSURLConnection如何通过 NSURLConnection 发送 JSON 数据
【发布时间】:2012-06-05 06:03:03
【问题描述】:

我已经成功创建了一个连接到我的 Web 服务并发布字符串并接收字符串响应的方法。但是,我现在尝试发布使用 NSJSONSerialization 创建的 JSON 字典。但是,Xcode 给了我一个错误。我试图转换我的初始代码。下面的相关行...

NSData* loginDataJSON = [NSJSONSerialization dataWithJSONObject:loginDataDictionary options:NSJSONWritingPrettyPrinted error:&error];
[request setValue:loginDataJSON forHTTPHeaderField:@"loginDataJSON"];
[request setHTTPBody:[loginDataJSON dataUsingEncoding:NSUTF8StringEncoding]];

这里的第二行抱怨我在需要 NSString 的地方使用 NSData。 第三行抱怨loginDataJSON可能无法回复dataUsingEnconding

我似乎在强制使用 NSData 对象(因为 NSJSONSerialization 给了我)它不能被使用。我最好尝试将 JSON 转换为字符串以与我现有的请求代码一起使用,还是应该/可以更改我的请求代码以接受 NSData 而不是 NSString?

【问题讨论】:

    标签: iphone objective-c json nsurlconnection nsjsonserialization


    【解决方案1】:

    试试这个代码:

    let body = NSMutableDictionary()
    body.setValue("myString" forKey: "stringType")
    body.setValue(data?.base64EncodedString(options: .lineLength64Characters) forKey: "dataType")
    

    通过这种方式,您可以在字典中同时拥有数据和字符串。这里'data?.base64EncodedString(options: .lineLength64Characters)' 会返回一个带有base64 编码的字符串。所以你的字典只包含字符串,在服务器端你必须将它转换回数据。

    希望它能解决你的问题。

    【讨论】:

      【解决方案2】:

      您是否尝试过使用 JSONKit 或 RESTKit 等框架? RESTKit 专门用于与 JSON 的 web 服务通信,内部使用 JSONKit 和另一个解析器。我认为这将解决您的问题,也许还有未来的问题;)

      【讨论】:

      • 不,我还没有尝试过。我知道它们,但我通常更喜欢尽可能使用内置的 iOS 方法。但如果没有人能指出我正确的方向,我可能不得不转向 REST。
      【解决方案3】:

      发出可变请求并

       [request setHTTPBodyWithString:myMessageJSON];
      

      其中方法如下:

      - (void)setHTTPBodyWithString:(NSString *)body {
          NSData *bodyData = [body dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
          [self setValue:[NSString stringWithFormat:@"%d", [bodyData length]] forHTTPHeaderField:@"Content-Length"];
          [self setHTTPBody:bodyData];
      }
      

      【讨论】:

        【解决方案4】:

        您需要将 JSON 作为请求的正文发送,并且可能设置内容类型和内容长度:

        NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:nil];
        [request setValue:@"application/json" forHTTPHeaderField:@"content-type"];
        [request setValue:[NSString stringWithFormat:@"%d", [loginDataJSON length]] forHTTPHeaderField:@"content-length"];
        [request setHTTPBody:loginDataJSON];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-12
          • 2017-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多