2016-10-18 58 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) 
}