AFNetworking 3.0另类的总结

AFNetworking 早已进入了3.0的时代,绝大多数的APP现在都拿3.0的版本来搞一搞,3.0与2.0的区别我这里就不扯犊子了 。。。。。扯了也白扯,今天总结下几个另类的冷知识

1.AFNetworking 请求方式

请求方式这个需要总结吗??? 不就是GET和POST吗???我们在用到 AFNetworking 可能99%的人用到的请求方式是GET和POST ,但是从一种装逼的角度上来看,请求方式远远不止两种

GET, POST , PUT , PATCH , DELETE , COTY , HEAD , OPTIONS , LINK , UNLINK , PURGE , LOCK , UNLOCK , PROPFIND , VIEW

大部分的请求方式,我们没见过甚至都没听说过,从服务端的角度,我们打开spring2.5框架的源码

public enum RequestMethod {
    GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}

服务端给我们提供的请求方式有很多种,个人感觉这么多不是为了装逼还是为了啥子了 ????装逼归装逼,但是我们需要了解下我们的AFNetworking 框架,但是打开AFNetworking的源码,我们发现AFNetworking只给我们提供了

- (nullable NSURLSessionDataTask *)GET:(NSString *)URLString ...
- (nullable NSURLSessionDataTask *)HEAD:(NSString *)URLString ...
- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString ...
- (nullable NSURLSessionDataTask *)PUT:(NSString *)URLString  ... 
- (nullable NSURLSessionDataTask *)PATCH:(NSString *)URLString ...
- (nullable NSURLSessionDataTask *)DELETE:(NSString *)URLString ...

其实这基本满足了我们的需求,但是现实中总有些喜欢装13的人….上接口

@RequestMapping("/test")
@Controller
public class TestController {

    @RequestMapping(value = "/postFlag.do", method = RequestMethod.POST)
    public void postActionFlag(String userName, String passWord, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        HashMap<String, Object> map = new HashMap<>();
        map.put("userName", userName);
        map.put("passWord", passWord);
        String json = JSONObject.fromObject(map).toString();
        response.getOutputStream().write(json.getBytes("UTF-8"));
    }

    @RequestMapping(value = "/traceFlag.do", method = RequestMethod.TRACE)
    public void traceActionFlag(String userName, String passWord, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        HashMap<String, Object> map = new HashMap<>();
        map.put("userName", userName);
        map.put("passWord", passWord);
        String json = JSONObject.fromObject(map).toString();
        response.getOutputStream().write(json.getBytes("UTF-8"));
    }

}

method = RequestMethod.TRACE ,trace请求 。。。。很显然,你用get和POST是不行滴。。 어떡해 ?
其实所谓GET请求,POST请求或神马DELETE请求他们本质是没啥子区别,只不过请求方式上封装了下,小装了一下而已。。。 我们来看下源码

- (NSURLSessionDataTask *)PUT:(NSString *)URLString
                   parameters:(id)parameters
                      success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                      failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
{
    NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"PUT" URLString:URLString parameters:parameters uploadProgress:nil downloadProgress:nil success:success failure:failure];

    [dataTask resume];

    return dataTask;
}

我相信你看的的 POST,GET,DELETE也差不多只不过换了一个字符串 “POST”,”GET”, “DELETE” ,那么trace请求咋搞了???难不成直接把字符串换成TRACE,貌似是真是的!!!

再说到这个问题之前我写过一篇performSelector多个参数的博客:http://blog.csdn.net/chmod_R_755/article/details/78676395 为什么要提到这个了 ??? 因为代码需要,建议先了解下 performSelector多个参数的这个问题

我们打开AFNetworking 的源码看看,发现AFNetworking 没有直接给我们提供dataTaskWithHTTPMethod 这个方法,但是,这不重要

-(void)httpPostDataAction{

    NSString *url = @"http://10.0.1.199:8088/zc/test/traceFlag.do";
    NSDictionary *dic = @{@"userName":@"hebiao",@"passWord":@"12345678"};
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    SEL anotherSel= NSSelectorFromString(@"dataTaskWithHTTPMethod:URLString:parameters:uploadProgress:downloadProgress:success:failure:");

    void (^uploadProgress)(NSProgress *) = ^(NSProgress *uploadProgress){
        NSLog(@"######### %@ ===========",uploadProgress);


    };
    void (^downloadProgress)(NSProgress *) = ^(NSProgress *downloadProgress){
        NSLog(@" ^^^^^^^^^ %@ ===========",downloadProgress);
    };
    void (^success)(NSURLSessionDataTask *, id) = ^(NSURLSessionDataTask *task, id obj){
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:obj options:NSJSONReadingMutableContainers error:nil];

        NSLog(@" ~~~~~~~~~~~~ %@ ===========  %@",dic , obj);
    };
    void (^failure)(NSURLSessionDataTask *, NSError *) = ^(NSURLSessionDataTask *task, NSError *error){
        NSLog(@" `````````` %@ ===========",[error description] );
    };

    if ([manager respondsToSelector:anotherSel]) {

        NSError *error ;
        NSURLSessionDataTask *dataTask = [manager VKCallSelector:anotherSel error:&error,@"TRACE",url,dic,uploadProgress,downloadProgress,success,failure];
        [dataTask resume];
    }
}

这里写图片描述

我们很尴尬,也就是我们可以看出来AFNetworking这个框架只支持六种请求 HEAD DELETE POST GET OPTIONS PUT ,但是 我想说的是,六种请求足够我们在有生之年使用了。。。。。

2.AFNetworking 的 header 传参和POST传参

这两种传参方式是我们比较常用的,先上代码 。。。。

iOS 11端代码如下

-(void)testHeadValues{

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject: @"application/json"];
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    [manager.requestSerializer setValue:@"hebiao" forHTTPHeaderField:@"name"];
    [manager.requestSerializer setValue:@"123456" forHTTPHeaderField:@"pwd"];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    NSDictionary *dic = @{@"userName":@"진싼팡",@"passWord":@"습니다"};

    [manager POST:@"http://10.0.1.199:8088/zc/test/postFlag.do" parameters:dic progress:^(NSProgress * _Nonnull uploadProgress) {

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
         NSDictionary *obj = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
         NSLog(@"success =====================  %@",obj);

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
       NSLog(@"failure =====================  %@",[error description]);

    }];

}

2017-12-22 16:02:54.127061+0800 test[37749:13113786] success =====================  {
    date =     {
        date = 22;
        day = 5;
        hours = 16;
        minutes = 2;
        month = 11;
        seconds = 54;
        time = 1513929774226;
        timezoneOffset = "-480";
        year = 117;
    };
    passWord = "\Uc2b5\Ub2c8\Ub2e4";
    userName = "\Uc9c4\Uc2fc\Ud321";
}

Java端代码如下

    @RequestMapping(value = "/postFlag.do", method = RequestMethod.POST)
    public void postActionFlag(String userName, String passWord, HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        Enumeration pHeads =request.getHeaderNames();
        while (pHeads.hasMoreElements()) {
            String name = (String) pHeads.nextElement();
            String value = request.getHeader(name);
            String log = "header:  name =" + name + "     value =" + value;
            System.out.println(log);
        }

        Enumeration pNames = request.getParameterNames();
        while (pNames.hasMoreElements()) {
            String name = (String) pNames.nextElement();
            String value = request.getParameter(name);
            String log = "name =" + name + "     value =" + value;

            System.out.println(log);
        }

        System.out.println("  ===================== postFlag  ======================");
        System.out.println("userName ===== "+userName +"        passWord  ====  "+ passWord);

        HashMap<String, Object> map = new HashMap<>();
        map.put("userName", userName);
        map.put("passWord", passWord);
        map.put("date", new Date());
        String json = JSONObject.fromObject(map).toString();
        response.getOutputStream().write(json.getBytes("UTF-8"));

    }




header:  name =host     value =10.0.1.199:8088
header:  name =content-type     value =application/x-www-form-urlencoded
header:  name =accept     value =*/*
header:  name =accept-encoding     value =gzip, deflate
header:  name =connection     value =keep-alive
header:  name =content-length     value =73
header:  name =user-agent     value =notice/1.0 (iPhone; iOS 10.3.3; Scale/2.00)
header:  name =accept-language     value =zh-Hans-CN;q=1, ko-CN;q=0.9, en-CN;q=0.8, ko-KR;q=0.7, ja-JP;q=0.6, es-ES;q=0.5
header:  name =name     value =hebiao
header:  name =pwd     value =123456
name =passWord     value =습니다
name =userName     value =진싼팡
  ===================== postFlag  ======================
userName ===== 진싼팡        passWord  ====  습니다

我要说明的是iOS端的header 和 服务端的header 以及 post参数的一种对应关系 ,如果选择这两种传参的形式了 ??? POST 传参我们发现它仅仅是把服务端需要的字段传过去了;而header传参不仅仅传递了所需要的字段,而且附带了客户端信息(如:用户代理) 所以选择什么传参是按照业务来定的;但是header传参有限制,只能给服务端传字符串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值