【问题标题】:Alamofire CRUD POST a JSONAlamofire CRUD 发布一个 JSON
【发布时间】:2016-10-18 16:21:23
【问题描述】:

如何使用 CRUD example 作为基础以 JSON 格式向 Alamofire 请求发送 POST 参数?我无法发送我的参数。

下面是我的路由器生成器:

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
}

}

我收到的错误如下:

请求失败并出现错误:由于错误,无法序列化 JSON: 无法读取数据,因为它的格式不正确。

我认为我的问题在于序列化,因为我将参数发送为Parameters 类型...

【问题讨论】:

  • 你用的是swift 3吗?
  • 是的,我用的是 swift 3
  • 我想要:1)生成 url ex:test.com/preferences/… -base url:test.com -path:/preferences/update -query string:_format,授权 2)发送 JSON:[“data” : ["items" : [["name": "items_ids", "value": "1,2,3"]]]] 但是我不能在我的路由器生成器中做这个..

标签: json swift serialization alamofire


【解决方案1】:

我想部分问题可能是当您想要对请求进行 JSON 编码时,您正在尝试对请求进行 URL 编码。你有这行:

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

但你想要这个:

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

【讨论】:

  • 谢谢。我现在有其他问题.. paramsDefault 必须作为查询字符串添加到 url 中(例如:“?_format=json&authorization=testkey”)并且参数必须在 httpBody 中作为 JSON 传递.. 但是因为方法类型是 .post 我可以' t 添加 paramsDefault 作为查询字符串。我希望你明白我的意思:(
【解决方案2】:

您需要在 swift 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)
}

【讨论】:

    猜你喜欢
    • 2017-11-13
    • 1970-01-01
    • 2018-05-08
    • 2023-04-05
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 2015-07-06
    相关资源
    最近更新 更多