这将是一个关于将数据从 iPhone 发送到 MVC 3 函数的问题。
要进入主题,我已经在做什么以及正在做什么,只是为了看看我如何实现连接的风格。
这里我有一个示例 MVC 控制器函数,在我的 IIS 7.0 上运行。
SampleController :控制器
public ActionResult MyFunction(MyObject object) {
ContentResult result = new ContentResult();
result.Content = some content from the server encoded as JSON
return result;
}
在 iPhone 上,我这样称呼这个函数。
NSString *urlString = [NSString stringWithFormat:@"https://%@:%d/%@/%@", _host, _port, Sample, MyFunction];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:json]; // some json encoded object that fits the MyObject from asp.NET
NSURLResponse *response;
NSError *error;
// synchronous so the sample code is shorter
NSData *data = [NSURLConnection sendSynchronousRequest:request
returningResponse:&response
error:&error];
// Do some error handling and http status code stuff and finally the json stuff from the NSData object
所以这些东西一切正常,但现在我正处于令人困惑的地步。我需要上传一个 NSData 对象,其中包含图像数据或其他内容。使用 mulipart/form-data 仅上传文件,如此 SO answer所示。但是当添加一些 url 参数时,它不再起作用了。
________________________________________________________________________________________
所以现在有两个选项可以解决我的问题:
第一种方法是:如果使用这样的函数,NSURLRequest 会是什么样子?或者这甚至可能吗?
public ActionResult MyFunction(MyObject object, byte[] binaryData) {
// Some server stuff ect.
}
或者我将如何使用我的第一个函数构建我的 NSURLRequest 并添加文件附件?
编辑
这是我构建当前文件上传请求的方式。这与我在第二个代码片段中所做的基本相同。
NSString *urlString = [NSString stringWithFormat:@"https://%@:%d/%@/%@", _host, _port, Sample, MyFunction];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:json];
最后是文件附件。注意仅使用不带参数的文件附件时,一切正常,但是是的,参数丢失了。
+ (void)attachFile:(NSData *)fileData withFilename:(NSString *)filename toRequest:(NSMutableURLRequest *)request {
NSString *boundary = @"---------------------------94712889831966399282116247425";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@\"\r\n", filename]
dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:fileData]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
NSData *oldBody = [request HTTPBody];
if (oldBody) {
[body appendData:oldBody];
}
[request setHTTPBody:body];
}
所以我现在的猜测是,缺少参数有一些边界。
笔记
另外,我在后台线程上使用同步 NSURLConnection。
NSURLResponse *response;
NSError *error;
NSData *data = [NSURLConnection sendSynchronousRequest:request
returningResponse:&response
error:&error];