2016-10-18 97 views
0

如何使用CRUD example作爲Base,以JSON格式將POST參數設置爲Alamofire請求?我無法發送我的參數。Alamofire CRUD POST 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

是否使用SWIFT 3? –

+0

是的,我使用SWIFT 3 –

+0

我想: 1)生成URL 例如:http://test.com/preferences/update?_format=json&_authorization=testkey 鹼基的URL:http://測試。 COM 路徑:/首選項/更新 - 查詢字符串:_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必須作爲查詢字符串(如:「?_format = json&authorization = testkey」)添加到url中,並且參數必須在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) 
}