Cách gửi yêu cầu ĐĂNG với BODY nhanh chóng


97

Tôi đang cố gắng thực hiện một yêu cầu đăng bài nhanh chóng bằng cách sử dụng Alamofire.

cơ thể json của tôi trông giống như:

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

Tôi đang cố tạo let listvới NSDictionnary trông giống như sau:

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

và yêu cầu của tôi khi sử dụng Alamofire trông giống như sau:

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

Yêu cầu có lỗi và tôi tin rằng vấn đề là với danh sách Từ điển, vì nếu tôi đưa ra yêu cầu mà không có danh sách thì nó hoạt động tốt, vậy có ý kiến ​​gì không?


Tôi đã thử giải pháp được đề xuất nhưng tôi đang gặp phải vấn đề tương tự:

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


1
Cám ơn nhận xét của bạn, nhưng bài viết của bạn cung cấp không thực hiện giúp đỡ, và tôi không cố gắng để vượt qua một chuỗi như cơ thể, vì vậy bạn có thể vui lòng đọc bài một cách cẩn thận
Stranger B.

@YasserB. Chuyển đổi JSON của bạn thành NSString (có phương pháp cho điều đó) và sau đó sử dụng liên kết của @Bhavin?
Larme

@Larme nó sẽ thực sự hữu ích nếu bạn cung cấp một ví dụ
Stranger B.

@Larme Tôi đã thử các giải pháp đề nghị nhưng tôi có cùng một vấn đề yêu cầu không làm việc trừ khi tôi xóa danh sách ra khỏi cơ thể con trai
Stranger B.

Câu trả lời:


97

Bạn đang ở gần. Định dạng từ điển tham số có vẻ không chính xác. Bạn nên thử những cách sau:

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

Hy vọng rằng điều đó đã khắc phục được sự cố của bạn. Nếu không, vui lòng trả lời và tôi sẽ điều chỉnh câu trả lời của mình cho phù hợp.


Làm cách nào để đặt một số thuộc tính JSON của tôi thành null, vì tôi không thể gán nilcho AnyObject?
Amp Tanawat

3
@JaseemAbbas kiểm tra phiên bản của Alamofire, nếu bạn đang ở trên v4.0 + kiểm tra câu trả lời của tôi dưới đây
Gianni Carlo

làm thế nào để gửi loại tham số trong trường hợp mã hóa là .urlEncoding
Pramod Shukla

1
Không thể chuyển đổi giá trị của loại 'Int' thành loại giá trị từ điển mong đợi 'AnyObject'
myatmins

làm thế nào để làm nếu giả sử giá trị của tham số "Danh sách" có 1000 phần tử danh sách?
Nishad Arora

175

Nếu bạn đang sử dụng Alamofire v4.0 + thì câu trả lời được chấp nhận sẽ giống như sau:

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
Tuyệt quá! Vui lòng thay đổi câu trả lời được chấp nhận thành câu trả lời này! :) hoặc kết hợp với giải pháp hiện tại cho cả giải pháp Alamofire 3 và 4.
Tom van Zummeren

1
Đồng ý - đó là tuyên bố rõ ràng JSONEncodingđể phân biệt loại đã làm điều đó cho tôi.
Thomas Verbeek

@Gianni Carlo Tôi đã sử dụng giống như câu trả lời của bạn nhưng trong câu trả lời thành công, tôi nhận được lỗi.
Ramakrishna

@Ramakrishna có thể liên quan đến API bạn đang sử dụng. Để phân tích phản ứng tôi thường sử dụng thư viện SwiftyJSON, cho tôi biết những gì loại lỗi bạn nhận được
Gianni Carlo

Cảm ơn vì đã trả lời. Tôi đã có giải pháp.
Ramakrishna

34

Tôi không giống như bất kỳ câu trả lời nào khác cho đến nay (ngoại trừ có lẽ là một bằng SwiftDeveloper), vì họ hoặc yêu cầu bạn phải deserialize JSON của bạn, chỉ cho nó được tuần tự một lần nữa, hoặc chăm sóc về cấu trúc của JSON chính nó.

Câu trả lời đúng đã được đăng bởi afrodev trong một câu hỏi khác. Bạn nên đi và ủng hộ nó.

Dưới đây chỉ là điều chỉnh của tôi, với một số thay đổi nhỏ (chủ yếu là bộ ký tự UTF-8 rõ ràng).

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

Tôi đồng ý rằng câu trả lời của @ SwiftDeveloper tốt hơn và (theo ý kiến ​​của tôi) đầy đủ hơn câu trả lời 'đúng' mà bạn đề cập. Nhưng tôi sẽ tranh luận hai điểm. Thứ nhất, 'câu trả lời đúng' mà bạn đề cập có lỗ hổng toJSONStringkhông phải là phương pháp gốc, vì vậy về cơ bản nó là một hộp đen mà bạn phải thực hiện. Thứ hai, câu trả lời bạn đưa ra, cung cấp một var jsonbắt đầu như một chuỗi json, thực tế không ai có các tham số theo cách đó, trừ khi bạn đang chuyển đổi và lưu trữ chúng cục bộ theo cách đó.
Gianni Carlo

@GianniCarlo 1) không có toJSONStringcâu trả lời của tôi, 2) "thực tế không ai có các thông số theo cách đó" - đó là đưa ra rất nhiều giả định; JSON có thể đến từ các phần khá khác nhau của ứng dụng, hoàn toàn không liên quan đến việc đưa ra yêu cầu và mã mạng không biết gì.
Bờ biển Tây Tạng

Cảm ơn vì đã làm cho cuộc sống của tôi dễ dàng hơn !!! 1 Tôi đang sử dụng Alamofire với Flask Backend. Từ Postman, mọi thứ hoạt động tốt, nhưng từ Alamofire, nó không hoạt động. Nội dung HTTP và các tham số URL và cách đặt chúng. Cảm ơn một lần nữa.
Vineel

8

Xcode 8.X, Swift 3.X

Sử dụng dễ dàng;

    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)

            }

7

Nếu bạn đang sử dụng swift4Alamofire v4.0mã được chấp nhận sẽ trông như thế này:

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

5

Câu trả lời được chấp nhận trong 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)
    }
}

4

Tôi đã chỉnh sửa một chút câu trả lời của SwiftDeveloper , vì nó không phù hợp với tôi. Tôi cũng đã thêm xác thực Alamofire.

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

1
Vẫn hoạt động trong Alamofire 4.9.1 và Swift 5.1. Được đánh giá cao
Abe

2

Có một số thay đổi tôi muốn thông báo. Bạn có thể truy cập yêu cầu, JSON, lỗi từ đối tượng phản hồi từ bây giờ.

        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

Alamofire Tìm nạp dữ liệu với POST, Tham số và Tiêu đề

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

Đây là cách tôi tạo yêu cầu Http POST với nhanh chóng cần tham số với mã hóa Json và với tiêu đề.

Đã tạo Ứng dụng khách API BKCAPIClient như một phiên bản được chia sẻ sẽ bao gồm tất cả các loại yêu cầu như POST, GET, PUT, DELETE, v.v.

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

Đã tạo lớp Hoạt động chứa tất cả dữ liệu cần thiết cho yêu cầu cụ thể và cũng chứa logic phân tích cú pháp bên trong khối hoàn thành.

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
}

Gọi API Trong bất kỳ Bộ điều khiển Chế độ xem nào mà chúng tôi cần dữ liệu này

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

Nếu có ai thắc mắc về cách xử lý các mô hình và nội dung, hãy xem bên dưới

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

0

Alamofire ~ 5.2Swift 5

Bạn có thể cấu trúc dữ liệu tham số của mình

Làm việc với json api giả

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)
        }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.