신속하게 BODY로 POST 요청을 보내는 방법


97

Alamofire를 사용하여 신속하게 본문에 게시물 요청을하려고합니다.

내 json 본문은 다음과 같습니다.

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

let list다음과 같은 NSDictionnary 로 만들려고합니다 .

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

Alamofire를 사용한 내 요청은 다음과 같습니다.

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


1
귀하의 의견을 보내 주셔서 감사합니다. 그러나 귀하가 제공 한 게시물은 도움이되지 않습니다. 문자열을 본문으로 전달하려는 것이 아니므로 게시물을주의 깊게 읽어 주시기 바랍니다
Stranger B.

@YasserB. JSON을 NSString으로 변환 한 다음 (방법이 있습니다) @Bhavin?
Larme

당신이 예를 제공하는 경우 정말 도움이 될 것 @Larme
B. 낯선

@Larme 나는 해결책 제안 시도했지만 나는 요청 일 나는 아들의 몸에서 목록을 삭제하지 않는 한 같은 문제가
낯선 B.

답변:


97

당신은 가깝습니다. 매개 변수 사전 형식이 올바르지 않습니다. 다음을 시도해야합니다.

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

문제가 해결 되었기를 바랍니다. 그렇지 않은 경우 회신 해 주시면 그에 따라 답변을 조정하겠습니다.


내가 할당 할 수 있기 때문에 어떻게 널 내 JSON의 일부 속성을 설정하는 nilAnyObject?
앰프 Tanawat

3
@JaseemAbbas는 Alamofire의 버전을 확인하십시오. v4.0 이상을 사용하는 경우 아래 내 대답을 확인하십시오.
Gianni Carlo

.urlEncoding 방법의 경우 인코딩 파라미터의 유형을 전송하는 것
프라 모드 Shukla

1
유형의 값을 기대 사전 값 유형을 '내부' 'AnyObject'변환 할 수 없습니다
myatmins

"List"매개 변수의 값에 1000 개의 목록 요소가 있다고 가정하면 어떻게해야합니까?
Nishad Arora

175

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

6
큰! 이 질문에 대한 답변을 변경하십시오! :) 또는 Alamofire 3 및 4 솔루션 모두에 대해 현재 솔루션과 결합하십시오.
Tom van Zummeren

1
동의 함-그것은 JSONEncoding나를 위해 그것을 한 유형을 명확하게하기 위한 명시적인 진술입니다 .
Thomas Verbeek

@Gianni Carlo 나는 귀하의 답변과 동일하게 사용했지만 성공 응답에서 오류가 발생했습니다.
라마 크리슈나

사용중인 API와 관련이있을 수있는 @Ramakrishna. 응답을 구문 분석하기 위해 저는 보통 SwiftyJSON 라이브러리를 사용합니다. 어떤 종류의 오류가 발생하는지 알려주세요
Gianni Carlo

답장을 보내 주셔서 감사합니다. 나는 해결책을 얻었다.
Ramakrishna

34

나는 (아마도 제외되지 같은 다른 답변의 지금까지 수행 그들 중 하나는 JSON 자체의 구조에 대해 다시 연재, 또는 관리하는 단지를 들어, JSON을 역 직렬화 할 필요로하기 때문에, SwiftDeveloper에 의해).

정확한 답은 또 다른 질문에 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)
}

@SwiftDeveloper의 답변이 귀하가 언급 한 '올바른'답변보다 더 낫고 (내 의견으로는) 더 완전하다는 데 동의합니다. 그러나 나는 두 가지 주장을 할 것이다. 하나는, 당신이 언급 한 '정답' toJSONString은 기본 방법이 아닌 결함이 있으므로 기본적으로 구현해야하는 블랙 박스입니다. Two, 당신이 제공하는 대답은 var를 제공합니다.json 은 json 문자열로 시작 를 합니다. 실제로 그런 식으로 변환하고 저장하지 않는 한 아무도 그런 식으로 매개 변수를 가지고 있지 않습니다.
Gianni Carlo

@GianniCarlo 1) toJSONString내 대답 에는 없습니다 . 2) "실제로 아무도 그런 식으로 매개 변수를 가지고 있지 않습니다 "-많은 가정을하고 있습니다. JSON은 요청을 만드는 것과 전혀 관련이 없으며 네트워킹 코드가 아무것도 알지 못하는 앱의 매우 다른 부분에서 올 수 있습니다.
티베트 해안

내 삶을 더 쉽게 만들어 주셔서 감사합니다 !!! 1 Flask Backend와 함께 Alamofire를 사용하고 있습니다. Postman에서는 모든 것이 잘 작동했지만 Alamofire에서는 작동하지 않습니다. HTTP 본문 및 URL 매개 변수 및 설정 방법. 다시 한 번 감사드립니다.
Vineel

8

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)

            }

7

당신이 사용하는 경우 swift4Alamofire 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)
                }
            }

6

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

중대한! 인코딩 사용 : JSONEncoding.default. 나는 몇 시간 동안 머리를 두들겨왔다 ... 기본값은 GET 매개 변수에 대한 인코딩입니다.
Reimond Hill

4

나를 위해 작동하지 않았기 때문에 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
Alamofire 4.9.1 및 Swift 5.1에서 여전히 작동합니다. 대단히 감사합니다
Abe

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

Alamofire는 POST, 매개 변수 및 헤더로 데이터를 가져옵니다.

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 인코딩 및 헤더가있는 매개 변수가 필요한 swift로 Http POST 요청을 생성 한 방법입니다.

POST, GET, PUT, DELETE 등과 같은 모든 유형의 요청을 포함하는 공유 인스턴스로 API 클라이언트 BKCAPIClient를 생성했습니다.

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

특정 요청에 필요한 모든 데이터를 포함하고 완료 블록 내에 구문 분석 논리도 포함하는 Operation 클래스를 생성했습니다.

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 호출

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

0

Alamofire ~ 5.2Swift 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.