BODY ile hızlı bir şekilde POST isteği nasıl gönderilir


101

Alamofire'ı kullanarak hızlı bir şekilde bir cesetle gönderi talebinde bulunmaya çalışıyorum.

json vücudum şöyle görünüyor:

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

let listNSDictionnary ile şuna benzeyen yapmaya çalışıyorum :

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

ve Alamofire kullanma isteğim şöyle görünüyor:

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

İstekte bir hata var ve sorunun Sözlük listesinde olduğuna inanıyorum, çünkü liste olmadan bir istekte bulunursam iyi çalışıyor, yani herhangi bir fikir?


Önerilen çözümü denedim ama aynı sorunla karşı karşıyayım:

 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
Yorumunuz için teşekkürler, ancak sağladığınız gönderi yardımcı olmuyor ve gövde olarak bir dizeyi iletmeye çalışmıyorum, bu yüzden lütfen
Yabancı B.

@YasserB. JSON'nuzu bir NSString'e dönüştürün (bunun için bir yöntem var) ve ardından @Bhavin bağlantısını kullanın.
Larme

@Larme, bir örnek verirseniz gerçekten yardımcı olur
Stranger B.

@Larme Ben çözüm önerdi denedi ama istek işi ben oğul vücuttan listesini silmez sürece aynı sorun var
Stranger B.

Yanıtlar:


100

Yakınsın. Parametreler sözlüğü biçimlendirmesi doğru görünmüyor. Aşağıdakileri denemelisiniz:

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

Umarım bu sorununuzu çözmüştür. Olmazsa, lütfen cevap verin, cevabımı buna göre ayarlayacağım.


Ben atanamıyor çünkü nasıl, boş benim JSON bazı özelliğini ayarlarım niliçin AnyObject?
Amp Tanawat

3
@JaseemAbbas, Alamofire sürümünüzü kontrol edin, v4.0 kullanıyorsanız aşağıdaki cevabımı kontrol edin
Gianni Carlo

kodlamanın .urlEncoding olması durumunda bu tür bir parametre nasıl gönderilir
Pramod Shukla

1
'Int' türünün değeri, beklenen sözlük değeri türü 'AnyObject'e dönüştürülemiyor
myatmins

"Liste" parametresinin değeri 1000'e yakın liste öğesi içeriyorsa nasıl yapılır?
nishad Arora

177

Alamofire v4.0 + kullanıyorsanız, kabul edilen cevap şöyle görünecektir:

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
Harika! Kabul edilen cevabı buna değiştirin lütfen! :) veya Alamofire 3 ve 4 çözümleri için mevcut olanla birleştirin.
Tom van Zummeren

1
Kabul edildi - JSONEncodingbu, benim için bunu yapan türün belirsizliğini ortadan kaldırmak için açık bir ifade .
Thomas Verbeek

@Gianni Carlo Cevabınızın aynısını kullandım ama başarı cevabımda hata alıyorum
Ramakrishna

@Ramakrishna, tükettiğiniz API ile ilgili olabilir. Yanıtı ayrıştırmak için genellikle SwiftyJSON kitaplığını kullanıyorum, ne tür hatalar aldığınızı bana bildirin
Gianni Carlo

Cevabın için teşekkürler. Çözümü aldım.
Ramakrishna

37

Ben (belki haricinde değil gibi diğer cevapların hiçbirinde bugüne kadar bunu biri onlar da o JSON kendisinin yapısı hakkında tekrar tefrika veya bakım edilecek yalnızca, sizin JSON serisini gerektirir, çünkü SwiftDeveloper yoluyla).

Doğru cevap başka bir soruda afrodev tarafından gönderilmiştir. Gidip oylamalısın.

Aşağıda bazı küçük değişikliklerle (özellikle açık UTF-8 karakter seti) benim uyarlamam var.

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

@ SwiftDeveloper'in cevabının daha iyi ve (bana göre) bahsettiğiniz 'doğru' cevaptan daha eksiksiz olduğunu kabul ediyorum. Ama iki noktayı tartışacağım. Birincisi, bahsettiğiniz 'doğru cevabın' toJSONStringyerel bir yöntem olmayan bir kusuru var , yani temelde uygulamanız gereken bir kara kutu. İkincisi, verdiğiniz cevap, jsonjson dizesi olarak başlayan bir değişken sağlar , gerçekçi olarak, siz onları yerel olarak bu şekilde dönüştürüp depolamadığınız sürece, hiç kimse bu şekilde parametrelere sahip değildir.
Gianni Carlo

@GianniCarlo 1) cevabımda hayır yok toJSONString, 2) "gerçekçi olarak hiç kimse bu şekilde parametrelere sahip değil" - bu çok fazla varsayımda bulunuyor; JSON, uygulamanın oldukça farklı bölümlerinden gelebilir, istekte bulunma ile hiç ilgili olmayabilir ve ağ kodu hiçbir şey bilmiyor olabilir.
Tibet Deniz Kıyısı

Hayatımı kolaylaştırdığınız için teşekkürler !!! 1 Alamofire'ı Flask Arka Ucu ile kullanıyorum. Postacı'dan her şey yolunda gitti, ancak Alamofire'da işe yaramıyor. HTTP gövdesi ve URL parametreleri ve bunların nasıl ayarlanacağı. Tekrar teşekkürler.
Vineel

8

Xcode 8.X, Swift 3.X

Kolay Kullanım;

    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

Xcode 11 - Swift 5 - Alamofire 5.0'da kabul edilen cevap

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

ÖNEMLİ! Şu kodlamayı kullanın: JSONEncoding.default. Saatlerdir kafamı düzüyorum ... varsayılan GET parametreleri için kodlamadır.
Reimond Tepesi

8

Kullanıyorsanız swift4ve Alamofire v4.0kabul edilen kod şöyle görünecektir:

            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

SwiftDeveloper'ın cevabını biraz düzenledim çünkü benim için çalışmıyordu. Alamofire doğrulamasını da ekledim.

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
Hala Alamofire 4.9.1 ve Swift 5.1'de çalışıyor. Çok takdir
Abe

2

Bildirmek istediğim birkaç değişiklik var. Bundan sonra istek, JSON, hataya yanıt nesnesinden erişebilirsiniz.

        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 POST, Parametre ve Başlıklar ile verileri al

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

Json kodlaması ve başlıkları ile parametrelere ihtiyaç duyan swift ile Http POST isteğini nasıl oluşturdum.

API İstemcisi BKCAPIClient, POST, GET, PUT, DELETE vb. Gibi tüm istek türlerini içeren paylaşılan bir örnek olarak oluşturuldu.

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

Belirli bir istek için gereken tüm verileri içeren ve ayrıca tamamlama bloğunun içinde ayrıştırma mantığını içeren Oluşturulmuş İşlem sınıfı.

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
}

Bu verilere ihtiyaç duyduğumuz herhangi bir View Controller'da API Çağırma

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

Modellere ve eşyalara nasıl devam edileceğini merak eden varsa, aşağıya bakın

        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

Alamofire ~ 5.2 ve Swift 5

Parametre verilerinizi yapılandırabilirsiniz

Sahte json api ile çalışın

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)
        }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.