Objective-Cでmultipart/form-data形式でPOSTする

せっかく作ったけど、残念ながら使わなそう。
Randomクラスは前回作った物。
 

使い方

// multipart
Multipart *multi = [[Multipart alloc] init];
[multi addString:@"aaaaaaaaaaaaaaaaaaaa" forKey:@"aaa"];
[multi addString:@"bbbbbbbbbbbbbbbbbbbb" forKey:@"bbb"];
[multi addString:@"cccccccccccccccccccc" forKey:@"ccc"];

// http
NSURL *url = [NSURL URLWithString:@"http://example.com/"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
NSData *body = [multi body];
NSLog(@"body length: %d", [body length]);

[request setHTTPMethod:@"POST"];
[request setCachePolicy:NSURLRequestUseProtocolCachePolicy];
[request setTimeoutInterval:10.0];
[request setHTTPBody:body];
[request setValue:[NSString stringWithFormat:@"%d", [body length]] forHTTPHeaderField:@"Content-Length"];
[request setValue:[multi contentType] forHTTPHeaderField:@"Content-Type"];

NSURLResponse *response;
NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
NSLog(@"result: %@", result);

[request release];
[multi release];

 

ソース

Multipart.h
#import <Foundation/Foundation.h>


@interface Multipart : NSObject {
	NSString *bound;
	NSMutableDictionary *items;
}

- (void)addData:(NSData *)data forKey:(NSString *)key;
- (void)addString:(NSString *)string forKey:(NSString *)key;

- (BOOL)hasItems;
- (NSString *)contentType;
- (NSData *)body;

@end

 

Multipart.m
#import "Multipart.h"
#import "Random.h"


@implementation Multipart

- (id)init
{
	self = [super init];
	if (self) {
		items = [[NSMutableDictionary alloc] init];
		bound = [[Random randAsciiString:32] retain];
	}
	return self;
}

// Data追加
- (void)addData:(NSData *)data forKey:(NSString *)key
{
	[items setObject:data forKey:key];
}

// String追加
- (void)addString:(NSString *)string forKey:(NSString *)key
{
	[self addData:[string dataUsingEncoding:NSUTF8StringEncoding] forKey:key];
}

// itemが1個以上あるか
- (BOOL)hasItems
{
	return 0<[items count];
}

// ContentType取得
- (NSString *)contentType
{
	return [NSString stringWithFormat:@"multipart/form-data; boundary=%@", bound];
}

// PostBody取得
- (NSData *)body
{
	NSMutableData *data = [NSMutableData data];
	for (id key in items) {
		NSData *value = [items objectForKey:key];
		[data appendData:[[NSString stringWithFormat:@"--%@\r\n", bound] dataUsingEncoding:NSUTF8StringEncoding]];
		[data appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]];
		[data appendData:[[NSString stringWithFormat:@"Content-Length: %d\r\n", [value length]] dataUsingEncoding:NSUTF8StringEncoding]];
		[data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
		[data appendData:value];
		[data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
	}
	[data appendData:[[NSString stringWithFormat:@"--%@--\r\n", bound] dataUsingEncoding:NSUTF8StringEncoding]];
	return data;
}

- (void)dealloc
{
	[bound release];
	[items release];
    [super dealloc];
}

@end