দ্রুত শরীরের সাথে একটি পোস্টের অনুরোধ কীভাবে প্রেরণ করবেন


102

আমি আলামোফায়ার ব্যবহার করে দ্রুত বডি দিয়ে একটি পোস্টের অনুরোধ করার চেষ্টা করছি।

আমার জসন শরীর দেখতে দেখতে:

{
    "IdQuiz" : 102,
    "IdUser" : "iosclient",
    "User" : "iosclient",
    "List":[
        {
        "IdQuestion" : 5,
        "IdProposition": 2,
        "Time" : 32
        },
        {
        "IdQuestion" : 4,
        "IdProposition": 3,
        "Time" : 9
        }
    ]
}

আমি let listএনএসডিকশনারি দিয়ে যা করার মতো চেষ্টা করছি :

[[Time: 30, IdQuestion: 6510, idProposition: 10], [Time: 30, IdQuestion: 8284, idProposition: 10]]

এবং আলমোফায়ার ব্যবহার করে আমার অনুরোধটি দেখে মনে হচ্ছে:

Alamofire.request(.POST, "http://myserver.com", parameters: ["IdQuiz":"102","IdUser":"iOSclient","User":"iOSClient","List":list ], encoding: .JSON)
            .response { request, response, data, error in
            let dataString = NSString(data: data!, encoding:NSUTF8StringEncoding)
                println(dataString)
        }

অনুরোধটির একটি ত্রুটি রয়েছে এবং আমি বিশ্বাস করি সমস্যাটি অভিধানের তালিকায় রয়েছে, কারণ যদি আমি তালিকাটি ব্যতীত অনুরোধ করি তবে এটি কার্যকর হয়, তাই কোনও ধারণা?


আমি প্রস্তাবিত সমাধানটি চেষ্টা করেছি তবে আমি একই সমস্যার মুখোমুখি হয়েছি:

 let json = ["List":list,"IdQuiz":"102","IdUser":"iOSclient","UserInformation":"iOSClient"]
        let data = NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted,error:nil)
        let jsons = NSString(data: data!, encoding: NSUTF8StringEncoding)



    Alamofire.request(.POST, "http://myserver.com", parameters: [:], encoding: .Custom({
        (convertible, params) in
        var mutableRequest = convertible.URLRequest.copy() as! NSMutableURLRequest
        mutableRequest.HTTPBody = jsons!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
        return (mutableRequest, nil)
    }))
        .response { request, response, data, error in
        let dataString = NSString(data: data!, encoding:NSUTF8StringEncoding)
           println(dataString)
    }


4
আপনার মন্তব্যের জন্য ধন্যবাদ, তবে আপনার প্রদত্ত পোস্টটি কোনও
স্ট্রেঞ্জার বি

@ ইয়াসারবি। আপনার JSON কে একটি NSString এ রূপান্তর করুন (এর জন্য কোনও পদ্ধতি আছে), এবং তারপরে @ ভাবিনের লিঙ্কটি ব্যবহার করবেন?
লারমে

@ লারম আপনি যদি একটি উদাহরণ সরবরাহ করেন তবে এটি সত্যিই সহায়ক হবে
আগন্তুক বি।

@ লারমে আমি প্রস্তাবিত সমাধানটি চেষ্টা করেছি তবে আমার একই সমস্যাটি অনুরোধটি কাজ করে না যদি না আমি পুত্রের শরীর থেকে তালিকাটি মুছে ফেলি
স্ট্রেঞ্জার বি।

উত্তর:


101

আপনি কাছাকাছি। প্যারামিটার অভিধানের বিন্যাসটি সঠিক দেখাচ্ছে না। আপনার নিম্নলিখিত চেষ্টা করা উচিত:

let parameters: [String: AnyObject] = [
    "IdQuiz" : 102,
    "IdUser" : "iosclient",
    "User" : "iosclient",
    "List": [
        [
            "IdQuestion" : 5,
            "IdProposition": 2,
            "Time" : 32
        ],
        [
            "IdQuestion" : 4,
            "IdProposition": 3,
            "Time" : 9
        ]
    ]
]

Alamofire.request(.POST, "http://myserver.com", parameters: parameters, encoding: .JSON)
    .responseJSON { request, response, JSON, error in
        print(response)
        print(JSON)
        print(error)
    }

আশা করি এটি আপনার সমস্যার সমাধান করেছে। যদি তা না হয়, দয়া করে উত্তর দিন এবং আমি সেই অনুযায়ী আমার উত্তরটি সামঞ্জস্য করব।


আমি কীভাবে আমার জেএসএনের কিছু সম্পত্তি বাতিল করতে পারি, কারণ আমি অর্পণ nilকরতে পারি না AnyObject?
আম্প তানাওয়াত

4
@ জেসিম আব্বাস আপনার অ্যালামোফায়ারের সংস্করণটি পরীক্ষা করে দেখুন, আপনি যদি ভি ৪.০ তে থাকেন তবে + নীচে আমার উত্তরটি দেখুন
জিয়ান্নি কার্লো

এনকোডিংয়ের ক্ষেত্রে এই জাতীয় প্যারামিটারটি কীভাবে প্রেরণ করা যায় .url এনকোডিং
প্রমোদ শুক্ল

4
'অন্তর্গত' টাইপের মানটি প্রত্যাশিত অভিধানের মান ধরণের 'যেকোনওবজেক্ট' তে রূপান্তর করতে পারে না
মায়াটমিনস

কীভাবে করা যাক বলুন "তালিকা" প্যারামিটারের মান 1000 তালিকার মতো রয়েছে?
নিশাদ অরোরা

178

আপনি যদি অ্যালামোফায়ার v4.0 + ব্যবহার করেন তবে গৃহীত উত্তরগুলি দেখতে এরকম হবে:

let parameters: [String: Any] = [
    "IdQuiz" : 102,
    "IdUser" : "iosclient",
    "User" : "iosclient",
    "List": [
        [
            "IdQuestion" : 5,
            "IdProposition": 2,
            "Time" : 32
        ],
        [
            "IdQuestion" : 4,
            "IdProposition": 3,
            "Time" : 9
        ]
    ]
]

Alamofire.request("http://myserver.com", method: .post, parameters: parameters, encoding: JSONEncoding.default)
    .responseJSON { response in
        print(response)
    }

6
দুর্দান্ত! এই এক গ্রহণযোগ্য উত্তর পরিবর্তন করুন! :) বা আলমোফায়ার 3 এবং 4 উভয় সমাধানের জন্য বর্তমানের সাথে একত্রিত করুন।
টম ভ্যান জুম্মেরেন

4
সম্মত - এটি JSONEncodingআমার জন্য যে প্রকারটি করেছে তা ছিন্নমূল করার সুস্পষ্ট বক্তব্য ।
থমাস ভারবিক

@ জিয়ান্নি কার্লো আমি আপনার উত্তর হিসাবে একই ব্যবহার করেছি তবে আমার সাফল্যের প্রতিক্রিয়ায় আমি ত্রুটি পেয়েছি।
রামকৃষ্ণ

@ রামকৃষ্ণ যা আপনি ব্যবহার করছেন সেই API এর সাথে সম্পর্কিত হতে পারে। আমি সাধারণত সুইফটিজেএসএন লাইব্রেরিটি ব্যবহার করি এমন প্রতিক্রিয়াটি ਪਾਰ্স করতে, আপনি কী ধরণের ত্রুটি গ্রহণ করছেন তা আমাকে জানতে দিন
জিয়ান্নি কার্লো

আপনার উত্তর দেওয়ার জন্য ধন্যবাদ. আমি সমাধান পেয়েছি।
রামকৃষ্ণ

37

আমি মত অন্যান্য উত্তরগুলির যেকোনটিকে এতদূর না (সম্ভবত ব্যতীত এক SwiftDeveloper দ্বারা) কারণ তারা হয় আপনার তাদেরকে JSON deserialize, এটা আবার তাদেরকে JSON নিজেই কাঠামো সম্পর্কে ধারাবাহিকভাবে কেবল, অথবা যত্ন প্রয়োজন।

সঠিক উত্তরটি আফ্রোদেভ অন্য একটি প্রশ্নে পোস্ট করেছেন। আপনার উচিত এবং এটি upvote করা উচিত।

নীচে কিছু ছোট পরিবর্তন (প্রাথমিকভাবে সুস্পষ্ট ইউটিএফ -8 চারসেট) সহ আমার অভিযোজনটি দেওয়া আছে।

let urlString = "https://example.org/some/api"
let json = "{\"What\":\"Ever\"}"

let url = URL(string: urlString)!
let jsonData = json.data(using: .utf8, allowLossyConversion: false)!

var request = URLRequest(url: url)
request.httpMethod = HTTPMethod.post.rawValue
request.setValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type")
request.httpBody = jsonData

Alamofire.request(request).responseJSON {
    (response) in

    print(response)
}

আমি সম্মত হই যে @ সুইফট ডেভেলপারের উত্তরটি আপনি যে 'সঠিক' বলে উল্লেখ করেছেন তার চেয়ে ভাল এবং (আমার মতে) ভাল। তবে আমি দুটি বিষয় নিয়ে তর্ক করব। এক, আপনি যে 'সঠিক উত্তরটি "উল্লেখ করেছেন তাতে ত্রুটি রয়েছে যা toJSONStringকোনও স্থানীয় পদ্ধতি নয়, সুতরাং এটি মূলত একটি কালো বাক্স যা আপনাকে প্রয়োগ করতে হবে। দ্বিতীয়ত, আপনি যে উত্তরটি দিয়েছেন, এমন একটি ভেরি সরবরাহ করে jsonযা জসন স্ট্রিং হিসাবে শুরু হয়, বাস্তবে কারও কাছে প্যারামিটার থাকে না, যদি না আপনি সেভাবে স্থানীয়ভাবে রূপান্তর করে এবং সেগুলি সংরক্ষণ করেন।
জিয়াননি কার্লো

@ জিয়ান্নি কার্লো ১) toJSONStringআমার উত্তরের কোনও উত্তর নেই, ২) " বাস্তবে কারও কাছে সেই পরামিতি নেই" - এটি প্রচুর অনুমান করে চলেছে; জেএসএন অ্যাপ্লিকেশনটির বিভিন্ন অংশ থেকে আসতে পারে, অনুরোধটি করার সাথে সম্পর্কিত নয় এবং যার মধ্যে নেটওয়ার্কিং কোড কিছুই জানে না।
তিব্বতের সমুদ্র উপকূল

আমার জীবনকে আরও সহজ করার জন্য ধন্যবাদ !!! 1 আমি ফ্লাস্ক ব্যাকএন্ডের সাথে অ্যালামোফায়ার ব্যবহার করছি। পোস্টম্যান থেকে সমস্ত কিছুই ভালভাবে কাজ করেছে Alamকিন্তু অ্যালোমোফায়ার থেকে এটি কাজ করে না। এইচটিটিপি বডি এবং ইউআরএল প্যারামিটার এবং সেগুলি কীভাবে সেট করা যায়। আবার ধন্যবাদ.
ভিনিল

8

এক্সকোড 8. এক্স, সুইফট 3. এক্স

সহজ ব্যবহার;

    let params:NSMutableDictionary? = [
    "IdQuiz" : 102,
    "IdUser" : "iosclient",
    "User" : "iosclient",
    "List": [
        [
            "IdQuestion" : 5,
            "IdProposition": 2,
            "Time" : 32
        ],
        [
            "IdQuestion" : 4,
            "IdProposition": 3,
            "Time" : 9
        ]
    ]
];
            let ulr =  NSURL(string:"http://myserver.com" as String)
            let request = NSMutableURLRequest(url: ulr! as URL)
            request.httpMethod = "POST"
            request.setValue("application/json", forHTTPHeaderField: "Content-Type")
            let data = try! JSONSerialization.data(withJSONObject: params!, options: JSONSerialization.WritingOptions.prettyPrinted)

            let json = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
            if let json = json {
                print(json)
            }
            request.httpBody = json!.data(using: String.Encoding.utf8.rawValue);


            Alamofire.request(request as! URLRequestConvertible)
                .responseJSON { response in
                    // do whatever you want here
                   print(response.request)  
                   print(response.response) 
                   print(response.data) 
                   print(response.result)

            }

8

এক্সকোড 11 - সুইফ্ট 5 - অ্যালামোফায়ার 5.0-এ স্বীকৃত উত্তর

func postRequest() {
    let parameters: [String: Any] = [
        "IdQuiz" : 102,
        "IdUser" : "iosclient",
        "User" : "iosclient",
        "List": [
            [
                "IdQuestion" : 5,
                "IdProposition": 2,
                "Time" : 32
            ],
            [
                "IdQuestion" : 4,
                "IdProposition": 3,
                "Time" : 9
            ]
        ]
    ]
    AF.request("http://myserver.com", method:.post, parameters: parameters,encoding: JSONEncoding.default) .responseJSON { (response) in
        print(response)
    }
}

গুরুত্বপূর্ণ! এনকোডিং ব্যবহার করুন: JSONEncoding.default। আমি কয়েক ঘন্টা ধরে মাথা বেঁধে চলেছি ... জিইটি প্যারামের জন্য ডিফল্টটি এনকোডিং হচ্ছে।
রিমন্ড হিল

8

আপনি যদি ব্যবহার করছেন swift4এবং Alamofire v4.0স্বীকৃত কোডটি দেখতে এইরকম হবে:

            let parameters: Parameters = [ "username" : email.text!, "password" : password.text! ]
            let urlString = "https://api.harridev.com/api/v1/login"
            let url = URL.init(string: urlString)
            Alamofire.request(url!, method: .put, parameters: parameters, encoding: JSONEncoding.default, headers: nil).responseJSON { response in
                 switch response.result
                {
                case .success(let json):
                    let jsonData = json as! Any
                    print(jsonData)
                case .failure(let error):
                    self.errorFailer(error: error)
                }
            }

4

আমি সুইফট ডেভেলপারের উত্তরটি সামান্য সম্পাদনা করেছি , কারণ এটি আমার পক্ষে কাজ করে না। আমি আলাফায়ার বৈধতাও যুক্ত করেছি।

let body: NSMutableDictionary? = [
    "name": "\(nameLabel.text!)",
    "phone": "\(phoneLabel.text!))"]

let url = NSURL(string: "http://server.com" as String)
var request = URLRequest(url: url! as URL)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let data = try! JSONSerialization.data(withJSONObject: body!, options: JSONSerialization.WritingOptions.prettyPrinted)

let json = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
if let json = json {
    print(json)
}
request.httpBody = json!.data(using: String.Encoding.utf8.rawValue)
let alamoRequest = Alamofire.request(request as URLRequestConvertible)
alamoRequest.validate(statusCode: 200..<300)
alamoRequest.responseString { response in

    switch response.result {
        case .success:
            ...
        case .failure(let error):
            ...
    }
}

4
এখনও অ্যালামোফায়ার 4.9.1 এবং সুইফ্ট 5.1 এ কাজ করে। অনেক প্রশংসা করেছেন
অ্যাবে

2

আমি পরিবর্তন করতে চাই কিছু পরিবর্তন আছে। আপনি এখন থেকে প্রতিক্রিয়া অবজেক্ট থেকে ত্রুটি, JSON, অ্যাক্সেস করতে পারেন।

        let urlstring = "Add URL String here"
        let parameters: [String: AnyObject] = [
            "IdQuiz" : 102,
            "IdUser" : "iosclient",
            "User" : "iosclient",
            "List": [
                [
                    "IdQuestion" : 5,
                    "IdProposition": 2,
                    "Time" : 32
                ],
                [
                    "IdQuestion" : 4,
                    "IdProposition": 3,
                    "Time" : 9
                ]
            ]
        ]

        Alamofire.request(.POST, urlstring, parameters: parameters, encoding: .JSON).responseJSON { response in
            print(response.request)  // original URL request
            print(response.response) // URL response
            print(response.data)     // server data
            print(response.result)   // result of response serialization

            if let JSON = response.result.value {
                print("JSON: \(JSON)")
            }
            response.result.error
        }

2

পোষ্ট, প্যারামিটার এবং শিরোনামগুলির সাথে অ্যালামোফায়ার ডেটা আনুন

func feedbackApi(){
    DispatchQueue.main.async {
        let headers = [
            "Content-Type": "application/x-www-form-urlencoded",
            "Authorization": "------"
        ]
        let url = URL(string: "---------")
        var parameters = [String:AnyObject]()
        parameters =  [
            "device_id":"-----" as AnyObject,
            "user_id":"----" as AnyObject,
            "cinema_id":"-----" as AnyObject,
            "session_id":"-----" as AnyObject,
        ]
       Alamofire.request(url!, method: .post, parameters: parameters,headers:headers).responseJSON { response in
                switch response.result{
                case.success(let data):
                    self.myResponse = JSON(data)
                    print(self.myResponse as Any)
                    let slide = self.myResponse!["sliders"]
                    print(slide)
                    print(slide.count)
                    for i in 0..<slide.count{
                        let single = Sliders(sliderJson: slide[i])
                        self.slidersArray.append(single)
                    }
                    DispatchQueue.main.async {
                        self.getSliderCollection.reloadData()
                    }
                case .failure(let error):
                    print("dddd",error)
                }

        }
    }

}

1

এখানে আমি কীভাবে এইচটিটিপি পোস্টের অনুরোধটি সুইফটের সাথে তৈরি করেছি যাতে জসন এনকোডিং এবং শিরোলেখগুলির সাথে পরামিতিগুলির প্রয়োজন।

এপিআই ক্লায়েন্ট বি কেসিএপিক্লিয়েন্টকে একটি ভাগ করে নেওয়া উদাহরণ হিসাবে তৈরি করা হয়েছে যাতে সব ধরণের অনুরোধ যেমন POST, GET, PUT, DELETE ইত্যাদি অন্তর্ভুক্ত থাকবে

func postRequest(url:String, params:Parameters?, headers:HTTPHeaders?, completion:@escaping (_ responseData:Result<Any>?, _ error:Error?)->Void){
    Alamofire.request(url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers).responseJSON {
        response in
        guard response.result.isSuccess,
            (response.result.value != nil) else {
                debugPrint("Error while fetching data: \(String(describing: response.result.error))")
                completion(nil,response.result.error)
                return
        }
        completion(response.result,nil)
    }
}

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

func requestAccountOperation(completion: @escaping ( (_ result:Any?, _ error:Error?) -> Void)){
    BKCApiClient.shared.postRequest(url: BKCConstants().bkcUrl, params: self.parametrs(), headers: self.headers()) { (result, error) in
        if(error != nil){
            //Parse and save to DB/Singletons.
        }
        completion(result, error)
    }
}
func parametrs()->Parameters{
    return ["userid”:”xnmtyrdx”,”bcode":"HDF"] as Parameters
}
func headers()->HTTPHeaders{
    return ["Authorization": "Basic bXl1c2VyOm15cGFzcw",
            "Content-Type": "application/json"] as HTTPHeaders
}

আমাদের এই ডেটা দরকার এমন যে কোনও ভিউ কন্ট্রোলারে এপিআই কল করুন

func callToAPIOperation(){
let accOperation: AccountRequestOperation = AccountRequestOperation()
accOperation.requestAccountOperation{(result, error) in

}}

1
func get_Contact_list()
{
    ApiUtillity.sharedInstance.showSVProgressHUD(text: "Loading..")
    let cont_nunber = contact_array as NSArray
    print(cont_nunber)

    let token = UserDefaults.standard.string(forKey: "vAuthToken")!
    let apiToken = "Bearer \(token)"


    let headers = [
        "Vauthtoken": apiToken,
        "content-type": "application/json"
    ]

    let myArray: [Any] = cont_nunber as! [Any]
    let jsonData: Data? = try? JSONSerialization.data(withJSONObject: myArray, options: .prettyPrinted)
    //        var jsonString: String = nil
    var jsonString = String()
    if let aData = jsonData {
        jsonString = String(data: aData, encoding: .utf8)!
    }

    let url1 = "URL"
    var request = URLRequest(url: URL(string: url1)!)
    request.httpMethod = "POST"
    request.allHTTPHeaderFields = headers
    request.httpBody = jsonData as! Data

    //        let session = URLSession.shared

    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {
            print("error=\(String(describing: error))")
            ApiUtillity.sharedInstance.dismissSVProgressHUD()
            return
        }

        print("response = \(String(describing: response))")


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

        let json =  self.convertStringToDictionary(text: responseString!)! as NSDictionary
        print(json)

        let status = json.value(forKey: "status") as! Int

        if status == 200
        {

            let array = (json.value(forKey: "data") as! NSArray).mutableCopy() as! NSMutableArray


        }
        else if status == 401
        {
            ApiUtillity.sharedInstance.dismissSVProgressHUD()

        }
        else
        {
            ApiUtillity.sharedInstance.dismissSVProgressHUD()
        }


    }
    task.resume()
}

func convertStringToDictionary(text: String) -> [String:AnyObject]? {
    if let data = text.data(using: String.Encoding.utf8) {
        do {
            let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:AnyObject]
            return json
        } catch {
            print("Something went wrong")
        }
    }
    return nil
}

1

কেউ যদি মডেল এবং স্টাফ নিয়ে কীভাবে এগিয়ে যেতে চান তা ভাবছেন, নীচে দেখুন

        var itemArr: [Dictionary<String, String>] = []
        for model in models {
              let object = ["param1": model.param1,
                            "param2": model.param2]
              itemArr.append(object as! [String : String])
        }

        let param = ["field1": someValue,
                     "field2": someValue,
                     "field3": itemArr] as [String : Any]

        let url: URLConvertible = "http://------"

        Alamofire.request(url, method: .post, parameters: param, encoding: JSONEncoding.default)
            .responseJSON { response in
                self.isLoading = false
                switch response.result {
                case .success:
                    break
                case .failure:
                    break
                }
        }

1

অ্যালামোফায়ার ~ 5.2 এবং সুইফট 5

আপনি আপনার প্যারামিটার ডেটা গঠন করতে পারেন

সঙ্গে কাজ জাল JSON API

struct Parameter: Encodable {
     let token: String = "xxxxxxxxxx"
     let data: Dictionary = [
        "id": "personNickname",
        "email": "internetEmail",
        "gender": "personGender",
     ]
}

 let parameters = Parameter()

 AF.request("https://app.fakejson.com/q", method: .post, parameters: parameters).responseJSON { response in
            print(response)
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.