2

我熟悉 iOS/Xcode 开发,现在正在尝试开发自己的 Web 服务。不幸的是,我正在努力寻找将 JSON 字符串从我的 iOS 应用程序传递到 PHP 页面的最佳方法。

在 xcode 中,我创建了一个类似于以下内容的 JSON 字符串:

{"email" : "",  "name" : "Test Rest",}

然后我正在创建一个 URL (GET)

//localhost/index.php?method=createRestaurant&json={"email" : "",  "name" : "Test Rest",}

我正在尝试使用 NetBeans 调试 PHP,但 NetBeans 和 iOS 都因 URL 错误或无效字符错误而失败,据我猜测是 JSON 字符失败 {}。

如果我使用 Chrome PostMan 并发出相同的 URL,它就可以工作,这证明 PHP 正在工作/正在做我需要它做的事情。

因此,总而言之,在 URL 中包含 JSON 数据的最佳方式是需要在 XCode 中更改会影响 JSON 编码方式的内容?

  NSData *jsonData = [NSJSONSerialization dataWithJSONObject:myDictionary options:NSJSONWritingPrettyPrinted  error:&error];
    jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 

在理想的世界中,我应该使用 Java,但由于速度、环境成本等原因,我正试图让我的系统使用 PHP 工作。解决方案完成后,我将着手将解决方案移植到 Java。

谢谢你的帮助。

4

4 回答 4

1

几个想法:

  1. 您的 JSON 无效。你有一个额外的逗号。使用JSON Lint进行检查。

  2. 您应该对 URL 参数进行百分比转义,因为 URL 中不允许使用空格等字符。您可以使用stringByAddingPercentEscapesUsingEncoding. 或者更好的是,如果您的字符串可能包含其他一些无法在单个 URL 参数中使用的有效 URL 字符,您可以使用 Core Foundation CFURLCreateStringByAddingPercentEscapes,它为您提供更多控制权。我使用了一个 NSString 类别,它为这个 CoreFoundation 函数提供了一个简单的接口:

    @implementation NSString (UrlEncode)
    
    + (NSString *)stringByAddingPercentEscapesFor:(NSString *)string
                    legalURLCharactersToBeEscaped:(NSString *)legalURLCharactersToBeEscaped
                                    usingEncoding:(NSStringEncoding)encoding
    {
        return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                                         (CFStringRef)string,
                                                                         NULL,
                                                                         (CFStringRef)legalURLCharactersToBeEscaped,
                                                                         CFStringConvertNSStringEncodingToEncoding(encoding)
                                                                         ));
    }
    
    - (NSString *)stringByAddingPercentEscapesFor:(NSString *)legalURLCharactersToBeEscaped
                                    usingEncoding:(NSStringEncoding)encoding
    {
        return [NSString stringByAddingPercentEscapesFor:self
                           legalURLCharactersToBeEscaped:legalURLCharactersToBeEscaped
                                           usingEncoding:encoding];
    }
    
    - (NSString *)stringByAddingPercentEscapesForURLParameterUsingEncoding:(NSStringEncoding)encoding
    {
        return [NSString stringByAddingPercentEscapesFor:self
                           legalURLCharactersToBeEscaped:@";/?:@&=+$,"
                                           usingEncoding:encoding];
    }
    
    @end
    

    因此,您可以stringByAddingPercentEscapesForURLParameterUsingEncoding在将 JSON 字符串添加到您的 URL 之前使用它。或者你可以给CFURLCreateStringByAddingPercentEscapes自己打电话。

于 2013-06-21T14:24:27.880 回答
0

感谢您的所有建议,我现在已从 GET 更改为 POST 并且一切正常。

于 2013-07-05T08:59:36.673 回答
0

我会使用 POST 方法,然后简单地在您的 php 脚本中打印出来以进行调试。

调试输出将是这样的:

$json = json_decode($_POST['json']); print_r($json);

于 2013-06-21T12:54:44.973 回答
0

您可以通过 GET 请求通过更改 URL 来传递数据,如下所示:

//localhost/index.php?method=createRestaurant&email=emailData&name=TestData

或者您可以在 POST 变量中通过 POST 请求发送数据。

于 2013-06-21T12:56:09.543 回答