পোষ্ট পদ্ধতি সহ সুইফটে এইচটিটিপি অনুরোধ


188

আমি ইউআরএল-তে 2 পরামিতি পোস্ট করতে, সুইফটে একটি HTTP অনুরোধ চালানোর চেষ্টা করছি।

উদাহরণ:

লিঙ্ক: www.thisismylink.com/postName.php

প্যারাম:

id = 13
name = Jack

এটি করার সহজ উপায় কী?

আমি এমনকি প্রতিক্রিয়া পড়তে চাই না। আমি কেবল একটি পিএইচপি ফাইলের মাধ্যমে আমার ডাটাবেসে পরিবর্তনগুলি সম্পাদন করতে এটি প্রেরণ করতে চাই।


উত্তর:


409

সুইফ্ট 3 এবং পরবর্তী সময়ে আপনি এটি করতে পারেন:

let url = URL(string: "http://www.thisismylink.com/postName.php")!
var request = URLRequest(url: url)
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
let parameters: [String: Any] = [
    "id": 13,
    "name": "Jack & Jill"
]
request.httpBody = parameters.percentEncoded()

let task = URLSession.shared.dataTask(with: request) { data, response, error in
    guard let data = data, 
        let response = response as? HTTPURLResponse, 
        error == nil else {                                              // check for fundamental networking error
        print("error", error ?? "Unknown error")
        return
    }

    guard (200 ... 299) ~= response.statusCode else {                    // check for http errors
        print("statusCode should be 2xx, but is \(response.statusCode)")
        print("response = \(response)")
        return
    }

    let responseString = String(data: data, encoding: .utf8)
    print("responseString = \(responseString)")
}

task.resume()

কোথায়:

extension Dictionary {
    func percentEncoded() -> Data? {
        return map { key, value in
            let escapedKey = "\(key)".addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed) ?? ""
            let escapedValue = "\(value)".addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed) ?? ""
            return escapedKey + "=" + escapedValue
        }
        .joined(separator: "&")
        .data(using: .utf8)
    }
}

extension CharacterSet { 
    static let urlQueryValueAllowed: CharacterSet = {
        let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4
        let subDelimitersToEncode = "!$&'()*+,;="

        var allowed = CharacterSet.urlQueryAllowed
        allowed.remove(charactersIn: "\(generalDelimitersToEncode)\(subDelimitersToEncode)")
        return allowed
    }()
}

এটি উভয় মৌলিক নেটওয়ার্কিং ত্রুটির পাশাপাশি উচ্চ-স্তরের HTTP ত্রুটিগুলি পরীক্ষা করে। এটিও সঠিকভাবে শতাংশ কোয়েরির প্যারামিটারগুলি এড়িয়ে যায়।

নোট, আমি একটি ব্যবহৃত nameএর Jack & Jillসঠিক ব্যাখ্যা করার জন্য, x-www-form-urlencodedফল name=Jack%20%26%20Jill, যেটি "শতাংশ এনকোড" (অর্থাত স্থান সঙ্গে প্রতিস্থাপিত হয় %20এবং &মান সঙ্গে প্রতিস্থাপিত হয় %26)।


দেখুন এই উত্তরটি পূর্ববর্তী সংস্করণ সুইফট 2 প্রতিদান জন্য।


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

2
থ্যাঙ্কস রব, আমি যা খুঁজছিলাম ঠিক সেটাই ছিল! সাধারণ পোষ্টের চেয়ে বেশি কিছু নয়। দুর্দান্ত উত্তর!
ক্ষিপ্ত 16

1
কয়েক ঘন্টা ধরে বিভিন্ন সমাধানের সন্ধানের পরে, 3 এবং 4 লাইনগুলি আমার জীবন বাঁচাচ্ছে যেহেতু আমি আমার জীবনের জন্য এনএসজেএসএসনারাইজেশন.ডাটা উইথজেএসএসওন কাজ করতে পারি!
জোরক

1
@ কমপ্লেক্সি - এবং ফাইলনামগুলির মধ্যে সংযোগ আঁকার পরিবর্তে $_POSTআমি এটিকে আরও সহজ কিছুতে হ্রাস করব: আপনি URL টি সঠিক না পেয়ে পিএইচপি স্ক্রিপ্ট মোটেও চলবে না। তবে সবসময় এমনটি হয় না যে আপনার অবশ্যই ফাইলের নাম অন্তর্ভুক্ত করতে হবে (যেমন সার্ভারটি ইউআরএল রাউটিং করছে বা ডিফল্ট ফাইলের নাম থাকতে পারে)। এই ক্ষেত্রে, ওপি আমাদের একটি URL দিয়েছে যা একটি ফাইলের নাম অন্তর্ভুক্ত করে, তাই আমি কেবল তার মতো ইউআরএল ব্যবহার করেছি।
রব

1
আলমোফায়ার এর চেয়ে ভাল আর খারাপ কিছু নয় URLSession। সমস্ত নেটওয়ার্কিং এপিআই সহজাতভাবে অ্যাসিনক্রোনাস, পাশাপাশি তাদের হওয়া উচিত। এখন, আপনি যদি URLSessionঅ্যাসিনক্রোনাস অনুরোধগুলির সাথে আচরণের অন্যান্য কৌতূহলপূর্ণ উপায়গুলি সন্ধান করছেন, আপনি সেগুলি ( অনুরোধ বা আলামোফায়ারগুলি) অসম্পূর্ণ, কাস্টম Operationসাবক্লাসে মোড়ানো বিবেচনা করতে পারেন । অথবা আপনি কিছু প্রতিশ্রুতি গ্রন্থাগার, যেমন প্রমিসকিট ব্যবহার করতে পারেন।
রব

69

উপরের দিকে সুইফট 4

@IBAction func submitAction(sender: UIButton) {

    //declare parameter as a dictionary which contains string as key and value combination. considering inputs are valid

    let parameters = ["id": 13, "name": "jack"]

    //create the url with URL
    let url = URL(string: "www.thisismylink.com/postName.php")! //change the url

    //create the session object
    let session = URLSession.shared

    //now create the URLRequest object using the url object
    var request = URLRequest(url: url)
    request.httpMethod = "POST" //set http method as POST

    do {
        request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) // pass dictionary to nsdata object and set it as request body
    } catch let error {
        print(error.localizedDescription)
    }

    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")

    //create dataTask using the session object to send data to the server
    let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in

        guard error == nil else {
            return
        }

        guard let data = data else {
            return
        }

        do {
            //create json object from data
            if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
                print(json)
                // handle json...
            }
        } catch let error {
            print(error.localizedDescription)
        }
    })
    task.resume()
}

6
আপনার কোডটি দিয়ে আমি নিম্নলিখিত ত্রুটিটি পেয়েছি "ডেটাটি পড়া যায়নি কারণ এটি সঠিক ফর্ম্যাটে নেই" "
অ্যাপ্লিক্রেশন

আমি মনে করি আপনি স্ট্রিং ফর্ম্যাটে প্রতিক্রিয়া পাচ্ছেন আপনি যাচাই করতে পারবেন?
সুহিত পাতিল

1
আমি মনে করি যে এই সমাধানে এখানে সমস্যাটি হ'ল আপনি জেসন সিরিয়ালাইজিং হিসাবে প্যারামিটারটি পাস করেছেন এবং ওয়েব সার্ভিস ফর্মডাটা প্যারামিটার হিসাবে নিচ্ছে
Amr Angry

হ্যাঁ সমাধানে প্যারামগুলি হ'ল জসন, দয়া করে সার্ভারের সাথে পরীক্ষা করুন যদি এটির ফর্ম ডেটা প্রয়োজন হয় তবে বিষয়বস্তুর ধরণটি পরিবর্তন করুন যেমন অনুরোধ.setValue ("অ্যাপ্লিকেশন / এক্স-www-ফর্ম-urlencoded", এইচটিটিপিএইচডারফিল্ড: "বিষয়বস্তুর ধরণ")
সুহিত পাতিল

মাল্টিপার্ট প্যারামের জন্য সীমানা কনস্ট্যান্ট ব্যবহার করুন = "--V2ymHFg03ehbqgZCaKO6jy--"; অনুরোধ.এডভ্যালু ("মাল্টিপার্ট / ফর্ম-ডেটা বাউন্ডারি = (সীমানা কনসেন্ট্যান্ট)", ফর এইচটিটিপি হিডারফিল্ড: "সামগ্রী-প্রকার")
সুহিত পাতিল

17

সুইফট 5-এ কোনও পোষ্ট অনুরোধ এনকোড করার জন্য কোনও পরিষ্কার উপায়ের সন্ধানকারী For

আপনাকে ম্যানুয়ালি শতাংশ এনকোডিং যুক্ত করার দরকার নেই। URLComponentsএকটি জিইটি অনুরোধ URL তৈরি করতে ব্যবহার করুন । তারপরে queryযথাযথভাবে পালানো ক্যোয়ারী স্ট্রিং পেতে সেই URL টির সম্পত্তি ব্যবহার করুন ।

let url = URL(string: "https://example.com")!
var components = URLComponents(url: url, resolvingAgainstBaseURL: false)!

components.queryItems = [
    URLQueryItem(name: "key1", value: "NeedToEscape=And&"),
    URLQueryItem(name: "key2", value: "vålüé")
]

let query = components.url!.query

queryএকটি সঠিকভাবে পলান স্ট্রিং হতে হবে:

key1 = NeedToEscape% 3DAnd% 26 & key2 = V% C3 এ% A5l% C3 এ% বিসি% C3 এ% A9

এখন আপনি একটি অনুরোধ তৈরি করতে পারেন এবং কোয়েরিটি HTTPBody হিসাবে ব্যবহার করতে পারেন:

var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = Data(query.utf8)

এখন আপনি অনুরোধ পাঠাতে পারেন।


বিভিন্ন উদাহরণের পরে, কেবল এটি সুইফট 5 এর জন্য কাজ করে
ওলেকসান্ডার

আমি জিইটি রিকোয়েস্টকে ম্যানশন দিয়েছি কিন্তু পোষ্ট রিকোয়েস্টটি কেমন? কীভাবে httpBody তে প্যারামিটারগুলি পাস করবেন বা আমার এটির কী দরকার?
মের্টাল্প তাসডেলেন

স্মার্ট সমাধান! @ পয়েন্টাম শেয়ার করার জন্য ধন্যবাদ। আমি নিশ্চিত যে মার্টাল্পের আর উত্তর প্রয়োজন নেই, তবে অন্য যে কেউ পড়ার জন্য, উপরেরটি একটি পোষ্ট অনুরোধ করে।
ভ্লাদ স্প্রেস

12

আমার লগিং লাইব্রেরিতে আমি যে পদ্ধতিটি ব্যবহার করেছি সেগুলি এখানে: https://github.com/goktugyil/QorumLogs

এই পদ্ধতিটি Google ফর্মগুলির মধ্যে এইচটিএমএল ফর্মগুলি পূরণ করে।

    var url = NSURL(string: urlstring)

    var request = NSMutableURLRequest(URL: url!)
    request.HTTPMethod = "POST"
    request.setValue("application/x-www-form-urlencoded; charset=utf-8", forHTTPHeaderField: "Content-Type")
    request.HTTPBody = postData.dataUsingEncoding(NSUTF8StringEncoding)
    var connection = NSURLConnection(request: request, delegate: nil, startImmediately: true)

1
আপনি কি application/x-www-form-urlencodedসেট করছেন?
মধু

অনুরোধের সংস্থায় ডেটা পাস করার জন্য @ মধু
আছরাফ

4
let session = URLSession.shared
        let url = "http://...."
        let request = NSMutableURLRequest(url: NSURL(string: url)! as URL)
        request.httpMethod = "POST"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        var params :[String: Any]?
        params = ["Some_ID" : "111", "REQUEST" : "SOME_API_NAME"]
        do{
            request.httpBody = try JSONSerialization.data(withJSONObject: params, options: JSONSerialization.WritingOptions())
            let task = session.dataTask(with: request as URLRequest as URLRequest, completionHandler: {(data, response, error) in
                if let response = response {
                    let nsHTTPResponse = response as! HTTPURLResponse
                    let statusCode = nsHTTPResponse.statusCode
                    print ("status code = \(statusCode)")
                }
                if let error = error {
                    print ("\(error)")
                }
                if let data = data {
                    do{
                        let jsonResponse = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions())
                        print ("data = \(jsonResponse)")
                    }catch _ {
                        print ("OOps not good JSON formatted response")
                    }
                }
            })
            task.resume()
        }catch _ {
            print ("Oops something happened buddy")
        }

3
@IBAction func btn_LogIn(sender: AnyObject) {

    let request = NSMutableURLRequest(URL: NSURL(string: "http://demo.hackerkernel.com/ios_api/login.php")!)
    request.HTTPMethod = "POST"
    let postString = "email: test@test.com & password: testtest"
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request){data, response, error in
        guard error == nil && data != nil else{
            print("error")
            return
        }
        if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200{
            print("statusCode should be 200, but is \(httpStatus.statusCode)")
            print("response = \(response)")
        }
        let responseString = String(data: data!, encoding: NSUTF8StringEncoding)
        print("responseString = \(responseString)")
    }
    task.resume()
}

1
এই ইউআরএলআরকিউয়েস্টটি ব্যবহার করতে সুইফট 3/4-র আপডেট করার প্রয়োজন হতে পারে
অ্যাডাম ওয়ারে

2

এখানে সমস্ত উত্তর JSON অবজেক্ট ব্যবহার করে। এটি $this->input->post() আমাদের কোডাইনাইটার কন্ট্রোলারগুলির পদ্ধতিতে আমাদের সমস্যা দিয়েছে । CI_Controllerতাদেরকে JSON সরাসরি পড়তে পারে না। আমরা JSON ছাড়াই এটি করতে এই পদ্ধতিটি ব্যবহার করেছি

fun postRequest(){
//Create url object
guard let url = URL(string: yourURL) else {return}

//Create the session object
let session = URLSession.shared

//Create the URLRequest object using the url object
var request = URLRequest(url: url)

//Set the request method. Important Do not set any other headers, like Content-Type
request.httpMethod = "POST" //set http method as POST

//Set parameters here. Replace with your own.
let postData = "param1_id=param1_value&param2_id=param2_value".data(using: .utf8)
request.httpBody = postData
}

//Create a task using the session object, to run and return completion handler
let webTask = session.dataTask(with: request, completionHandler: {data, response, error in
guard error == nil else {
print(error?.localizedDescription ?? "Response Error")
return
}
guard let serverData = data else {
print("server data error")
return
}
do {
if let requestJson = try JSONSerialization.jsonObject(with: serverData, options: .mutableContainers) as? [String: Any]{
print("Response: \(requestJson)")
}
} catch let responseError {
print("Serialisation in error in creating response body: \(responseError.localizedDescription)")
let message = String(bytes: serverData, encoding: .ascii)
print(message as Any)
}
})
//Run the task
webTask.resume()

এখন আপনার CI_Controller পেতে সক্ষম হবে param1এবং param2ব্যবহার $this->input->post('param1')এবং$this->input->post('param2')

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.