APIを呼び出すためにHTTP(S)リクエスト(GET)を行いたいとします。問題は、NSURLRequestが(現時点で)Foundation for Linux(https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/NSURLRequest.swift)に実装されていないことです。NSURLRequestなしのSwiftでのHTTPリクエスト
HTTPリクエストを作成する他の方法はありますか?
APIを呼び出すためにHTTP(S)リクエスト(GET)を行いたいとします。問題は、NSURLRequestが(現時点で)Foundation for Linux(https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/NSURLRequest.swift)に実装されていないことです。NSURLRequestなしのSwiftでのHTTPリクエスト
HTTPリクエストを作成する他の方法はありますか?
有用なことがある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のみが必要です。
私は本当になぜドキュメントがある単一のSwiftパッケージがないのだろうと思います。 golangを見ると、完全なドキュメントがなくても見つかるはずです。とにかく、私はこれを試し、あなたに戻ってきます。 –
スイフト2.2のみで、6ヶ月で活動が見られませんでした。それほど役に立たない。 –
私は知っているいくつかの制限がありますが、それは動作します –
LinuxでのSwiftが進化していることを考えると、最良のアプローチは、状況がより安定するまで、深刻な開発を延期することです。 HTTP要求の障害を克服したとしても、技術がLinux上で未成熟であるため、他の不愉快な驚きが起きる可能性があります。ここしかし
、これは単なる好奇心と学習の問題である場合には、いくつかのアイデアは、私はそれらを自分で試していないにもかかわらず、以下のとおりです。
これらのアプローチのどちらをとっても、Cコードとインターフェイスする必要があります。これを行う1つの方法は、システムモジュールを使用することです。可能な出発点としてImporting a Swift module using a C libraryを参照してください。
あなたの詳細な答えに感謝します。あなたが正しいです、おそらく最も良い答えは待つことです。 cモジュールはオプションかもしれません。おそらく、使いやすいapiがあります。 – boxi
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
希望します。もしあれば:)
私は現在、[bluemix-simple-http-client-swift](https://github.com/ibm-bluemix-mobile-services/bluemix-simple-http-client-swift.git)を試しています。これはラッパーですCCurlの周りにあり、たとえサンプルコードが悪い場合でも、コンパイルするためにそれを変更すれば、実際にうまく機能します。 –
私はそれをチェックアウトします –
[サンプルコードが修正されたプルリクエスト](https://github.com/romainmenke/bluemix-simple-http-client-swift/tree/patch-2) –
ない完全な答えは、多分便利誰かに質問をする:
は私だけ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()
}
}
のちょうど古き良き便利ではありません。私は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の.responseObject
とJSONDecodable
を見てください)。
[curl mapping for swift](https://github.com/IBM-Swift/CCurl)IBMは、カールのための迅速なパッケージを提供しています。私は単純なGET要求を行う方法を理解できません。 –