2017-12-06 15 views
0

シンプルなputリクエストがあり、サーバにデータを送信するのにAlamofireのParametersタイプを使用しています。私はcodableを使用したいと思います。コード化可能な構造体をパラメータに変換する方法、またはJSONオブジェクトをパラメータとして使用するAlamofire要求を再構成する方法はありますか? Alamofireを使用してポストリクエストとプットリクエストを送信する最も効率的な方法は何ですか?AlamofireとCodableをputリクエストに使用する

ここは私がアラモファイアで今やっていることです。

func addProduct(product:MainProduct, completionHandler:@escaping ((JSON?, Error?)->Void)) { 

    let url = "INSERT_URL" 

    let headers: HTTPHeaders = [ 
     "Content-Type": "application/json" 
    ] 

    var parameters:Parameters = [:] 
    parameters["orderId"] = product.orderId 
    parameters["orderSize"] = product.orderSize 
    parameters["theOrderStatus"] = product.orderStatus 
    let purchDate = Int((product.purchaseDate.timeIntervalSince1970)*1000) 
    parameters["purchaseDate"] = purchDate 
    parameters["archived"] = false 

    Alamofire.request(url, method:.put, parameters: parameters, encoding: JSONEncoding.default, headers:headers).responseJSON {response in 
     switch response.result { 
     case .success(let value): 
      print ("finish") 
      let swiftyJson = JSON(value) 
      completionHandler(swiftyJson, nil) 
     case .failure(let error): 
      completionHandler(nil, error) 
     } 
    } 
} 

これは私たちの構造体です。

struct MainProduct:Codable{ 

    var purchaseDate:Date 
    var orderId:String 
    var orderSize:Double 
    var orderStatus:OrderStatus? 

    var archived:Bool 

    private enum CodingKeys: String, CodingKey { 
     case purchaseDate 
     case orderId 
     case orderSize 
     case orderStatus = "theOrderStatus" 
     case archived 
    } 
} 
+0

なぜ、「MainProduct」内の暗黙のうちにアンラップされたオプションとしてあなたの値の大部分を宣言していますか?意味がない。 –

+0

だから私はちょうど '!'権利を取り除くべきだと言っているのですか? –

+1

確かに。暗黙的にアンラップされたオプションは、正しく使用されないとエラーにつながる可能性があるため、非常に正当な理由がある場合を除いて使用しないでください。 –

答えて

1

新しいURLRequestを作り、自分のエンコードjsonDatahttpBodyを設定することができます。このコードを試してみてください...

func addProduct(product: MainProduct, completionHandler: @escaping ((JSON?, Error?)->Void)) { 

    let encoder = JSONEncoder() 
    let jsonData = try! encoder.encode(product) 

    let url = "INSERT_URL" 

    var request = URLRequest(url: url) 
    request.httpMethod = HTTPMethod.put.rawValue 
    request.setValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type") 
    request.httpBody = jsonData 

    Alamofire.request(request).responseJSON { response in 
     switch response.result { 
     case .success(let value): 
      print ("finish") 
      let swiftyJson = JSON(value) 
      completionHandler(swiftyJson, nil) 
     case .failure(let error): 
      completionHandler(nil, error) 
     } 
    } 
} 
関連する問題