swift 网络请求Alamofire的使用

一、使用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的使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容