【问题标题】:Working with Neo4j Rest API in Swift在 Swift 中使用 Neo4j Rest API
【发布时间】:2015-12-17 13:05:40
【问题描述】:

我对 iOS 和 Swift 还很陌生,现在我想使用 Neo4j,一个用于持久保存数据的图形数据库。 我知道有一个名为 Theo 的 Lib 用于连接到图形数据库,但我想使用 REST API。现在我不确定如何处理 HTTP 请求以便将数据从数据库获取到我用 Swift 编写的 iOS 应用程序? 有人对我有一些有用的线索吗?

谢谢汉尼斯

【问题讨论】:

    标签: swift rest neo4j httprequest httpresponse


    【解决方案1】:

    您提到的 Theo library 是 Neo4j REST API 的包装器。使用这样的库的好处是它可以处理 JSON 序列化、错误处理、向 HTTP 请求添加正确的标头等事情。

    您可以像这样使用 Swift 和 transactional Cypher REST API endpoint 一起使用 Cypher(注意:这使用 Alamofire 库来处理 HTTP 请求。):

    import Alamofire
    
    let cypherStatement = "CREATE (:Person {name: 'Bob'})-[:LIKES]->(pizza:Food {type: 'Pizza'})<-[:LIKES]-(:Person {name: 'William'}) WITH pizza MATCH (p:Person)-[:LIKES]->(pizz) RETURN p.name AS name"  
    let endpoint = "http://localhost:7474/db/data/transaction/commit"
    let requestBody = [
            "statements": [
                [
                    "statement": cypherStatement
                ]
            ]
        ]
    Alamofire.request(.POST, endpoint, parameters: requestBody, encoding: .JSON)
            .responseJSON { response in
                debugPrint(response)
        }
    

    哪些日志:

    [Request]: <NSMutableURLRequest: 0x7fafcb637320> { URL:     http://localhost:7474/db/data/transaction/commit }
    [Response]: <NSHTTPURLResponse: 0x7fafcb81d480> { URL: http://localhost:7474/db/data/transaction/commit } { status code: 200, headers {
    "Access-Control-Allow-Origin" = "*";
    "Content-Length" = 91;
    "Content-Type" = "application/json";
    Date = "Fri, 18 Dec 2015 19:29:41 GMT";
    Server = "Jetty(9.2.z-SNAPSHOT)";
    } }
    [Data]: 91 bytes
    [Result]: SUCCESS: {
        errors =     (
        );
        results =     (
                    {
                columns =             (
                    name
                );
                data =             (
                                    {
                        row =                     (
                            Bob
                        );
                    },
                                {
                        row =                     (
                            William
                        );
                    }
                );
            }
        );
    }
    

    编辑

    在不使用 Alamofire 的情况下发出相同的请求如下所示:

    let cypherStatement = "CREATE (:Person {name: 'Bob'})-[:LIKES]->(pizza:Food {type: 'Pizza'})<-[:LIKES]-(:Person {name: 'William'}) WITH pizza MATCH (p:Person)-[:LIKES]->(pizz) RETURN p.name AS name"  
    let endpoint = "http://localhost:7474/db/data/transaction/commit"
    let requestBody = [
            "statements": [
                [
                    "statement": cypherStatement
                ]
            ]
        ]
    
    guard let url = NSURL(string: endpoint) else {
                print("Error")
                return true
            }
    
            let request = NSMutableURLRequest(URL: url)
            request.HTTPMethod = "POST"
            request.addValue("application/json",forHTTPHeaderField: "Content-Type")
            request.addValue("application/json",forHTTPHeaderField: "Accept")
    
            do{
                let jsonData = try NSJSONSerialization.dataWithJSONObject(requestBody, options: .PrettyPrinted)
                request.HTTPBody = jsonData
    
                let config = NSURLSessionConfiguration.defaultSessionConfiguration()
                let session = NSURLSession(configuration: config)
    
                let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) in
                    let result: NSDictionary
                    do {
                        result = try NSJSONSerialization.JSONObjectWithData(data!,
                            options: []) as! NSDictionary
                    } catch  {
                        print("error trying to convert data to JSON")
                        return
                    }
                    print("\(result)")
                })
                task.resume()
            } catch let error as NSError {
                print("JSON serialization error")
                return true
            }
    

    【讨论】:

    • 谢谢威廉里昂,我今天看到了你的帖子,几天前在你发布这个解决方案之前尝试过 Alamofire Lib。不知道如何将密码查询推送到请求。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多