美文网首页ios iOS开发
iOS,AFNetworking网络请求数据格式取消URLEnC

iOS,AFNetworking网络请求数据格式取消URLEnC

作者: ProgrammerChan | 来源:发表于2017-10-12 18:10 被阅读367次
    今天做一个新项目发现我post交过去的数据与后台需要的数据不太一样,后台需要的是原封不动的数据格式,用wireShark抓包发现自己post出去的数据是经过了URLEncode过后的,所以需要取消这个URLEncode的处理。让原来发出去的数据什么样子,在网络中就是什么样子。只有修改框架代码。

    1.定位到AFURLRequestSerialization.m类。
    2.定位到- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)requestwithParameters:(id)parameters
    error:(NSError *__autoreleasing *)error方法。

    query为传进来的数据,他会在这里面进行一些处理。

    - (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request
                                   withParameters:(id)parameters
                                            error:(NSError *__autoreleasing *)error
    {
        NSParameterAssert(request);
    
        NSMutableURLRequest *mutableRequest = [request mutableCopy];
    
        [self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) {
            if (![request valueForHTTPHeaderField:field]) {
                [mutableRequest setValue:value forHTTPHeaderField:field];
            }
        }];
    
        NSString *query = nil;
        if (parameters) {
            if (self.queryStringSerialization) {
                NSError *serializationError;
                query = self.queryStringSerialization(request, parameters, &serializationError);
                if (serializationError) {
                    if (error) {
                        *error = serializationError;
                    }
                    return nil;
                }
            } else {
                switch (self.queryStringSerializationStyle) {
                    case AFHTTPRequestQueryStringDefaultStyle:
    //这里处理的这个数据。
    //                    query = AFQueryStringFromParameters(parameters);
    //不用处理就直接赋值了。
                        query = parameters;
                        break;
                }
            }
        }
    
        if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) {
            if (query && query.length > 0) {
                mutableRequest.URL = [NSURL URLWithString:[[mutableRequest.URL absoluteString] stringByAppendingFormat:mutableRequest.URL.query ? @"&%@" : @"?%@", query]];
            }
        } else {
    
            // #2864: an empty string is a valid x-www-form-urlencoded payload
            if (!query) {
                query = @"";
            }
            if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) {
                
                //这里也可以修改conten-Type,我用的application/octet-stream,因为大神写的代码不是很看到懂!!所以各种瞎改!原来是表单提交application/x-www-form-urlencoded
                [mutableRequest setValue:@"application/octet-stream" forHTTPHeaderField:@"Content-Type"];
            }
    
          //最后把这个数据赋值给请求body
            NSLog(@"%@",query);
            [mutableRequest setHTTPBody:[query dataUsingEncoding:self.stringEncoding]];
        }
        return mutableRequest;
    }
    

    以上这种改法只是凭着感觉改的!实现这个需求肯定在这里改!但是有没有改全后面会一直实验的!有什么新的问题再更新!暂时没有问题。只是记录一下。

    相关文章

      网友评论

      • suxx0:刚看了下AFN的源码,可以外部设置

        AFNManager = [AFHTTPSessionManager manager];
        // 设置请求参数 就不走AFN源码中的urlencode了 不用修改AFN中的源码了
        [AFNManager.requestSerializer setQueryStringSerializationWithBlock:^NSString * _Nonnull(NSURLRequest * _Nonnull request, id _Nonnull parameters, NSError * _Nullable __autoreleasing * _Nullable error) {
        return parameters;//返回你的参数
        }];
        ProgrammerChan:好滴。我去试试。

      本文标题:iOS,AFNetworking网络请求数据格式取消URLEnC

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