2016-10-18 9 views
0

CRUD exampleをBaseとして使用して、Alamofireリクエストに対してJSON形式のPOSTパラメータを実行するにはどうすればよいですか?パラメータを送信できません。以下はAlamofire CRUD POST a JSON

は、私のルータジェネレータです:

fileprivate enum Router: URLRequestConvertible { 

case login(reqData: Data) 
case preferencesIndex() 
case preferencesUpdate(parameters: Parameters) 

static let baseURLString = "http://test.com" 

var method: HTTPMethod { 
    switch self { 
    case .login, .preferencesIndex: 
     return .get 
    case .preferencesUpdate: 
     return .post 
    } 
} 

var path: String { 
    switch self { 
    case .login: 
     return "/login" 
    case .preferencesIndex: 
     return "/preferences/list" 
    case .preferencesUpdate: 
     return "/preferences/update" 
    } 
} 

// MARK: URLRequestConvertible 
func asURLRequest() throws -> URLRequest { 
    let url = try Router.baseURLString.asURL() 
    let paramsDefault: Parameters = ["_format" : "json", "_authorization" : "testkey"] 

    var urlRequest = URLRequest(url: url.appendingPathComponent(path)) 
    urlRequest.httpMethod = method.rawValue 

    urlRequest = try URLEncoding.default.encode(urlRequest, with: paramsDefault) 

    switch self { 
    case .preferencesUpdate(let parameters): 
     //POST JSON 
     let data = try JSONSerialization.data(withJSONObject: parameters, options: []) 
     urlRequest.httpBody = data 
     urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") 
    default: 
     break 
    } 

    return urlRequest 
} 

} 

次のように私は、受信エラーがある:

Request failed with error: JSON could not be serialized because of error: The data couldn’t be read because it isn’t in the correct format.

私はParameters型としてパラメータを送信するので、私の問題は、シリアライズ時だと思います...

+0

あなたが迅速3を使用していますか? 1)URL EX生成:http://test.com/preferences/update?_format=json&_authorization=testkey -base URLます。http://テストを –

+0

はい、私は私が望む迅速な3 –

+0

を使用しています。 COM -path:/環境設定/ -query文字列更新:_format、承認 2)送信をJSON: [ "データ":[ "アイテム":[[ "名前": "items_ids"、 "値": "1,2,3"]]]] 私はルータの発電機でこれを行うことはできません。 –

答えて

0

JSONがリクエストをエンコードしたいときにリクエストをURLエンコードしようとしている可能性があります。あなたはこのラインがあります。

urlRequest = try URLEncoding.default.encode(urlRequest, with: paramsDefault) 

をしかし、あなたはこれをしたい:

urlRequest = try JSONEncoding.default.encode(urlRequest, with: paramsDefault) 
+0

ありがとうございます。私は今他の問題があります.. paramsDefaultは、クエリ文字列としてurlに追加する必要があります(「?_format = json&authorization = testkey」など)、パラメータはhttpBodyのJSONとして渡す必要がありますが、メソッドの型が.postなので、 paramsDefaultをクエリ文字列として追加します。私はあなたが私の意味を理解することを願っています:( –

0

あなたは以下のようにリクエストを送信する必要があり、迅速な3

let urlString = "https://httpbin.org/get" 
let headers = ["Authorization": "123456"] 

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