Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Swift中的HTTP请求,无NSURLRequest_Linux_Swift_Httprequest - Fatal编程技术网

Linux Swift中的HTTP请求,无NSURLRequest

Linux Swift中的HTTP请求,无NSURLRequest,linux,swift,httprequest,Linux,Swift,Httprequest,我们希望发出HTTP(S)请求(GET)来调用API。问题是,NSURLRequest(目前)没有在Linux(…)/的基础上实现。 还有其他创建HTTP请求的可能性吗?考虑到Linux上的Swift正在快速发展,我认为最好的方法是推迟进行任何认真的开发,直到情况更加稳定。即使您克服了发出HTTP请求的障碍,也可能会有其他令人不快的惊喜,因为Linux上的技术还不成熟 然而,如果这只是好奇和学习的问题,以下是一些想法,尽管我自己没有尝试过: 也许直接调用CoreFoundation C API

我们希望发出HTTP(S)请求(GET)来调用API。问题是,NSURLRequest(目前)没有在Linux(…)/的基础上实现。
还有其他创建HTTP请求的可能性吗?

考虑到Linux上的Swift正在快速发展,我认为最好的方法是推迟进行任何认真的开发,直到情况更加稳定。即使您克服了发出HTTP请求的障碍,也可能会有其他令人不快的惊喜,因为Linux上的技术还不成熟

然而,如果这只是好奇和学习的问题,以下是一些想法,尽管我自己没有尝试过:

  • 也许直接调用CoreFoundation C API会奏效
  • 使用好的旧C网络API编写一个C包装器,它提供您需要的接口。这种方法可能比其他方法需要更多的努力,因为您将重新发明许多轮子
  • 编写一个C包装器,但包装一个更高级别的C库,该库可以处理URL;我想到了libcurl

无论采用哪种方法,都需要与C代码接口。一种方法是使用系统模块,请参阅作为可能的起点

有一个很好的项目叫做HTTPMiddleware,它可能很有用,它只是一个中间件框架,但运行良好

下面是一个代码示例:

import HTTP
import HTTPMiddleware

struct Middleware: HTTPRequestMiddlewareType {
    func respond(request: HTTPRequest) -> HTTPRequestMiddlewareResult {
        // You can change the request and pass it forward
        return .Next(request)

        // Or you can respond early and bypass the chain
        return .Respond(HTTPResponse(statusCode: 404, reasonPhrase: "Not Found"))
    }
}

struct Responder: HTTPResponderType {
    func respond(request: HTTPRequest) -> HTTPResponse {
        // May or may not be called depending on the middleware
        return HTTPResponse(statusCode: 200, reasonPhrase: "OK")
    }
}

let request = HTTPRequest(method: .GET, uri: URI(path: "/"))
let chain = Middleware() >>> Responder()
let response = chain.respond(request)
这是官方的,您还可以在源代码中找到一个对常见请求有用的JSON解析器。
安装只需要uri\u解析器

基于ccurl库考虑以下解决方案:

我是在Ubuntu 14.04上做的

Swift 3.0-最新开发版本:

以下包装和说明通常效果良好:

但为了修复编译错误,我不得不修改CCurl包中的
sots_curl.h
。添加了以下行:

#include <stdint.h>
要运行应用程序,您需要在应用程序文件夹中执行以下命令:

swift build
.build/debug/app

希望能有帮助。如果有问题,请提问:)

不是完整的答案,但可能对某人有用:

我只需要
NSData(contentsOfURL:NSURL)
,因此我最终为KiturNet编写了一个包装器,该包装器使用闭包实现这一点。我只是检查是否有数据并返回

由于
NSURL
还远未完全实现,我还决定暂时将url作为
字符串传递

它不是
NSURLRequest
的替代品,只是
NSData(contentsOfURL:NSURL)的便利性



自2017年年中起,IBM的library就开始在Linux和iOS上运行。我在Linux上试用过,似乎效果不错

发出请求如下所示(改编自文档中的示例):


如果您使用JSON进行响应,它甚至可以基于您提供的“模式”为您构造一个对象(请查看示例中的
.responseObject
JSONDecodable

感谢您的详细回答。你是对的,也许最好的答案是等待。一个c模块可以是一个选项,也许有一个易于使用的api。IBM有一个用于curl的swift包。我只是不知道如何让它做一个简单的get请求。我真的想知道为什么没有一个带有文档的Swift包。如果你看一下golang,你会很难找到一个没有完整文档的。不管怎样,我会试试这个,然后再给你回复。它只有swift 2.2版本,已经6个月没有活动了。所以不再有用了。我收到的100多个构建错误表明它不。。。很抱歉,对于生产软件来说,只有Swift 2.2版本且在6个月内未更新的软件包不是一个好的选择。很抱歉,您使用的是什么Swift版本?实际上swift 2.2总是比较稳定的,你有旧版本吗?你的发行版是什么?Swift发布:你现在在官方页面上看不到任何活动,因为没有发现任何问题。我已经将我在Swift for linux中所做的一切都归档了。我当前的基本图像是ibmcom/swift ubuntu:latest
。如果我没弄错的话,它使用Swift 3.0并运行Ubuntu15。在我的主机上,我使用官方的swift 2.2运行OSX,我现在正在尝试它是CCurl的包装器,即使示例代码不好,如果您修改它以编译它,它也会运行得非常好。
.Package(url: "https://github.com/IBM-Swift/Kitura-net.git", majorVersion: 0, minor: 15),
import KituraNet

extension NSData {

  public static func contents(ofUrl urlString:String, completionHandler:((data:NSData?) -> Void)) {

    let request = HTTP.request(urlString) { (response) in

      guard let response = response else {
        completionHandler(data: nil)
        return
      }

      let responseData = NSMutableData()
      do {
        try response.readAllData(into: responseData)
        completionHandler(data: responseData)
        return
      } catch {
        completionHandler(data: nil)
        return
      }
    }
    request.end()
  }
}
import SwiftyRequest

let request = RestRequest(method: .get, url: "http://myApiCall/hello")
request.responseString() { response in
    switch response.result {
    case .success(let result):
        print("Success")
    case .failure(let error):
        print("Failure")
    }
}