swift 网络请求Alamofire的使用

作者: 否极泰来_L | 来源:发表于2017-02-08 15:22 被阅读2195次

    一、使用Alamofire进行数据请求

    1,以GET请求为例

    (1)不带参数,不带结果处理

    Alamofire.request("https://httpbin.org/get")

    (2)带参数,不带结果处理

    Alamofire.request("https://httpbin.org/get", parameters: ["foo":"bar"])

    (3)带参数,也带结果处理(这里以返回结果为json格式的为例)

    Alamofire.request("https://httpbin.org/get", parameters: ["foo":"bar"])

    .responseJSON { responsein

    print(response.request)// original URL request

    print(response.response)// URL response

    print(response.data)// server data

    print(response.result)// result of response serialization

    ifletJSON= response.result.value {

    print("JSON: \(JSON)")//具体如何解析json内容可看下方“响应处理”部分

    }}

    2,响应处理(Response Handling)

    (1)除了上面样例使用的responseJSON(处理json类型的返回结果)外,Alamofire还提供了许多其他类型的响应处理方法:

    response()

    responseData()

    responseString(encoding: NSStringEncoding)

    responseJSON(options: NSJSONReadingOptions)

    responsePropertyList(options: NSPropertyListReadOptions)

    (2)Response Handler

    Alamofire.request("https://httpbin.org/get", parameters: ["foo":"bar"])

    .response { responsein

    print("Request: \(response.request)")

    print("Response: \(response.response)")

    print("Error: \(response.error)")

    ifletdata = response.data,letutf8Text =String(data: data, encoding: .utf8) {

    print("Data: \(utf8Text)")

    }}

    (3)Response Data Handler

    Alamofire.request("https://httpbin.org/get", parameters: ["foo":"bar"])

    .responseData { responsein

    debugPrint("All Response Info: \(response)")

    ifletdata = response.result.value,letutf8Text =String(data: data, encoding: .utf8) {

    print("Data: \(utf8Text)")

    }}

    (4)Response String Handler

    Alamofire.request("https://httpbin.org/get", parameters: ["foo":"bar"])

    .responseString { responsein

    print("Success: \(response.result.isSuccess)")

    print("Response String: \(response.result.value)")

    }

    (5)Response JSON Handler

    使用responseJSON 方法的话,JSON数据会被自动转化为 Dictionary或Array。假设我们返回的json数据格式如下:

    [{"name": "hangge","phones": [{"name": "公司","number": "123456"},{"name": "家庭","number":"001"}]},{"name": "big boss","phones": [{"name": "公司","number": "111111"}]}]

    使用responseJSON自动解析json数据:

    Alamofire.request("http://www.hangge.com/jsonData.php")

    .responseJSON { responsein

    switchresponse.result.isSuccess {

    case true:

    //把得到的JSON数据转为数组

    ifletitems = response.result.valueas?NSArray{

    //遍历数组得到每一个字典模型

    fordictinitems{

    print(dict)

    }}

    case false:

    print(response.result.error)

    }}

    responseJSON也可以配合SwiftyJSON一起使用,具体可以查看我原来写的这篇文章:Swift - SwiftyJSON的使用详解

    (6)同样也支持链式的返回结果处理

    Alamofire.request("https://httpbin.org/get")

    .responseString { responsein

    print("Response String: \(response.result.value)")

    }.responseJSON { responsein

    print("Response JSON: \(response.result.value)")

    }

    3,请求类型(HTTP Methods)

    除了上面使用的.Get类型(不指定的话,默认都是使用Get请求)。Alamofire还定义了许多其他的HTTP 方法(HTTP Medthods)可以使用。

    publicenumHTTPMethod:String{

    caseoptions ="OPTIONS"

    caseget="GET"

    casehead    ="HEAD"

    casepost    ="POST"

    caseput     ="PUT"

    casepatch   ="PATCH"

    casedelete  ="DELETE"

    casetrace   ="TRACE"

    caseconnect ="CONNECT"

    }

    比如要使用POST请求,把Alamofire.request第二个参数做修改即可:

    Alamofire.request("http://httpbin.org/post", method: .post)

    4,请求参数(Parameters)

    (1)使用GET类型请求的时候,参数会自动拼接在url后面

    Alamofire.request("https://httpbin.org/get", parameters: ["foo":"bar"])

    //https://httpbin.org/get?foo=bar

    (2)使用POST类型请求的时候,参数是放在在HTTP body里传递,url上看不到

    letparameters:[String:Any] = [

    "foo":"bar",

    "baz": ["a", 1],

    "qux": [

    "x": 1,

    "y": 2,

    "z": 3

    ]

    ]

    Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters)

    // HTTP body: foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3

    5,参数编码方式(Parameter Encoding)

    除了默认的方式外,Alamofire还支持URL、JSON、PropertyList以及自定义格式方式编码参数。

    比如我们想要把一个字典类型的数据,使用json格式发起POST请求:

    letparameters:[String:Any] = [

    "foo": [1,2,3],

    "bar": [

    "baz":"qux"

    ]

    ]

    Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters,

    encoding:JSONEncoding.default)

    // HTTP body: {"foo": [1, 2, 3], "bar": {"baz": "qux"}}

    服务端php页面可以这么取得发送过来的JSON数据:

    $postdata= json_decode(file_get_contents("php://input"),TRUE);

    $foo=$postdata["foo"];

    foreach($fooas$item){

    echo$item."|";

    }

    //输出:1|2|3|

    6,支持自定义Http头信息(HTTP Headers)

    letheaders:HTTPHeaders= [

    "Authorization":"Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",

    "Accept":"application/json"

    ]

    Alamofire.request("https://httpbin.org/headers", headers: headers)

    .responseJSON { responsein

    debugPrint(response)

    }

    二、判断数据请求是否成功,并做相应的处理

    在请求响应对象之前调用的.validate()函数是另一个易用的 Alamofire 特性。

    将其与请求和响应链接,以确认响应的状态码在默认可接受的范围(200到299)内。如果认证失败,响应处理方法将出现一个相关错误,我们可以根据不同在完成处理方法中处理这个错误。

    比如下面的样例,成功时会打印成功信息,失败时输出具体错误信息。

    Alamofire.request("https://httpbin.org/get", parameters: ["foo":"bar"])

    .validate()

    .responseJSON { responsein

    switchresponse.result.isSuccess {

    casetrue:

    print("数据获取成功!")

    casefalse:

    print(response.result.error)

    }}

    三、打印调试(print和debugPrint)

    不管是request对象还是response对象都是支持打印输出的。根据不同的调试需求,我们可以自行选择使用print还是debugPrint。

    1,打印request对象

    letrequest =Alamofire.request("https://httpbin.org/ip", parameters: ["foo":"bar"])

    print(request)

    /********** 下面是控制台输出 ***************

    GEThttps://httpbin.org/ip?foo=bar

    ******************************************/

    letrequest =Alamofire.request("https://httpbin.org/ip", parameters: ["foo":"bar"])

    debugPrint(request)

    /********** 下面是控制台输出 ***************

    $ curl -i \

    -H "User-Agent: hangge_970/com.hangge.hangge-970 (1; OS Version 9.1 (Build 13B137))" \

    -H "Accept-Encoding: gzip;q=1.0,compress;q=0.5" \

    -H "Accept-Language: zh-Hans-CN;q=1.0,en-CN;q=0.9" \

    "https://httpbin.org/ip?foo=bar"

    ******************************************/

    2,打印response对象

    Alamofire.request("https://httpbin.org/get")

    .responseString { responsein

    debugPrint(response)

    }

    /********** 下面是控制台输出 ***************

    SUCCESS: {

    "args": {},

    "headers": {

    "Accept": "*/*",

    "Accept-Encoding":"gzip;q=1.0,compress;q=0.5",

    "Accept-Language":"zh-Hans-CN;q=1.0,en-CN;q=0.9",

    "Host":"httpbin.org",

    "User-Agent":"hangge_970/com.hangge.hangge-970 (1; OS Version 9.1 (Build 13B137))"

    },

    "origin":"180.109.163.139",

    "url":"https://httpbin.org/get"

    }

    ******************************************/

    Alamofire.request(.GET,"https://httpbin.org/get")

    .responseString { responsein

    print(response)

    }

    /********** 下面是控制台输出 ***************

    [Request]: { URL:https://httpbin.org/get}

    [Response]: { URL:https://httpbin.org/get} { status code: 200, headers {

    "Access-Control-Allow-Origin" = "*";

    "Content-Length" = 354;

    "Content-Type" = "application/json";

    Date = "Tue, 08 Dec 2015 01:57:45 GMT";

    Server = nginx;

    "access-control-allow-credentials" = true;

    } }

    [Data]: 354 bytes

    [Result]: SUCCESS: {

    "args": {},

    "headers": {

    "Accept": "*/*",

    "Accept-Encoding":"gzip;q=1.0,compress;q=0.5",

    "Accept-Language":"zh-Hans-CN;q=1.0,en-CN;q=0.9",

    "Host":"httpbin.org",

    "User-Agent":"hangge_970/com.hangge.hangge-970 (1; OS Version 9.1 (Build 13B137))"

    },

    "origin":"180.109.163.139",

    "url":"https://httpbin.org/get"

    }

    原文链接:swift 数据请求Alamofire的使用

    相关文章

      网友评论

        本文标题: swift 网络请求Alamofire的使用

        本文链接:https://www.haomeiwen.com/subject/neovittx.html