如何发送带有 HTTP HEADERS 的 PUT 请求和带有 Objective-C 的 FILE?

Posted

技术标签:

【中文标题】如何发送带有 HTTP HEADERS 的 PUT 请求和带有 Objective-C 的 FILE?【英文标题】:How to send PUT request with HTTP HEADERS and a FILE with Objective-C? 【发布时间】:2015-11-26 07:23:41 【问题描述】:

我是 Objective-C 的新手,请让我详细说明我在做什么......

我正在尝试使用 PUT 请求将文件上传到 OneDrive。

PUT 请求必须包含

Http 标头

One Drive Documentation

内容长度7919

内容范围字节 0-7918/7919

并使用这些标头上传文件

PUT https://sn3302.up.1drv.com/up/fe6987415ace7X4e1eF866337
Content-Length: 7919
Content-Range: bytes 0-7918/7919

<bytes 0-7918 of the file>

以下是使用 Chrome POSTMAN 的整个 PUT 请求的屏幕截图

我正在尝试使用以下标头发出 PUT 请求:

还有一个文件

请指导我如何使用 Objective-C 完成上述操作

问题

使用 POSTMAN 一切正常,但是当我尝试使用 Objective-C 时,文件没有上传,我得到以下结果:

"error":"code":"invalidRequest","message":"声明的片段长度 与提供的字节数不匹配"

目标 C 代码

-(void)uploadFile:(NSString*)uploadUrl

    NSString *urlString = uploadUrl;

    NSData* file =  [NSData dataWithContentsOfFile: [@"/Users/username/Desktop/s.sql" stringByExpandingTildeInPath]];

    NSString* fileName = @"s.sql";


//

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:urlString]];
    [request setHTTPMethod:@"PUT"];


    NSString *boundary = @"---------------------------14737809831466499882746641449";
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"];
    [request addValue:@"7919" forHTTPHeaderField: @"Content-Length"];
    [request addValue:@"bytes 0-7918/7919" forHTTPHeaderField: @"Content-Range"];


    NSMutableData *putData = [NSMutableData data];
    [putData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

    // Append the file
    [putData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [putData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"fileupload\"; filename=\"%@\"\r\n", fileName]dataUsingEncoding:NSUTF8StringEncoding]];
    [putData appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [putData appendData:[NSData dataWithData:file]];



    // Close
    [putData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

    // Append
    [request setHTTPBody:putData];


    NSError *err;
    NSURLResponse *response;

    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];

    NSString *resSrt = [[NSString alloc]initWithData:responseData encoding:NSASCIIStringEncoding];



【问题讨论】:

我假设您在这里谈论的是 HTTP 请求? 是的@***foe,你可以在我附加的屏幕截图中看到 只有注意到 URL 方案是 https://。您应该在标题和文本中使其更加明显。我还注意到您在 Postman 和 Objective-C 代码中使用了不同的内容类型。这是为什么呢? 【参考方案1】:

感谢上帝,我终于找到了办法。下面给出的是编辑和工作的代码:

-(void)uploadFile:(NSString*)uploadUrl

    NSString *urlString = uploadUrl;

    NSData* file =  [NSData dataWithContentsOfFile: [@"/Users/username/Desktop/s.sql" stringByExpandingTildeInPath]];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:urlString]];
    [request setHTTPMethod:@"PUT"];


    [request addValue:@"7919" forHTTPHeaderField: @"Content-Length"];
    [request addValue:@"bytes 0-7918/7919" forHTTPHeaderField: @"Content-Range"];


    NSMutableData *putData = [NSMutableData data];
    [putData appendData:[NSData dataWithData:file]];


    // Append
    [request setHTTPBody:putData];


    NSError *err;
    NSURLResponse *response;

    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];

    NSString *resSrt = [[NSString alloc]initWithData:responseData encoding:NSASCIIStringEncoding];
    NSLog(resSrt);

【讨论】:

以上是关于如何发送带有 HTTP HEADERS 的 PUT 请求和带有 Objective-C 的 FILE?的主要内容,如果未能解决你的问题,请参考以下文章

http-headers头

带有空数据的 HTTP PUT 的响应代码

浏览器取消 PUT 请求

如何在 HttpURLConnection 中发送 PUT、DELETE HTTP 请求?

如何在 Ruby 中发送 HTTP PUT 请求?

Python请求,PUT空数据[重复]