gpt4 book ai didi

iphone - 向 NSMutableURLRequest 添加字段

转载 作者:可可西里 更新时间:2023-11-01 06:19:21 25 4
gpt4 key购买 nike

如何将键值对添加到 NSMutableURLRequest 的正文中?我知道我可以使用这样的东西:

NSURL *url = [[NSURL alloc] initWithString:@"http://localhost:8080/upload/"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setHTTPMethod:@"POST"];
NSString *bodyContents = @"fileName=";
[bodyContents stringByAppendingString:fileName];
[bodyContents stringByAppendingString:@"&"];
[bodyContents stringByAppendingString:@"deviceName="];
[bodyContents stringByAppendingString:deviceName];
[bodyContents stringByAppendingString:@"fileContents="];
[bodyContents stringByAppendingString:fileContents];

但这似乎很麻烦,尤其是当我到达需要在请求中提交大量值的位置时。我希望苹果会提供一种方法,例如 [request addBodyField:@"fileName":fileName] 或其他同样有用的方法,但我无法在文档中找到。有没有我遗漏的,或者我应该坚持附加字符串?

最佳答案

这里有很多好的答案。这是我所做的:我构建了一个参数类,负责处理配对语法和 url 编码。

#import "NSString+URLEncoding.h"

@interface UrlParameter ()

@property (strong, nonatomic) NSString *pair;
@property (strong, nonatomic) NSString *encodedPair;

@end

@implementation UrlParameter

@synthesize pair = _pair;
@synthesize encodedPair = _encodedPair;


+ (UrlParameter *)withName:(NSString *)name value:(NSString *)value {

UrlParameter *answer = [[UrlParameter alloc] init];
answer.pair = [NSString stringWithFormat:@"%@=%@", name, value];
answer.encodedPair = [NSString stringWithFormat:@"%@=%@", [name urlEncode], [value urlEncode]];

return answer; // autorelease if non-ARC
}

@end

这依赖于我从几篇文章中拼凑出来的 NSString 类别方法。 (也支持 ARC):

@implementation NSString (URLEncoding)

- (NSString *)urlEncodeUsingEncoding:(CFStringEncoding)encoding {

return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(__bridge CFStringRef)self,
NULL,
CFSTR("!*'();:@&=+$,/?%#[]"),
encoding));
}

- (NSString *)urlEncode {
return [self urlEncodeUsingEncoding:kCFStringEncodingUTF8];
}

@end

我还将 URL 请求子类化并为其提供可变参数数组,然后,在它开始之前,它会执行以下操作:

// in the interface
@property (strong, nonatomic) NSMutableArray *parameters;

- (void)prepareParameters {

NSMutableString *encodedParameterPairs = [NSMutableString stringWithCapacity:256];

int position = 1;
for (UrlParameter *requestParameter in self.parameters) {
[encodedParameterPairs appendString:[requestParameter encodedPair]];
if (position < [self.parameters count]) [encodedParameterPairs appendString:@"&"];
position++;
}

if ([[self HTTPMethod] isEqualToString:@"GET"] || [[self HTTPMethod] isEqualToString:@"DELETE"]) {

NSString *urlString = [NSString stringWithFormat:@"%@?%@", [self URLString], encodedParameterPairs];
[self setURL:[NSURL URLWithString:urlString]];

} else {

// POST, PUT
NSData *postData = [encodedParameterPairs dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
[self setHTTPBody:postData];
[self setValue:[NSString stringWithFormat:@"%d", [postData length]] forHTTPHeaderField:@"Content-Length"];
[self setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
}
}

关于iphone - 向 NSMutableURLRequest 添加字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9831108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com