post发送JSON数据(字符串、数组、字典、自定义对象)给服务器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了post发送JSON数据(字符串、数组、字典、自定义对象)给服务器相关的知识,希望对你有一定的参考价值。

参考技术A post发送JSON数据(字符串、数组、字典、自定义对象)给服务器

触发发送的方法

这次Demo是通过点击屏幕触发发送数据给服务器事件

前提需要开启本地模拟服务器

发送JSON字符串

发送字典给服务器

发送数组给服务器

发送oc对象给服务器

先讲对象转换为字典

通过系统提供的JSON解析类进行序列化

觉得不错请点赞支持,欢迎留言或进我的个人群855801563领取【架构资料专题目合集90期】、【BATJTMD大厂JAVA面试真题1000+】,本群专用于学习交流技术、分享面试机会,拒绝广告,我也会在群内不定期答题、探讨

Alamofire:发送带有字典数组的 JSON

【中文标题】Alamofire:发送带有字典数组的 JSON【英文标题】:Alamofire: Send JSON with Array of Dictionaries 【发布时间】:2016-03-24 15:39:05 【问题描述】:

我有一个 JSON 格式的数据结构:

[
    "value": "1",
    "optionId": "be69fa23-6eca-4e1b-8c78-c01daaa43c88"
, 
    "value": "0",
    "optionId": "f75da6a9-a34c-4ff6-8070-0d27792073df"
]

基本上它是一个字典数组。我更喜欢使用默认的 Alamofire 方法,并且不想手动构建请求。有没有办法给 Alamofire 我的参数,Alamofire 做剩下的?

如果我手动创建所有内容,我会从服务器收到一个错误,即发送数据不正确。

    var parameters = [[String:AnyObject]]()

    for votingOption in votingOptions

        let type = votingOption.votingHeaders.first?.type

        let parameter = ["optionId":votingOption.optionID,
            "value": votingOption.votingBoolValue
        ]
        parameters.append(parameter)
    

    let jsonData = try! NSJSONSerialization.dataWithJSONObject(parameters, options: [])
    let json = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: .AllowFragments)


    if let url = NSURL(string:"myprivateurl")
        let request = NSMutableURLRequest(URL: url)
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.HTTPMethod = Method.POST.rawValue
        request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(parameters, options: [])

        AlamofireManager.Configured.request(request)
            .responseJSON  response in
           //Handle result     
        
    

【问题讨论】:

关于这个问题的任何更新? 【参考方案1】:

我有同样的问题并通过这种方式解决:

我创建了一个实现 Alamofire 的 ParameterEncoding 协议的新结构:

struct JSONArrayEncoding: ParameterEncoding 
    private let array: [Parameters]

    init(array: [Parameters]) 
        self.array = array
    

    func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest 
        var urlRequest = try urlRequest.asURLRequest()

        let data = try JSONSerialization.data(withJSONObject: array, options: [])

        if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil 
            urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
        

        urlRequest.httpBody = data

        return urlRequest
    

那么,我可以这样做:

let parameters : [Parameters] = bodies.map(  $0.bodyDictionary() )
Alamofire.request(url, method: .post, encoding: JSONArrayEncoding(array: parameters), headers: headers).responseArray  ... 

它对我有用。希望可以帮助别人。

【讨论】:

这里的身体是什么?能否请您详细解释一下参数 "my_profileid":"" "countries": [ "country_full_name": "","id": ""], "languages": ["language_full_name": "", "id": ""], "areas": ["area_full_name": "","id": ""], "profile_types": ["profile_type_full_name": "","profile_type_short_name": "" ,"id": ""], "profile_levels": ["profile_level_full_name": "","id": ""] 这是我的请求参数,但它给了我错误 响应:失败:responseSerializationFailed(原因:Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength)【参考方案2】:

你可以这样做:

Alamofire.request(.POST, urlPath, parameters: params).responseJSON request, response, data in
    //YOUR_CODE

parameters[String:AnyObject],是的,Alamofire 负责其余部分。

由于您使用的是经理,因此您可以这样做

YOUR_ALAMOFIRE_MANAGER.request(.POST, url, parameters: params).responseJSON request, response, JSON in
   //enter code here

这里是源代码:

public func request(
    method: Method,
    _ URLString: URLStringConvertible,
    parameters: [String: AnyObject]? = nil,
    encoding: ParameterEncoding = .URL,
    headers: [String: String]? = nil)
    -> Request

    let mutableURLRequest = URLRequest(method, URLString, headers: headers)
    let encodedURLRequest = encoding.encode(mutableURLRequest, parameters: parameters).0
    return request(encodedURLRequest)

编辑:

由于您的数据当前为[[String:AnyObject]],您需要对其进行修改,使其格式为[String:AnyObject]。一种方法是这样做["data":[[String:AnyObject]]]。不过,您可能必须更改您的 api 端点。

【讨论】:

参数采用 [String: AnyObject] 但我有 [[String:AnyObject]]。或者,如果您查看我的 JSON,您是否看到了这种可能性? 我没有看到,你总是可以做类似["data":[[String:AnyObject]]]的事情。 您必须对数据进行建模以反映 [String:AnyObject]。应该不会太难。【参考方案3】:

您可以为 JSON POST 请求提供参数编码,它将在请求正文中以 JSON 格式发送数据。

Alamofire.request(.POST, "https://httpbin.org/post", parameters: parameters, encoding: .JSON)

这在 Alamofire github 的自述文件中有所描述 - https://github.com/Alamofire/Alamofire#post-request-with-json-encoded-parameters

let parameters = [
    "foo": [1,2,3],
    "bar": [
        "baz": "qux"
    ]
]

Alamofire.request(.POST, "https://httpbin.org/post", parameters: parameters, encoding: .JSON)
// HTTP body: "foo": [1, 2, 3], "bar": "baz": "qux"

【讨论】:

参数采用 [String: AnyObject] 但我有 [[String:AnyObject]]。或者,如果您查看我的 JSON,您是否看到了一种可能性?

以上是关于post发送JSON数据(字符串、数组、字典、自定义对象)给服务器的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking multipart/form-data POST 发送不正确的 JSON 字典数组

iOS Swift moya框架发送数组作为请求参数(GET/POST)

将字典数组编码为 JSON 时面临的问题

使用 Alamofire 请求方法在 POST 的请求正文中发送 JSON 对象数组

发送 JSON 字符串作为 post 请求

通过 Alamofire 发送 json 数组