0

我有一个网站和该网站的原生 iOS 应用程序。现在,该应用程序通过下拉 XML 文件与站点进行通信。我很好奇我如何制作一个 API,以便他们可以以现场编程的方式交谈。这将允许我使用该应用程序做更高级的事情。

我以前从来没有做过这样的事情,我不知道从哪里开始,有什么建议吗?

顺便说一句,该站点是用 PHP 编写的,这并不重要,因为我想要制作的 API 将与现有代码分开。

-谢谢

4

1 回答 1

1

我同意使用 REST API 是一种很好的方法。

如果您在没有 REST API 的帮助下编写自己的 Web 服务,那么查看与 Web 服务器的交互可能会很有说明性。如果您能理解这种方法,那么您可以使用 REST API 来解决这个问题,或许可以更好地了解幕后发生的事情(并欣赏 API 带来的好处)。

例如,下面是一些简单的 PHP,它以如下形式从 iOS 设备接收 JSON 输入:

{"animal":"dog"}

它将返回 JSON 指示该动物将发出的声音:

{"status":"ok","code":0,"sound":"woof"}

(其中“ status”是请求是“ ok”还是“ error”,其中“ code”是标识错误类型的数字代码,如果有的话,“ sound”是,如果请求成功,则该动物发出的声音。 )

这个简单示例的 PHP 源代码animal.php可能如下所示:

<?php

// get the json raw data

$handle = fopen("php://input", "rb");
$http_raw_post_data = '';
while (!feof($handle)) {
    $http_raw_post_data .= fread($handle, 8192);
}
fclose($handle); 

// convert it to a php array

$json_data = json_decode($http_raw_post_data, true);

// now look at the data

if (is_array($json_data))
{
    $animal = $json_data["animal"];
    if ($animal == "dog")
        $response = array("status" => "ok", "code" => 0, "sound" => "woof");
    else if ($animal == "cat")
        $response = array("status" => "ok", "code" => 0, "sound" => "meow");
    else
        $response = array("status" => "error", "code" => 1, "message" => "unknown animal type");
}
else
{
    $response = array("status" => "error", "code" => -1, "message" => "request was not valid json");
}

echo json_encode($response);

?>

与该服务器交互的 iOS 代码可能如下所示:

- (IBAction)didTouchUpInsideSubmitButton:(id)sender
{
    NSError *error;

    // build a dictionary, grabbing the animal type from a text field, for example

    NSDictionary *dictionary = @{@"animal" : self.animalType};
    NSData *requestData = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error];
    if (error)
    {
        NSLog(@"%s: error: %@", __FUNCTION__, error);
        return;
    }

    // now create the NSURLRequest

    NSURL *url = [NSURL URLWithString:@"http://insert.your.url.here.com/animal.php"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request addValue:@"text/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:requestData];

    // now send the request

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [NSURLConnection sendAsynchronousRequest:request
                                       queue:queue
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

                               // now parse the results

                               // if some generic NSURLConnection error, report that and quit

                               NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
                               if (error)
                               {
                                   NSLog(@"%s: NSURLConnection error=%@", __FUNCTION__, error);
                                   return;
                               }

                               // otherwise, we'll assume we have a good response, so let's parse it

                               NSDictionary *results = [NSJSONSerialization JSONObjectWithData:data
                                                                                       options:0
                                                                                         error:&error];

                               // if we had an error parsing the results, let's report that fact and quit

                               if (error)
                               {
                                   NSLog(@"%s: JSONObjectWithData error=%@", __FUNCTION__, error);
                                   return;
                               }

                               // otherwise, let's interpret the parsed json response

                               NSString *status = results[@"status"];

                               if ([status isEqualToString:@"ok"])
                               {
                                   // if ok, grab the "sound" that animal makes and report it

                                   NSString *result = results[@"sound"];

                                   dispatch_async(dispatch_get_main_queue(),^{
                                       self.label.text = result;
                                   });
                               }
                               else
                               {
                                   // if not ok, let's report what the error was

                                   NSString *message = results[@"message"];

                                   dispatch_async(dispatch_get_main_queue(),^{
                                       self.label.text = message;
                                   });
                               }
                           }];
}

显然,这是一个微不足道的示例(一个更可能的 PHP 服务器将在您的服务器上的数据库中存储或查找数据),但更完整的 PHP Web 服务超出了这个 iOS 特定问题的范围。但希望这能让您了解让 iOS 应用程序与一些基于 PHP 的 Web 服务交互的一些构建块(设计一个 Web 服务接口,编写 PHP 以支持该接口,编写 iOS 代码以与该 Web 交互)服务接口)。

于 2013-06-06T18:43:28.653 回答