我有一个网站和一个iOS应用程序。我将如何构建一个API供他们交谈?

时间:2013-06-06 17:19:33

标签: php ios

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

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

网站是用PHP编写的,不是因为我想制作的API与现有代码分开。

-Thanks

1 个答案:

答案 0 :(得分:1)

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

如果您打算编写自己的Web服务,而不借助REST API,那么查看与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交互)服务接口)。