2016-01-25 13 views
8

APIを呼び出すためにHTTP(S)リクエスト(GET)を行いたいとします。問題は、NSURLRequestが(現時点で)Foundation for Linux(https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/NSURLRequest.swift)に実装されていないことです。NSURLRequestなしのSwiftでのHTTPリクエスト

HTTPリクエストを作成する他の方法はありますか?

+1

[curl mapping for swift](https://github.com/IBM-Swift/CCurl)IBMは、カールのための迅速なパッケージを提供しています。私は単純なGET要求を行う方法を理解できません。 –

答えて

5

有用なことがあるHTTPミドルウェアという素晴らしいプロジェクトがあります。これは単なるミドルウェアフレームワークですが、うまく機能します。あなたはまた、一般的な要求のために役立つことができ源にJSONパーサを見つけることができ、ここで

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) 

を公式pageです:

は、ここでのコード例です。 インストールには、uri_parserのみが必要です。

+0

私は本当になぜドキュメントがある単一のSwiftパッケージがないのだろうと思います。 golangを見ると、完全なドキュメントがなくても見つかるはずです。とにかく、私はこれを試し、あなたに戻ってきます。 –

+0

スイフト2.2のみで、6ヶ月で活動が見られませんでした。それほど役に立たない。 –

+0

私は知っているいくつかの制限がありますが、それは動作します –

2

LinuxでのSwiftが進化していることを考えると、最良のアプローチは、状況がより安定するまで、深刻な開発を延期することです。 HTTP要求の障害を克服したとしても、技術がLinux上で未成熟であるため、他の不愉快な驚きが起きる可能性があります。ここしかし

、これは単なる好奇心と学習の問題である場合には、いくつかのアイデアは、私はそれらを自分で試していないにもかかわらず、以下のとおりです。

  • たぶん直接CoreFoundationのC APIを呼び出すことは動作します。
  • 古いCネットワークAPIを使用して、必要なインターフェイスを提供するCラッパーを作成します。このアプローチでは、多くの車輪を再発明するので、おそらく他のものより多くの努力が必要です。
  • Cラッパーを作成しますが、URLで動作する上位レベルのCライブラリをラップします。 libcurlが気になります。

これらのアプローチのどちらをとっても、Cコードとインターフェイスする必要があります。これを行う1つの方法は、システムモジュールを使用することです。可能な出発点としてImporting a Swift module using a C libraryを参照してください。

+0

あなたの詳細な答えに感謝します。あなたが正しいです、おそらく最も良い答えは待つことです。 cモジュールはオプションかもしれません。おそらく、使いやすいapiがあります。 – boxi

2

ccurlライブラリをベースにしたソリューション次の点を考慮

https://dl.dropboxusercontent.com/u/2504173/CurlSampleApp.tar.gz

私はUbuntuの14.04でそれをやった

スウィフト3.0 - 最新の開発版: https://swift.org/builds/development/ubuntu1404/swift-DEVELOPMENT-SNAPSHOT-2016-06-06-a/swift-DEVELOPMENT-SNAPSHOT-2016-06-06-a-ubuntu14.04.tar.gz

は、パッケージに続いて、指示がうまく働きました一般的に:

https://swiftpkgs.ng.bluemix.net/package/SwiftOnTheServer/CCurl

しかし、コンパイルエラーを修正するために、私はCCurlパッケージのsots_curl.hを変更しなければなりませんでした。以下の行が追加されました:

#include <stdint.h> 

アプリフォルダに以下を実行する必要があるアプリの建物の場合:

swift build 

アプリについてアプリフォルダで次のコマンドを実行する必要が実行されている:

.build/debug/app 

希望します。もしあれば:)

+1

私は現在、[bluemix-simple-http-client-swift](https://github.com/ibm-bluemix-mobile-services/bluemix-simple-http-client-swift.git)を試しています。これはラッパーですCCurlの周りにあり、たとえサンプルコードが悪い場合でも、コンパイルするためにそれを変更すれば、実際にうまく機能します。 –

+0

私はそれをチェックアウトします –

+0

[サンプルコードが修正されたプルリクエスト](https://github.com/romainmenke/bluemix-simple-http-client-swift/tree/patch-2) –

0

ない完全な答えは、多分便利誰かに質問をする:

は私だけNSData(contentsOfURL: NSURL)はので、私は閉鎖してこれを行いKituraNetのラッパーを書いてしまっ必要。私はちょうどそこにデータがあるかどうかをチェックし、それを返します。

NSURLは完全に実装されていないため、今度はURLをStringとして渡すことにしました。

LinuxとiOSの両方で動作するIBMのSwiftyRequestライブラリは、そこにある半ば2017年以来それはNSURLRequestの交換、NSData(contentsOfURL: NSURL)

.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() 
    } 
} 
1

のちょうど古き良き便利ではありません。私はLinux上でそれを試して、うまくいくようです。要求を行って

は、この(ドキュメントの例を適応)のようになります。あなたが応答のためにJSONを使用している場合

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") 
    } 
} 

、それもあなたが提供し、「スキーマ」に基づいてオブジェクトを構築することができます(例えば、tests.responseObjectJSONDecodableを見てください)。

関連する問題