Cara mengirim permintaan POST dengan BODY dengan cepat

97

Saya mencoba membuat permintaan posting dengan tubuh dengan cepat menggunakan Alamofire.

tubuh json saya terlihat seperti:

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

Saya mencoba membuat let listdengan NSDictionnary yang terlihat seperti:

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

dan permintaan saya menggunakan Alamofire terlihat seperti:

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

Permintaan mengalami kesalahan dan saya yakin masalahnya ada pada daftar Kamus, karena jika saya membuat permintaan tanpa daftar, itu berfungsi dengan baik, jadi ada ide?


Saya telah mencoba solusi yang disarankan tetapi saya menghadapi masalah yang sama:

 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)
    }
Orang asing B.
sumber
1
Terima kasih atas komentar Anda, tetapi posting yang Anda berikan tidak membantu, dan saya tidak mencoba memasukkan string sebagai body, jadi bisakah Anda membaca posting dengan cermat
Stranger B.
@Yasser. Ubah JSON Anda menjadi NSString (ada metode untuk itu), lalu gunakan tautan @Bhavin?
Larme
@Larme akan sangat membantu jika Anda memberikan contoh
Stranger B.
@Laut Saya telah mencoba solusi yang disarankan tetapi saya memiliki masalah yang sama, permintaan tidak berfungsi kecuali saya menghapus daftar dari tubuh putra
Orang Asing B.

Jawaban:

97

Anda sudah dekat. Format kamus parameter tampaknya salah. Anda harus mencoba yang berikut ini:

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

Semoga masalah Anda teratasi. Jika tidak, harap balas dan saya akan menyesuaikan jawaban saya.

cnoon
sumber
Bagaimana cara mengatur beberapa properti dari JSON saya untuk null, karena aku tidak dapat menetapkan nilke AnyObject?
Amp Tanawat
3
@JaseemAbbas periksa versi Alamofire Anda, jika Anda menggunakan v4.0 + lihat jawaban saya di bawah
Gianni Carlo
cara mengirim parameter jenis ini jika pengkodeannya adalah .urlEncoding
Pramod Shukla
1
Tidak dapat mengonversi nilai jenis 'Int' ke jenis nilai kamus yang diharapkan 'AnyObject'
myatmins
bagaimana melakukannya jika katakanlah nilai parameter "Daftar" memiliki seperti 1000 elemen daftar?
Nishad Arora
175

Jika Anda menggunakan Alamofire v4.0 + maka jawaban yang diterima akan terlihat seperti ini:

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)
    }
Gianni Carlo
sumber
6
Bagus! Tolong ubah jawaban yang diterima untuk yang ini! :) atau gabungkan dengan yang saat ini untuk solusi Alamofire 3 dan 4.
Tom van Zummeren
1
Setuju - itu pernyataan eksplisit JSONEncodinguntuk menghilangkan keraguan jenis yang melakukannya untuk saya.
Thomas Verbeek
@Gianni Carlo Saya menggunakan jawaban yang sama tetapi dalam tanggapan sukses saya, saya menerima kesalahan.
Ramakrishna
@Ramakrishna yang mungkin terkait dengan API yang Anda konsumsi. Untuk mengurai respons, saya biasanya menggunakan perpustakaan SwiftyJSON, beri tahu saya jenis kesalahan yang Anda terima
Gianni Carlo
Terima kasih untuk balasan Anda. Saya mendapatkan solusinya.
Ramakrishna
35

Aku tidak suka salah satu jawaban yang lain sejauh (kecuali mungkin satu oleh SwiftDeveloper), karena mereka juga mengharuskan Anda untuk deserialize JSON Anda, hanya untuk itu untuk menjadi serial lagi, atau peduli tentang struktur JSON itu sendiri.

Jawaban yang benar telah diposting oleh afrodev di pertanyaan lain. Anda harus pergi dan memilihnya.

Di bawah ini hanya adaptasi saya, dengan beberapa perubahan kecil (terutama rangkaian karakter UTF-8 eksplisit).

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)
}
Pantai Laut Tibet
sumber
Saya setuju bahwa jawaban @ SwiftDeveloper lebih baik dan (menurut saya) lebih lengkap daripada jawaban 'benar' yang Anda sebutkan. Tetapi saya akan memperdebatkan dua hal. Pertama, bahwa 'jawaban yang benar' yang Anda sebutkan memiliki kekurangan yang toJSONStringbukan merupakan metode asli, jadi pada dasarnya ini adalah kotak hitam yang harus Anda terapkan. Kedua, jawaban yang Anda berikan, menyediakan var jsonyang dimulai sebagai string json, secara realistis tidak ada yang memiliki parameter dengan cara itu, kecuali jika Anda mengonversi dan menyimpannya secara lokal dengan cara itu.
Gianni Carlo
@GianniCarlo 1) toJSONStringjawaban saya tidak ada , 2) "secara realistis tidak ada yang memiliki parameter seperti itu" - itu membuat banyak asumsi; JSON bisa berasal dari bagian aplikasi yang sangat berbeda, tidak terkait dengan membuat permintaan sama sekali, dan yang kode jaringannya tidak tahu apa-apa.
Pantai Laut Tibet
Terima kasih telah membuat hidup saya lebih mudah !!! 1 Saya menggunakan Alamofire dengan Flask Backend. Dari Postman semuanya bekerja dengan baik, tetapi dari Alamofire tidak berhasil. Parameter badan HTTP dan URL serta cara menyetelnya. Terima kasih lagi.
Vineel
8

Xcode 8.X, Swift 3.X

Mudah Digunakan;

    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)

            }
SwiftDeveloper
sumber
7

Jika Anda menggunakan swift4dan Alamofire v4.0kemudian kode yang diterima akan terlihat seperti ini:

            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)
                }
            }
Mohammed Ali Khaled
sumber
6

Jawaban yang diterima di Xcode 11 - Swift 5 - Alamofire 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)
    }
}
Hari R Krishna
sumber
PENTING! Gunakan encoding: JSONEncoding.default. Saya telah membenturkan kepala saya selama berjam-jam ... defaultnya adalah pengkodean untuk GET params.
Reimond Hill
4

Saya sedikit mengedit jawaban SwiftDeveloper , karena tidak berhasil untuk saya. Saya menambahkan validasi Alamofire juga.

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):
            ...
    }
}
effeKtSVK
sumber
1
Masih berfungsi di Alamofire 4.9.1 dan Swift 5.1. Sangat dihargai
Abe
2

Ada beberapa perubahan yang ingin saya beri tahu. Anda dapat mengakses permintaan, JSON, kesalahan dari objek respons mulai sekarang.

        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
        }
Kiran Jasvanee
sumber
2

Alamofire Fetch data dengan POST, Parameter dan Headers

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

        }
    }

}
Tony Franzis
sumber
1

Berikut adalah cara saya membuat permintaan Http POST dengan swift yang membutuhkan parameter dengan pengkodean Json dan dengan header.

Membuat Klien API BKCAPIClient sebagai instance bersama yang akan menyertakan semua jenis permintaan seperti POST, GET, PUT, DELETE dll.

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

Kelas Operasi yang dibuat yang berisi semua data yang diperlukan untuk permintaan tertentu dan juga berisi logika parsing di dalam blok penyelesaian.

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
}

Panggil API Di Pengontrol Tampilan mana pun di mana kita membutuhkan data ini

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

}}
vinodonkar.dll
sumber
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
}
Jignesh ZestBrains
sumber
1

Jika ada yang bertanya-tanya bagaimana cara melanjutkan model dan barang, lihat di bawah

        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
                }
        }
Heshan Sandeepa
sumber
0

Alamofire ~ 5.2 dan Swift 5

Anda dapat menyusun data parameter Anda

Bekerja dengan api json palsu

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)
        }
Trần Hữu Hiền
sumber