как отправлять данные на сервер с помощью alamofire? [Дубликат]

 var svg; // if you have variable declared and not assigned value.
 // then you make a mistake by appending elements to that before creating element    
 svg.appendChild(document.createElement("g"));
 // at some point you assign to svg
 svg = document.createElementNS('http://www.w3.org/2000/svg', "svg")
 // then you put it in DOM
 document.getElementById("myDiv").appendChild(svg)
 // it wont render unless you manually change myDiv DOM with DevTools

// to fix assign before you append
var svg = createElement("svg", [
    ["version", "1.2"],
    ["xmlns:xlink", "http://www.w3.org/1999/xlink"],
    ["aria-labelledby", "title"],
    ["role", "img"],
    ["class", "graph"]
]);
function createElement(tag, attributeArr) {
      // .createElementNS  NS is must! Does not draw without
      let elem = document.createElementNS('http://www.w3.org/2000/svg', tag);             
      attributeArr.forEach(element => elem.setAttribute(element[0], element[1]));
      return elem;
}
// extra: <circle> for example requires attributes to render. Check if missing.
58
задан Stranger B. 13 August 2015 в 09:41
поделиться

9 ответов

Ты близок. Форматирование словаря параметров не выглядит корректным. Вы должны попробовать следующее:

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

Надеюсь, что исправил вашу проблему. Если это не так, ответьте, и я соответствующим образом отрегулирую свой ответ.

70
ответ дан cnoon 16 August 2018 в 01:43
поделиться
  • 1
    Как установить некоторое свойство моего JSON равным null, так как я не могу назначить nil на AnyObject? – Amp Tanawat 18 June 2016 в 11:58
  • 2
    Я получаю дополнительный аргумент в ошибке вызова – Jaseem Abbas 9 November 2016 в 06:07
  • 3
    @JaseemAbbas проверить вашу версию Alamofire, если вы на v4.0 + проверить мой ответ ниже – Gianni Carlo 11 November 2016 в 23:25

Мне пока не нравится какой-либо из других ответов (кроме, возможно, one от SwiftDeveloper), потому что они либо требуют, чтобы вы десериализовали свой JSON, только чтобы он был снова сериализован или заботиться о структуре самого JSON.

Правильный ответ был опубликован afrodev в другом вопросе. Вы должны пойти и укрепить его.

Ниже приводится только моя адаптация с некоторыми незначительными изменениями (в первую очередь явная кодировка UTF-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)
}
20
ответ дан Community 16 August 2018 в 01:43
поделиться
  • 1
    Спасибо за кредиты! – afrodev 24 February 2017 в 18:44
  • 2
    Я согласен с тем, что ответ @ SwiftDeveloper лучше и (на мой взгляд) более полный, чем «правильный», который вы упомянули. Но я бы сказал два момента. Во-первых, что «правильный ответ», который вы упоминаете, имеет недостаток, который toJSONString не является родным методом, поэтому это в основном черный ящик, который вы должны реализовать. Во-вторых, ответ, который вы даете, предоставляет var json, который начинается как json-строка, реалистично никто не имеет параметров таким образом, если вы не конвертируете и не сохраняете их локально таким образом. – Gianni Carlo 6 March 2017 в 23:49
  • 3
    @GianniCarlo 1) в моем ответе нет toJSONString, 2) «реалистично никто не имеет параметров таким образом» - это делает много предположений; JSON может поступать из совершенно разных частей приложения, не связанного с выполнением запроса вообще, и о том, что сетевой код ничего не знает. – Sea Coast of Tibet 7 March 2017 в 09:52

Я немного отредактировал ответ SwiftDeveloper , потому что он не работал для меня. Я также добавил проверку 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
ответ дан effeKtSVK 16 August 2018 в 01:43
поделиться

Если вы используете Alamofire 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)
    }
117
ответ дан Gianni Carlo 16 August 2018 в 01:43
поделиться
  • 1
    Большой! Измените принятый ответ на этот, пожалуйста! :) или сочетаться с текущим для решений Alamofire 3 и 4. – Tom van Zummeren 26 December 2016 в 13:08
  • 2
    Согласовано - это явное указание на JSONEncoding, чтобы устранить тот тип, который сделал это для меня. – Thomas Verbeek 17 January 2017 в 21:08
  • 3
    @Gianni Carlo Я использовал то же, что и ваш ответ, но в своем ответе на успех я получаю ошибки. – Ramakrishna 24 February 2017 в 14:14
  • 4
    @Ramakrishna, которые могут быть связаны с API, который вы потребляете. Чтобы разобрать ответ, я обычно использую библиотеку SwiftyJSON, дайте мне знать, какие ошибки вы получаете – Gianni Carlo 24 February 2017 в 14:38
  • 5
    Спасибо за ваш ответ. Я получил решение. – Ramakrishna 24 February 2017 в 14:49

{

    if Reachability.isConnectedToNetwork() == true
    {

        let hud = MBProgressHUD.showAdded(to: self.view, animated: true)
        hud.mode = .indeterminate
        hud.label.text = "Loading"
        hud.animationType = .fade

        var request = URLRequest(url: URL(string:  "http://skandal24.serv.si/ws/webservice/forgot_password")!)
        request.httpMethod = "POST"

        let postString =  String(format: "email=%@&lang=%@", arguments: [txt_emailVirify.text!, language!])
        print(postString)

        emailString = txt_emailVirify.text!
        request.httpBody = postString.data(using: .utf8)
        request.addValue("delta141forceSEAL8PARA9MARCOSBRAHMOS", forHTTPHeaderField: "Authorization")
        request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
        request.addValue("application/json", forHTTPHeaderField: "Accept")



        Alamofire.request(request).responseJSON { response in
            //Your code
            print(response.value)

            if response.response?.statusCode == 200
            {
                let dictionary = (response.value) as! AnyObject
                let status = dictionary.value(forKey: "status") as! String
                let sts = Int(status)
                DispatchQueue.main.async()
                    {
                        if sts == 200
                        {


                        }
                  }

            }
            else
            {


            }


        }


    }


    else
    {

    }



}
-2
ответ дан jignesh kasundra 16 August 2018 в 01:43
поделиться

Есть несколько изменений, которые я хотел бы уведомить. С этого момента вы можете получить доступ к запросу, 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
        }
1
ответ дан KiranJasvanee 16 August 2018 в 01:43
поделиться

Если вы используете 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: , 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)
                }
            }
1
ответ дан Mohammed Ali Khaled 16 August 2018 в 01:43
поделиться

Xcode 8.X, Swift 3.X

Простое использование;

    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)

            }
5
ответ дан SwiftDeveloper 16 August 2018 в 01:43
поделиться

Вот как я создал запрос Http POST с быстрым параметром с параметрами Json и заголовками.

Создал клиент API BKCAPIClient как общий экземпляр, который будет включать в себя все типы запросов, таких как 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
}

API вызовов View Controller, где нам нужны эти данные

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

}}
1
ответ дан vinodonkar 16 August 2018 в 01:43
поделиться
  • 1
    Попробуйте переформатировать свое решение, чтобы было легче читать. – Grant Miller 15 June 2018 в 02:50
Другие вопросы по тегам:

Похожие вопросы: