কীভাবে একটি এইচটিটিপি অনুরোধ করবেন + সুইফটে বেসিক লেখক


99

আমার কাছে বেসিক প্রমাণীকরণের সাথে একটি RESTFull পরিষেবা রয়েছে এবং আমি এটি iOS + সুইফ্ট থেকে চাই। কিভাবে এবং কোথায় আমাকে এই অনুরোধের জন্য শংসাপত্র সরবরাহ করতে হবে?

আমার কোড (দুঃখিত, আমি কেবল আইওএস / আপত্তি-সি / সুইফ্ট শিখতে শুরু করেছি):

class APIProxy: NSObject {
var data: NSMutableData = NSMutableData()

func connectToWebApi() {
    var urlPath = "http://xx.xx.xx.xx/BP3_0_32/ru/hs/testservis/somemethod"
    NSLog("connection string \(urlPath)")
    var url: NSURL = NSURL(string: urlPath)
    var request = NSMutableURLRequest(URL: url)
    let username = "hs"
    let password = "1"
    let loginString = NSString(format: "%@:%@", username, password)
    let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)
    let base64LoginString = loginData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.fromMask(0))
    request.setValue(base64LoginString, forHTTPHeaderField: "Authorization")

    var connection: NSURLConnection = NSURLConnection(request: request, delegate: self)

    connection.start()
}


//NSURLConnection delegate method
func connection(connection: NSURLConnection!, didFailWithError error: NSError!) {
    println("Failed with error:\(error.localizedDescription)")
}

//NSURLConnection delegate method
func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
    //New request so we need to clear the data object
    self.data = NSMutableData()
}

//NSURLConnection delegate method
func connection(connection: NSURLConnection!, didReceiveData data: NSData!) {
    //Append incoming data
    self.data.appendData(data)
}

//NSURLConnection delegate method
func connectionDidFinishLoading(connection: NSURLConnection!) {
    NSLog("connectionDidFinishLoading");
}

}


বিটিডাব্লু, আপনার জন্য সংযোগ NSURLConnection(request: request, delegate: self)দেবে startstartপদ্ধতিটি নিজেকে স্পষ্টভাবে কল করবেন না , কার্যকরভাবে দ্বিতীয়বার এটি শুরু করুন।
রব

4
এনএসআরএল সংযোগ ছিন্ন করা হয়েছে। আপনার সত্যই এনএসআরএল সেশনে স্যুইচ করা উচিত।
স্যাম সোফেস

উত্তর:


171

আপনি একটি URLRequestউদাহরণে শংসাপত্রাদি সরবরাহ করেন , সুইফট 3-এর মতো:

let username = "user"
let password = "pass"
let loginString = String(format: "%@:%@", username, password)
let loginData = loginString.data(using: String.Encoding.utf8)!
let base64LoginString = loginData.base64EncodedString()

// create the request
let url = URL(string: "http://www.example.com/")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")

// fire off the request
// make sure your class conforms to NSURLConnectionDelegate
let urlConnection = NSURLConnection(request: request, delegate: self)

বা একটি NSMutableURLRequestসুইফট 2 এ:

// set up the base64-encoded credentials
let username = "user"
let password = "pass"
let loginString = NSString(format: "%@:%@", username, password)
let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)!
let base64LoginString = loginData.base64EncodedStringWithOptions([])

// create the request
let url = NSURL(string: "http://www.example.com/")
let request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")

// fire off the request
// make sure your class conforms to NSURLConnectionDelegate
let urlConnection = NSURLConnection(request: request, delegate: self)

অনুরোধ.সেটওয়ালিউ (বেস 64 লগিনস্ট্রিং, এইচটিটিপিহিডারফিল্ড: "অনুমোদন") => অনুরোধ.সেটওয়ালু ("বেসিক (বেস 64 লোগিনস্ট্রিং)", # এইচটিটিপি হেইডারফিল্ড: "অনুমোদন") আমি "বেসিক" শব্দটি যুক্ত করেছি এবং এটি আমার পক্ষে ভাল কাজ করেছে
মিঃ কোস

4
ভালো বল ধরা! উত্তর আপডেট।
নাট কুক

4
'এনএসডাটাবেস 64৪ এনকোডিংঅ্যাপশনস. টাইপ' এর 'ম্যাস্ক' নামক কোনও সদস্য নেই .. এটি এক্সকোড .1.১ এ আমি পেয়েছি ত্রুটি..প্লেস সহায়তা..কি মুখোশ (0)
বালা বিষ্ণু

4
আমি এক্সকোডে @ বালাবিষ্ণু হিসাবে একই বার্তাটিও দেখছি তবে আমি সবেমাত্র ব্যবহার করেছি instead সমস্ত জেরোস পরিবর্তে
শান লারকিন

4
বিকল্প সেটগুলির জন্য সুইফটের সিনট্যাক্সটি এক্সকোড ১.১ এ পরিবর্তিত হয়েছে। আপনি কোনও বিকল্পের জন্য NSDataBase64EncodingOptions(0)বা ব্যবহার করতে পারেন nil। উত্তর আপডেট।
নাট কুক 21

22

// প্রমাণীকরণ বেস 64 এনকোডিং স্ট্রিং তৈরি করুন

    let PasswordString = "\(txtUserName.text):\(txtPassword.text)"
    let PasswordData = PasswordString.dataUsingEncoding(NSUTF8StringEncoding)
    let base64EncodedCredential = PasswordData!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength)
    //let base64EncodedCredential = PasswordData!.base64EncodedStringWithOptions(nil)

// প্রমাণীকরণ url তৈরি করুন

    let urlPath: String = "http://...../auth"
    var url: NSURL = NSURL(string: urlPath)

// বেসিক প্রমাণীকরণের অনুরোধ তৈরি করুন এবং প্রারম্ভিক করুন

    var request: NSMutableURLRequest = NSMutableURLRequest(URL: url)
    request.setValue("Basic \(base64EncodedCredential)", forHTTPHeaderField: "Authorization")
    request.HTTPMethod = "GET"

// আপনি নীচের একটি পদ্ধতি ব্যবহার করতে পারেন

// এনএসআরএল সংযোগডেটাডেলিগেটের সাথে URL টি 1 টি অনুরোধ

    let queue:NSOperationQueue = NSOperationQueue()
    let urlConnection = NSURLConnection(request: request, delegate: self)
    urlConnection.start()

অসিনক্রোনাসআরউয়েস্টের সাথে // 2 ইউআরএল অনুরোধ

    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
        println(NSString(data: data, encoding: NSUTF8StringEncoding))
    }

জেসন আউটপুট সহ অ্যাসিঙ্ক্রোনাস রিকোয়েস্টের সাথে // 2 ইউআরএল অনুরোধ

    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
        var err: NSError
        var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
        println("\(jsonResult)")
    })

সিঙ্ক্রোনাস রিকুয়েস্টের সাথে // 3 ইউআরএল অনুরোধ

    var response: AutoreleasingUnsafePointer<NSURLResponse?>=nil
    var dataVal: NSData =  NSURLConnection.sendSynchronousRequest(request, returningResponse: response, error:nil)
    var err: NSError
    var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(dataVal, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
    println("\(jsonResult)")

// এনএসআরএলসেশন সহ ইউআরএল 4 অনুরোধ

    let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    let authString = "Basic \(base64EncodedCredential)"
    config.HTTPAdditionalHeaders = ["Authorization" : authString]
    let session = NSURLSession(configuration: config)

    session.dataTaskWithURL(url) {
        (let data, let response, let error) in
        if let httpResponse = response as? NSHTTPURLResponse {
            let dataString = NSString(data: data, encoding: NSUTF8StringEncoding)
            println(dataString)
        }
    }.resume()

// আপনি যদি অনুরোধটি পরিবর্তন করেন তবে মারাত্মক ত্রুটি হতে পারে server এইচটিটিপিএমথোড = "পোস্ট" সার্ভারের অনুরোধটি পাওয়ার পরে


4
বিটিডাব্লু, এটি অপের কোডটিতে ভুলটি পুনরাবৃত্তি করে: NSURLConnection(request: request, delegate: self)অনুরোধ শুরু করে। আপনি startএটি দ্বিতীয়বার করা উচিত নয় ।
রব

19

দ্রুত 4:

let username = "username"
let password = "password"
let loginString = "\(username):\(password)"

guard let loginData = loginString.data(using: String.Encoding.utf8) else {
    return
}
let base64LoginString = loginData.base64EncodedString()

request.httpMethod = "GET"
request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")

6

সুইফট 2 এ:

extension NSMutableURLRequest {
    func setAuthorizationHeader(username username: String, password: String) -> Bool {
        guard let data = "\(username):\(password)".dataUsingEncoding(NSUTF8StringEncoding) else { return false }

        let base64 = data.base64EncodedStringWithOptions([])
        setValue("Basic \(base64)", forHTTPHeaderField: "Authorization")
        return true
    }
}

আমি নিশ্চিত নই যে আপনার কোনও কিছুকে বেস 64 এ রূপান্তর করার আগে পালাতে হবে
স্যাম সোফেস

4

SWIFT 3 এবং অ্যাপাচ সহজ অথের জন্য সরল যান:

func urlSession(_ session: URLSession, task: URLSessionTask,
                didReceive challenge: URLAuthenticationChallenge,
                completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {

    let credential = URLCredential(user: "test",
                                   password: "test",
                                   persistence: .none)

    completionHandler(.useCredential, credential)


}

2

আমি একটি অ্যাপ্লিকেশনটিতে প্রয়োগ করছি এমন কিছু স্বয়ংক্রিয় ইমেলগুলির জন্য মেলগুনে পোস্ট করার চেষ্টা করতে আমার একই সমস্যা হয়েছিল had

আমি একটি বৃহত এইচটিটিপি সাড়া দিয়ে এটি সঠিকভাবে কাজ করতে সক্ষম হয়েছি। আমি কীগুলি.পালিস্টে পুরো পথটি রেখেছি যাতে আমি আমার কোডটি গিথুবে আপলোড করতে পারি এবং কিছু আর্গুমেন্টকে ভেরিয়েবলগুলিতে ভেঙে ফেলতে পারি যাতে আমি সেগুলি প্রোগ্রামের পরে রাস্তায় নামিয়ে আনতে পারি।

// Email the FBO with desired information
// Parse our Keys.plist so we can use our path
var keys: NSDictionary?

if let path = NSBundle.mainBundle().pathForResource("Keys", ofType: "plist") {
    keys = NSDictionary(contentsOfFile: path)
}

if let dict = keys {
    // variablize our https path with API key, recipient and message text
    let mailgunAPIPath = dict["mailgunAPIPath"] as? String
    let emailRecipient = "bar@foo.com"
    let emailMessage = "Testing%20email%20sender%20variables"

    // Create a session and fill it with our request
    let session = NSURLSession.sharedSession()
    let request = NSMutableURLRequest(URL: NSURL(string: mailgunAPIPath! + "from=FBOGo%20Reservation%20%3Cscheduler@<my domain>.com%3E&to=reservations@<my domain>.com&to=\(emailRecipient)&subject=A%20New%20Reservation%21&text=\(emailMessage)")!)

    // POST and report back with any errors and response codes
    request.HTTPMethod = "POST"
    let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
        if let error = error {
            print(error)
        }

        if let response = response {
            print("url = \(response.URL!)")
            print("response = \(response)")
            let httpResponse = response as! NSHTTPURLResponse
            print("response code = \(httpResponse.statusCode)")
        }
    })
    task.resume()
}

মেলগুন পাথটি মূল্যের সাথে মেইলগুনাপিপথ নামে একটি স্ট্রিং হিসাবে কীগুলি.পিস্টে রয়েছে:

https://API:key-<my key>@api.mailgun.net/v3/<my domain>.com/messages?

আশা করি এটি তাদের পোস্টের অনুরোধগুলির জন্য তৃতীয় পক্ষের কোডটি এড়াতে চাইছেন এমন কোনও ব্যক্তির একটি সমাধান প্রস্তাব দেয়!


1

আমার সমাধান নিম্নলিখিত হিসাবে কাজ করে:

import UIKit


class LoginViewController: UIViewController, NSURLConnectionDataDelegate {

  @IBOutlet var usernameTextField: UITextField
  @IBOutlet var passwordTextField: UITextField

  @IBAction func login(sender: AnyObject) {
    var url = NSURL(string: "YOUR_URL")
    var request = NSURLRequest(URL: url)
    var connection = NSURLConnection(request: request, delegate: self, startImmediately: true)

  }

  func connection(connection:NSURLConnection!, willSendRequestForAuthenticationChallenge challenge:NSURLAuthenticationChallenge!) {

    if challenge.previousFailureCount > 1 {

    } else {
        let creds = NSURLCredential(user: usernameTextField.text, password: passwordTextField.text, persistence: NSURLCredentialPersistence.None)
        challenge.sender.useCredential(creds, forAuthenticationChallenge: challenge)

    }

}

  func connection(connection:NSURLConnection!, didReceiveResponse response: NSURLResponse) {
    let status = (response as NSHTTPURLResponse).statusCode
    println("status code is \(status)")
    // 200? Yeah authentication was successful
  }


  override func viewDidLoad() {
    super.viewDidLoad()

  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

  }  
}

আপনি এই শ্রেণিকে একটি ভিউকন্ট্রোলারের প্রয়োগ হিসাবে ব্যবহার করতে পারেন। আপনার ক্ষেত্রগুলিকে আইবিআউটলেট টীকাযুক্ত ভার্স এবং আপনার বোতামটি আইবিএक्शन এনোটেটেড ফাংশনের সাথে সংযুক্ত করুন।

ব্যাখ্যা: ফাংশন লগইনে আপনি আপনার অনুরোধটি এনএসআরএল, এনএসআরএল অনুরোধ এবং এনএসআরএল সংযোগের মাধ্যমে তৈরি করেন। এখানে প্রয়োজনীয় প্রতিনিধি যা এই শ্রেণীর (স্ব) উল্লেখ করে। প্রতিনিধিদের কল পাওয়ার জন্য আপনার প্রয়োজন

  • প্রোটোকলটি এনএসআরএল সংযোগ ডেটাডেলিগেট ক্লাসে যুক্ত করুন
  • প্রোটোকলগুলির ফাংশন "সংযোগটি প্রয়োগ করুন: উইলসেন্ডার্কেস্টফোর্ডআউটেন্টিফিকেশন চ্যালেঞ্জ" অনুরোধটিতে শংসাপত্রগুলি যুক্ত করার জন্য এটি ব্যবহৃত হয়
  • প্রোটোকলের ফাংশন "সংযোগটি প্রয়োগ করুন: didReLiveResponse" এটি http প্রতিক্রিয়া স্থিতি কোড পরীক্ষা করবে

সিঙ্ক্রোনাস অনুরোধের জন্য কি http প্রতিক্রিয়া স্থিতি কোডটি চেক করার কোনও উপায় আছে?
ম্যাট

এনএসআরএল সংযোগ ছিন্ন করা হয়েছে। অ্যাপল আপনাকে এনএসআরএলসেশন ব্যবহার করতে উত্সাহিত করে।
স্যাম সোফস

1

আমি লগইন বোতাম ক্লিক করে জসন কল করছি

@IBAction func loginClicked(sender : AnyObject){

var request = NSMutableURLRequest(URL: NSURL(string: kLoginURL)) // Here, kLogin contains the Login API.


var session = NSURLSession.sharedSession()

request.HTTPMethod = "POST"

var err: NSError?
request.HTTPBody = NSJSONSerialization.dataWithJSONObject(self.criteriaDic(), options: nil, error: &err) // This Line fills the web service with required parameters.
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")

var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
 //   println("Response: \(response)")
var strData = NSString(data: data, encoding: NSUTF8StringEncoding)
println("Body: \(strData)")       
var err1: NSError?
var json2 = NSJSONSerialization.JSONObjectWithData(strData.dataUsingEncoding(NSUTF8StringEncoding), options: .MutableLeaves, error:&err1 ) as NSDictionary

println("json2 :\(json2)")

if(err) {
    println(err!.localizedDescription)
}
else {
    var success = json2["success"] as? Int
    println("Succes: \(success)")
}
})

task.resume()

}

এখানে, আমি পরামিতিগুলির জন্য একটি পৃথক অভিধান তৈরি করেছি।

var params = ["format":"json", "MobileType":"IOS","MIN":"f8d16d98ad12acdbbe1de647414495ec","UserName":emailTxtField.text,"PWD":passwordTxtField.text,"SigninVia":"SH"]as NSDictionary
     return params
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.