2016-01-25 8 views
8

हम एक एपीआई कॉल करने के लिए HTTP (एस) अनुरोध (जीईटी) बनाना चाहते हैं। समस्या यह है कि, NSURLRequest (फिलहाल) फाउंडेशन फॉर लिनक्स (https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/NSURLRequest.swift) में लागू नहीं किया गया है।NSURLRequest के बिना स्विफ्ट में HTTP अनुरोध

क्या HTTP अनुरोध बनाने के लिए कोई अन्य संभावनाएं हैं?

+1

[स्विफ्ट के लिए कर्ल मैपिंग] (https://github.com/IBM-Swift/CCurl) आईबीएम में कर्ल के लिए एक तेज पैकेज है। मैं समझ नहीं पा रहा हूं कि इसे सरल जीईटी अनुरोध करने के लिए कैसे प्राप्त किया जाए। –

उत्तर

5

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) 

आधिकारिक page है आप स्रोतों को भी है कि आम अनुरोधों के लिए उपयोगी हो सकता है में एक JSON पार्सर पा सकते हैं:

यहाँ एक कोड उदाहरण है। स्थापना के लिए केवल uri_parser आवश्यक है।

+0

मुझे सच में आश्चर्य है कि दस्तावेज़ के साथ एक ही स्विफ्ट पैकेज क्यों नहीं है। यदि आप गोलांग देखते हैं, तो आपको बिना किसी दस्तावेज़ के ढूंढने के लिए लंबा और कठिन लगना होगा। वैसे भी, मैं कोशिश करूँगा और आपसे वापस आऊंगा। –

+0

केवल तेज 2.2 है और 6 महीने में गतिविधि नहीं देखी है। तो अब बहुत उपयोगी नहीं है। –

+0

मुझे कुछ सीमाएं हैं जो मुझे पता है लेकिन यह –

2

ध्यान में रखते हुए कि लिनक्स पर स्विफ्ट प्रगति पर तेजी से विकसित कार्य है, मुझे लगता है कि सबसे अच्छा दृष्टिकोण, जब तक स्थिति अधिक स्थिर न हो, तब तक कोई गंभीर विकास करना बंद कर देना है। यहां तक ​​कि अगर आप HTTP अनुरोध करने में बाधाओं को दूर करते हैं, तो लिनक्स पर अपरिपक्व होने वाली तकनीक के कारण अन्य अप्रिय आश्चर्य भी होंगे।

हालांकि, अगर यह जिज्ञासा और सीखने का मामला है, यहाँ कुछ विचार कर रहे हैं, भले ही मैं उन्हें अपने आप को प्रयास नहीं किया है:

  • शायद बुला CoreFoundation सी एपीआई सीधे काम करेंगे।
  • एक सी रैपर लिखें, जो आपको पुराने पुराने सी नेटवर्क एपीआई का उपयोग करके इंटरफ़ेस प्रदान करता है। इस दृष्टिकोण के लिए शायद दूसरों की तुलना में अधिक प्रयास की आवश्यकता होगी, क्योंकि आप कई पहियों का पुन: आविष्कार करेंगे।
  • एक सी रैपर लिखें, लेकिन एक उच्च स्तरीय सी लाइब्रेरी लपेटें जो यूआरएल के साथ काम करता है; libcurl दिमाग में आता है।

चाहे आप इनमें से किन दृष्टिकोणों को देखते हैं, आपको सी कोड के साथ इंटरफेस करने की आवश्यकता होगी। ऐसा करने का एक तरीका सिस्टम मॉड्यूल का उपयोग करना है, संभावित प्रारंभ बिंदु के रूप में Importing a Swift module using a C library देखें।

+0

आपके विस्तृत उत्तर के लिए धन्यवाद। आप सही हैं, शायद सबसे अच्छा जवाब प्रतीक्षा करना है। एक सी मॉड्यूल एक विकल्प हो सकता है, शायद एपीआई का उपयोग करने में आसान है। – 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

अब मैं कोशिश कर रहा हूं [ब्लूमिक्स-सरल-http-client-swift] (https://github.com/ibm-bluemix-mobile-services/bluemix-simple-http-client-swift.git) यह एक रैपर है सीसीयूआरएल के आसपास और भले ही नमूना कोड खराब है, अगर आप इसे संकलित करने के लिए संशोधित करते हैं तो यह वास्तव में अच्छी तरह से काम करता है। –

+0

मैं इसे –

+0

[सही नमूना कोड के साथ पुल अनुरोध] की जांच करूँगा (https://github.com/romainmenke/bluemix-simple-http-client-swift/tree/patch-2) –

0

नहीं एक पूर्ण जवाब है, लेकिन शायद उपयोगी किसी को:

मैं केवल NSData(contentsOfURL: NSURL) इसलिए मैं उस को बंद करने के साथ इस करता KituraNet के लिए एक आवरण लेखन समाप्त हो गया की जरूरत है। मैं बस जांचता हूं कि डेटा है और उसे वापस कर दें।

क्योंकि NSURL पूरी तरह कार्यान्वित होने से बहुत दूर है, मैंने अभी भी यूआरएल को String के रूप में पास करने का निर्णय लिया है।

यह 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

का सिर्फ अच्छे पुराने सुविधा के मध्य 2017 है आईबीएम की SwiftyRequest पुस्तकालय, जो दोनों लिनक्स और आईओएस पर काम करता है के बाद से नहीं है। मैंने इसे लिनक्स पर आजमाया है और ठीक काम करता प्रतीत होता है।

एक अनुरोध बनाना (डॉक्स से एक उदाहरण अनुकूलित) इस तरह दिखता है:

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

आप प्रतिक्रिया के लिए JSON का उपयोग कर रहे हैं, यह भी आप एक "स्कीमा" उपलब्ध कराने के आधार पर एक वस्तु का निर्माण कर सकते (उदाहरण के लिए tests में .responseObject और JSONDecodable पर एक नज़र डालें)।

संबंधित मुद्दे