iphone - 如何通过 HTTP post 将数据字节发送到 .NET 服务器

标签 iphone .net ios

将表单的加密类型设置为“multipart/form-data”会导致网络服务抛出异常。

System.InvalidOperationException:请求格式无效:multipart/form-data;边界=---.....

我需要将 HTML 表单直接发布到网络服务,它不能由 .NET 服务器托管。

任何想法...

提前致谢。

最佳答案

请引用RFC 1867了解多部分协议(protocol)的含义。 您需要手工制作多部分“装饰”,此代码可能会有所帮助:

-(NSData *)makeMultipartDataWithBoundary:(NSString *) boundary 
                              parameters:(NSDictionary *)parameters
                                formName:(NSString *)formName 
                                fileName:(NSString *)fileName 
                                fileType:(NSString *)fileType
                                fileData:(NSData*)fileData
{    
    NSMutableString * res = [NSMutableString stringWithFormat:@"--%@\r\n", boundary];

    for(NSString * key in [parameters allKeys]){

        NSString * value = [parameters objectForKey:key];

        if(![value isMemberOfClass:[NSString class]]) continue;

        [res appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n", key];
        [res appendFormat:@"\r\n%@\r\n", value];
        [res appendFormat:@"--%@\r\n", boundary];
    }
    [res appendFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", formName, fileName];
    [res appendFormat:@"Content-Type: %@\r\n\r\n", fileType];

    NSMutableData * data= [NSMutableData data];

    NSLog(@"%@", res);

    [data appendData:[res dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:fileData];
    [data appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];


    return data;
}

哪里:

boundary 是一个 NSString(字节序列),它不会出现在 fileData 部分。例如'D33pN16h7abcd'

parameters 是一个字典,包含要传递给多部分协议(protocol)的所有 header 参数。

formName 是一个标识符。

fileType 是 mime 文件类型,例如'图像/png'

最后fileData是文件内容的字节。

下一行显示了调用此方法的示例:

- (void) sendAllData {
    NSData *data;

    data = [self makeMultipartDataWithBoundary:kBoundary 
                                    parameters:nil 
                                      formName:@"imageField"                              fileName:@"imageExample.png" 
                                      fileType:@"image/png" 
                                      fileData:self.imageData];
    // Make a post NSURLConnection request with the data  

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.example.org/file.php"] 
                                                           cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
                                                       timeoutInterval:60.0]; 
    [request setHTTPMethod:@"POST"]; 
    [request setHTTPBody:data]; 
    [request addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", kBoundary] forHTTPHeaderField:@"Content-Type"]

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    if (connection) { 
        receivedData = [[NSMutableData data] retain]; 
    } 
}

希望对您有所帮助! :)

关于iphone - 如何通过 HTTP post 将数据字节发送到 .NET 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7967832/

相关文章:

ios - 如何创建一个简单的AVPlayer流媒体应用程序?

ios - 如何执行等待动画完成的锁?

ios - 如何在 iOS 应用程序(Swift)中单击选项卡栏项目时重定向到 rootviewcontroller

ios - 线程 1 : signal SIGABRT (Tried prev solutions)

.net - swapExactTokensForETHSupportingFeeOnTransferTokens 有一个路径参数,我知道我必须首先放置代币的合约地址

c# - 使用事件处理程序作为 "reusable code"是不好的做法吗?

iphone - 来自 NSFetchedResults objectAtIndex :0 returning 0

iphone - 简单的核心数据示例应用程序?

iphone - SearchDisplayControler、UILabel选择后堆叠

c# - 在 .NET Core App 1.0.0 项目中引用 Framework 4.6 库