【问题标题】:How to call post service with parameters swift 3.0 Alamofire 4.0?如何使用参数 swift 3.0 Alamofire 4.0 调用邮政服务?
【发布时间】:2016-12-01 06:10:27
【问题描述】:

我有参数在

var Param : [String:String] = [:]

我正在使用

Alamofire.upload(
        multipartFormData: { multipartFormData in

但作为回应它说invalid service 他们的参数编码是否出错了?

【问题讨论】:

  • 您能否发送更多代码的详细信息?
  • 您需要使用 URLEncoding(destination: .queryString) 对参数进行编码
  • Alamofire.upload( multipartFormData: { multipartFormData in for (key, value) in Param { multipartFormData.append(((value).data(using: .utf8))!, withName: key) }
  • 它说我“服务无效”,但目标 c 工作成功中的服务相同
  • 分享更多代码。还要检查您的网址。如果里面有特殊字符,那么也需要编码。

标签: ios swift3 alamofire


【解决方案1】:

multipartFormData 用于在服务器上上传图片。因此,如果您想上传图像数据,请尝试使用以下代码。

let payload: [String: AnyObject] = [
"key1": "val1" as AnyObject,
"key2": true as AnyObject,
"key3" : [1,2,3,4] as AnyObject
]

let requestString = "http://www.url.com/api/action"

Alamofire.upload(multipartFormData: { (multipartFormData) in
    multipartFormData.append(UIImageJPEGRepresentation(self.photoImageView.image!, 0.5)!, withName: "photo_path", fileName: "swift_file.jpeg", mimeType: "image/jpeg")
    for (key, value) in payload {
        multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
    }
    }, to: requestString, method: .post , headers:nil, encodingCompletion: { (result) in
    switch result {
    case .success(let upload, _, _):

        upload.uploadProgress(closure: { (progress) in
            print(progress.fractionCompleted * 100)
        })

        upload.responseJSON(completionHandler: { (response) in
        })
    case .failure(let error):
        print(error)

    }
})

如果您想调用 post 请求,请尝试使用以下代码:

 let urlString = "https://httpbin.org/get"

Alamofire.request(urlString, method: .post, parameters: ["foo": "bar"],encoding: JSONEncoding.default, headers: nil).responseJSON {  
response in
  switch response.result {
                case .success:
                    print(response)

                    break
                case .failure(let error):

                    print(error)
                }
}

【讨论】:

    【解决方案2】:

    对于 swift 3,使用以下代码。它在我所有的项目中都非常有效..

    //Parameters
    
    let paramDic : NSMutableDictionary = [
                "key1" : "value1",
                "key2" : "value2",
            ]
    
    let urlString = "www.mywebsite.net/api/"
    let url : URL = URL.init(string: urlString)!
    var request = URLRequest(url: url)
    
    //Setting HTTP method GET/POST/PUT
    request.httpMethod = "POST"
    
    //Setting header
    
    request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
    request.setValue("application/json", forHTTPHeaderField: "Accept")
    
    //Setting parameters
    
    request.httpBody = try! JSONSerialization.data(withJSONObject: paramDic!, options: [])
    
    
    
    if paramDic != nil {
                request.httpBody = try! JSONSerialization.data(withJSONObject: paramDic!, options: [])
            }
    
    alamoFireManager!.request(request as URLRequestConvertible).responseJSON {
                response in
                switch response.result {
                case .failure(let error):
                    print("\(urlString) failure response -> \n NSHTTPURLResponse ->\(response.response) \n \(error)")
                case .success :
                    print("\(urlString) success response -> \n NSHTTPURLResponse ->\(response.response) \n Data -> \(response.result.value as? NSDictionary)")
                }
            }
    

    【讨论】:

      【解决方案3】:

      第一个答案是简单的 post API。如果要发布多部分数据,请使用以下方法..

       /**
           Call this to create a request with any HTTP method
      
           - parameter httpMethodType: HTTP method type post,get etc
           - parameter headers:        HTTP header key-value pair (no need to Content-Type,Accept)
           - parameter serviceName:    name of service which need to call
           - parameter paramDic:       parameters in key-value pair
           - parameter files:          array of NSData objects for file content
           - parameter success:        success callback handler
           - parameter failure:        failure callback handler
           */
          func uploadFileRequestWithParameters(_ paramDic : NSMutableDictionary?, files: NSMutableArray?, headers : NSMutableDictionary?, serviceName : NSString, success: @escaping (( _ response : HTTPURLResponse?, _ data : NSDictionary?) -> Void), failure: @escaping ((_ error : Error? ) -> Void)) {
      
              let urlString = BASE_URL + (serviceName as String)
              let url : URL = URL.init(string: urlString)!
              var headerDic = [String : String]()
              headerDic["Content-Type"] = "multipart/form-data"
      
              if headers != nil {
                  let allHeaders : NSArray = headers!.allKeys as NSArray
                  for key in allHeaders {
                      headerDic[(key as? String)!] = (headers!.object(forKey: key)! as? String)
                  }
              }
              print("Full HTTP URL -> \(urlString)")
              print("HTTP Request Method -> POST")
              print("Full HTTP Headers -> \(headerDic)")
              print("Full HTTP Parameters -> \(paramDic)")
              print("Files Array -> \(files)")
      
              // Begin upload
      
              alamoFireManager?.upload(multipartFormData: { (multipartFormData) in
      
                  // import image to request
                  for (file)  in files! {
                      var mimeTypeStr = ""
                      let fileDic : NSDictionary = file as! NSDictionary
                      if (fileDic.object(forKey: "fileType") as? String == "image" ) {
                          mimeTypeStr = "image/png";
                      }
                      else if (fileDic.object(forKey: "fileType") as? String == "video" ) {
                          mimeTypeStr = "video/mp4";
                      }
                      else if (fileDic.object(forKey: "fileType") as? String == "gif" ) {
                          mimeTypeStr = "image/gif";
                      }
                      multipartFormData.append(fileDic.object(forKey: "fileData") as! Data, withName: fileDic.object(forKey: "fileKey") as! String, fileName: fileDic.object(forKey: "fileName") as! String, mimeType: mimeTypeStr)
                  }
      
                  // import parameters
                  for (key, value) in paramDic! {
                      multipartFormData.append((value as! String).data(using: String.Encoding.utf8)!, withName: key as! String)
                  }
              },
              usingThreshold: SessionManager.multipartFormDataEncodingMemoryThreshold, to: url, method: .post, headers: headerDic as [String : String], encodingCompletion: {
                          encodingResult in
      
                  switch encodingResult {
                  case .success(let upload, _, _):
                      upload.responseJSON(completionHandler: { response in
                          debugPrint(response)
                          print(response.result.value as? NSDictionary)
                      })
      
                  case .failure(let error):
                      print(error)
                  }
              })
          }
      

      像这样从你的类中调用上述方法。

       let image : UIImage = #imageLiteral(resourceName: "splash")
              let imgData : Data = UIImagePNGRepresentation(image)!
              // let fileArray : NSArray = NSArray.init(objects: imgData)
      
              let parameters : NSMutableDictionary = [
                  "name" : "Krishna",
              ]
              //Array to store file data
              let filesArray : NSMutableArray = []
              //fileType = image/video/gif
              //fileKey = api parameter key to receive file
              //Dictionary to hold the individual file data
              let file1 : NSMutableDictionary = [
                  "fileData" : imgData,
                  "fileName" : "profileImage.png",
                  "fileType" : "image",
                  "fileKey" : "userProfileImg"
              ]
              let file2 : NSMutableDictionary = [
                  "fileData" : imgData,
                  "fileName" : "video.mp4",
                  "fileType" : "video",
                  "fileKey" : "myVideoKey"
              ]
              let file3 : NSMutableDictionary = [
                  "fileData" : imgData,
                  "fileName" : "image.gif",
                  "fileType" : "gif",
                  "fileKey" : "myGIFKey"
              ]
              //Adding all file data dictionaries to array
              filesArray.add(file1)
              filesArray.add(file2)
              filesArray.add(file3)
      
              let header : NSMutableDictionary  = [
              "version": "1.0",
              "os": "iOS",
              "token" : HEADER_TOKEN
          ]
      
             uploadFileRequestWithParameters(paraDic, files: files , headers: header, serviceName: UPDATE_PROFILE_API as NSString, success: { (response, data) in
               } , failure: { (error) in
      
          })
      

      【讨论】:

        猜你喜欢
        • 2017-06-26
        • 2017-01-22
        • 2017-01-22
        • 1970-01-01
        • 1970-01-01
        • 2017-01-28
        • 1970-01-01
        • 2017-02-09
        相关资源
        最近更新 更多