博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS——格式化简单的HTTP POST
阅读量:6975 次
发布时间:2019-06-27

本文共 3305 字,大约阅读时间需要 11 分钟。

hot3.png

为了实现POST请求,我们写一个NSMutableURLRequest的子类,XYFormEncodedPOSTRequest,他支持POST方式中用到的参数字典。

XYFormEncodedPOSTRequest.h:

#import 
@interface XYFormEncodedPOSTRequest : NSMutableURLRequest+ (id)requestWithURL:(NSURL *)url formParameters:(NSDictionary *)params;- (id)initWithURL:(NSURL *)url formParameters:(NSDictionary *)params;- (void)setFormParameters:(NSDictionary *)params;@end

XYFormEncodedPOSTRequest.m:

#import "XYFormEncodedPOSTRequest.h"#import "NSString+XYURLAdditions.h"@implementation XYFormEncodedPOSTRequest+ (id)requestWithURL:(NSURL *)url formParameters:(NSDictionary *)params{    return [[self alloc] initWithURL:url formParameters:params];}- (id)initWithURL:(NSURL *)url formParameters:(NSDictionary *)params{    if (self = [super initWithURL:url]) {        [self setHTTPMethod:@"POST"];        [self setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];        [self setFormParameters:params];    }    return self;}- (void)setFormParameters:(NSDictionary *)params{    NSStringEncoding enc = NSUTF8StringEncoding;    NSMutableString *postBody = [NSMutableString string];    for (NSString *paramKey in params) {        if ([paramKey length] > 0) {            NSString *value = [params objectForKey:paramKey];            NSString *encodeValue = [value URLEncodedFormStringUsingEncoding:enc];            NSUInteger length = [postBody length];            NSString *paramFormat = (length == 0? @"%@=%@" : @"&%@=%@");            [postBody appendFormat:paramFormat, paramKey,encodeValue];        }    }        NSLog(@"postBody is now %@", postBody);    [self setHTTPBody:[postBody dataUsingEncoding:enc]];}@end
表单参数看上去和URL查询字符串差不多,但是要把它们放到http正文中,而不是加到URL中,所以,假如提交包含名字和年龄的表单,编写好的正文字符长因该向下面这样:name-Lucas+Drance&age=1.5.
每个参数的名字与值之间用等号(=)连接,然后把这些参数用and(&)连接起来。

因此,若给定一组名称值对,我们的cocoa代码需要像先前说明的那样把它们连接在一块,这就是-setFormetters:所做的事情,他是用NSString的扩展来处理所有的字符转义。

标准的-[NSString stringByAddingPercentEscapesUsingEncoding:]方法可以把接受器转换成合法的URL字符串。但是如果用户输入中包含了保留字符(+,&,=),他会不做任何处理。我们需要自己转义。

NSString+XYURLAdditions.h:

#import 
@interface NSString (XYURLAdditions)- (NSString *)URLEncodedFormStringUsingEncoding:(NSStringEncoding)enc;- (NSString *)percentEscapedStringWithEncoding:(NSStringEncoding)enc additionalCharacters:(NSString *)add ignoredCharacters:(NSString *)ignore;@end
如果先替换空白字符,那么转义处理将对所有加号做转义;我们只是想对用户输入做转义,所以在最后一步替换空白字符。
NSString+XYURLAdditions.m:
#import "NSString+XYURLAdditions.h"@implementation NSString (XYURLAdditions)- (NSString *)URLEncodedFormStringUsingEncoding:(NSStringEncoding)enc{    NSString *escapedStringWithSpaces = [self percentEscapedStringWithEncoding:enc additionalCharacters:@"&=+" ignoredCharacters:nil];    return escapedStringWithSpaces;}- (NSString *)percentEscapedStringWithEncoding:(NSStringEncoding)enc additionalCharacters:(NSString *)add ignoredCharacters:(NSString *)ignore{        CFStringEncoding convertedEncoding = CFStringConvertNSStringEncodingToEncoding(enc);    return (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, (CFStringRef)ignore, (CFStringRef)add, convertedEncoding));}@end
字符串转换由第二个方法完成,他有两组字符参数:一组是该被转义的(即保留字符),一组是不应该转义的。使用Core Fundation中CFURLCreateStringByAddingPercentEscpes的调用会执行所需的特殊替换。

源代码:

转载于:https://my.oschina.net/orangef/blog/135146

你可能感兴趣的文章
JAVA之Exchanger
查看>>
Linux驱动之IIC总线
查看>>
Linux-NoSQL之MongoDB
查看>>
阿里云ECS(Ubuntu)安装Docker
查看>>
Raphael 对热区的控制
查看>>
vue组件导航栏动态添加class
查看>>
HDU(2255),KM算法,最大权匹配
查看>>
Tinkoff Challenge - Final Round (ABC)
查看>>
CentOS环境下通过YUM安装软件,搭建lnmp环境
查看>>
使用ODP.NET一次执行多句SQL语句
查看>>
python 10.19作业
查看>>
groupby以后取每组前n行
查看>>
第二十一课:js属性操作的兼容性问题
查看>>
【学习Android NDK开发】Primitive Types Map(基本类型映射)
查看>>
选择问题(第k小元素)(分治法)
查看>>
POJ3438 ZOJ2886 UVALive3822 Look and Say【数列】
查看>>
深度残差网络
查看>>
iOS7默认状态栏文字颜色为黑色,项目需要修改为白色。
查看>>
c链表
查看>>
(七)jQuery中的DOM操作
查看>>