2017-02-20 25 views
0

Alamofire 4.3,Swift 3に相当する以下のコードは何ですか?URLSessionからSwamp 3のAlamofire 4.3への移行、エンコードの問題

let baseUrl = "https://hiddenWebsite.com/api/index_load" 
let url = URL(string: baseUrl) 
let authObj = ["owner_id": "361900", "auth_key": "f408634ac1e14c08eebce46c34ab9db2", "device": "2", "version": "2.1.16"] 
let infoObj = ["case": "feeds", "feeds_call_type": "init", "feed_type": "", "load_next_from": "1"] 

let infoJSONData = try! JSONSerialization.data(withJSONObject: infoObj) 
let infoStr = "info" + "=" + String(data: infoJSONData, encoding: String.Encoding.utf8)! 

let authJSONData = try! JSONSerialization.data(withJSONObject: authObj) 
let authStr = "auth" + "=" + String(data: authJSONData, encoding: String.Encoding.utf8)! 

let combinedStr = infoStr + "&" + authStr 
let reqdat = combinedStr.data(using: String.Encoding.utf8) 

var request = URLRequest(url: url!) 
request.httpMethod = "POST" 
request.httpBody = reqdat 
let defaultSession = URLSession.shared 
defaultSession.dataTask(
    with: request, 
    completionHandler: { data, response, error in 
     guard error == nil else { 
      print("Error while fetching data: \(error)") 
      return 
     } 
     guard let data = data, 
      let json = try? JSONSerialization.jsonObject(
       with: data, 
       options: JSONSerialization.ReadingOptions.mutableContainers) 
      else { 
       print("Nil data received") 
       return 
     } 
     print(json) 
}).resume() 

私は現在、AppleのURLSessionからAlamofireに移行していますが、この時点で固執しています。私はこれがencodingParameterと関係があると思います。 これは失敗した試行です。私はURLEncoding.httpbodyでも試しましたが、うまくいきませんでした。

let baseUrl = "https://hiddenWebsite.com/api/index_load" 
    let masterParameter = [ 
     "auth": ["owner_id": "361900", 
       "auth_key": "f408634ac1e14c08eebce46c34ab9db2", 
       "device": "2", 
       "version": "2.1.16"], 
     "info": ["case": "feeds", 
       "feeds_call_type": "init", 
       "feed_type": "", 
       "load_next_from": "1"] 
    ] 
    Alamofire.request(baseUrl, method: .post, parameters: masterParameter, encoding: JSONEncoding.default).responseJSON { (response) in 

     print(response) 
    } 

本のワーキング郵便配達員同等は Postman Screenshot

答えて

0

有効なJSONそれを使用していないエンコーディングのように見えます。したがって、masterParameter辞書を有効なJSON辞書としてエンコードするので、エンコードタイプとしてJSON.defaultを使用することはできません。

代わりに、あなたはあなたの最初の例で行われAlamofire.request(urlRequest) APIを使用してきたように手動でURLRequestを構築する必要があるか、あなたがURLRequestをエンコードし、それにデータを渡し、独自のParameterEncodingを作成することができます。

0

お返事ありがとうございます。cnoon次のコードは、問題を解決:

public enum JSONError: Error { 
    case serializing(String) 
    case encoding 
} 

extension String: ParameterEncoding { 
    public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest { 
     var request = try urlRequest.asURLRequest() 
     request.httpBody = self.data(using: String.Encoding.utf8) 
     return request 
    } 
} 

let encodedStr = try getEncodedString(parameters: masterParameter) 
Alamofire.request(baseUrl, method: .post, parameters: [:], encoding: encodedStr).responseJSON { response in 
     print(response) 
} 

getEncodedString(パラメータとして定義されている:):

func getEncodedString(parameters: Parameters) throws -> String { 

     var encodedStr = "" 
     for (key, value) in parameters { 

      let jsonData: Data 
      do { 
       jsonData = try JSONSerialization.data(withJSONObject: value) 
      } 
      catch(let error) { 
       throw JSONError.serializing(error.localizedDescription) 
      } 
      guard let encodedJsonString = String(data: jsonData, encoding: .utf8) else { 
       throw JSONError.encoding 
      } 
      let keyValueStr = key + "=" + encodedJsonString 
      encodedStr += keyValueStr + "&" 
     } 
     if encodedStr.characters.last == "&" { 
      encodedStr.remove(at: encodedStr.index(before: encodedStr.endIndex)) 
     } 

     return encodedStr 
    } 
関連する問題