如何读取 GCDWebServer POST 请求的表单 body
How to read form body of a GCDWebServer POST request
我很难相信这是如此困难,但在花了几个小时试图弄明白之后,我在这里向蜂群思维寻求帮助!
我的问题与 的问题非常相似,但是其中的答案对我没有帮助,因为我的表单中没有密钥。我基本上想将文本 .plist 文件从 PC 发送到我的应用程序。页面上的HTML是这个..
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" id="config" name="config" accept=".plist" size=40>
<input type="submit">
</form>
这提供了一个非常简单的表单,其中包含一个选择文件按钮和一个提交按钮。我已经通过 Wireshark 确认该文件已附加到表单,并且该文件已 POSTed 到我的应用程序中的 GCDWebServer。我还可以看到以下确认 body 数据,因为文件上传是由网络服务器处理的:
[DEBUG] Connection on socket 21 preflighting request "POST /upload" with 2045 bytes body
[DEBUG] Connection on socket 21 processing request "POST /upload" with 2045 bytes body
我的POST处理文件的方法是这样的:
[_webServer addHandlerForMethod:@"POST"
path:@"/upload"
requestClass:[GCDWebServerRequest class]
processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
NSString *type = [(GCDWebServerRequest*)request contentType];
NSInteger length = [(GCDWebServerRequest*)request contentLength];
BOOL hasBody = [(GCDWebServerRequest*)request hasBody];
NSString *description = [(GCDWebServerURLEncodedFormRequest*)request description];
NSLog(@"\r\nType: %@\nLength: %lu\nHas Body: %@\nHeaders: %@\nConfig: %@", type, length, hasBody?@"YES":@"NO", description, @"");
return [GCDWebServerDataResponse responseWithHTML:@"TODO UPLOADED CONFIRMATION"];
}];
我可以获得内容类型、内容长度、附有 body 的布尔确认、所有 headers 和边界描述等。但我一辈子都做不到弄清楚如何获得实际的 body 内容。我不想将它保存为文件,我只是想将它保存为 NSString,这样我就可以解析它,然后将设置保存在我的应用程序中。
我试过的一些东西:
//NSData *data = [(GCDWebServerRequest*)request data];
//NSString *config = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
//NSString *config = [(GCDWebServerMultiPartFormRequest*)request files];
//NSString *config = [[(GCDWebServerURLEncodedFormRequest*)request arguments] objectForKey:@"filename"];
我认为 NSData 最有可能,但调用它时应用程序崩溃了。如果有人知道我如何访问此发布内容的 body,我将不胜感激!
提前致谢!
等离子
您需要使用 GCDWebServerMultiPartFormRequest
。 https://github.com/swisspol/GCDWebServer/blob/master/Mac/main.m#L257.
中有一个示例
我很难相信这是如此困难,但在花了几个小时试图弄明白之后,我在这里向蜂群思维寻求帮助!
我的问题与
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" id="config" name="config" accept=".plist" size=40>
<input type="submit">
</form>
这提供了一个非常简单的表单,其中包含一个选择文件按钮和一个提交按钮。我已经通过 Wireshark 确认该文件已附加到表单,并且该文件已 POSTed 到我的应用程序中的 GCDWebServer。我还可以看到以下确认 body 数据,因为文件上传是由网络服务器处理的:
[DEBUG] Connection on socket 21 preflighting request "POST /upload" with 2045 bytes body
[DEBUG] Connection on socket 21 processing request "POST /upload" with 2045 bytes body
我的POST处理文件的方法是这样的:
[_webServer addHandlerForMethod:@"POST"
path:@"/upload"
requestClass:[GCDWebServerRequest class]
processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {
NSString *type = [(GCDWebServerRequest*)request contentType];
NSInteger length = [(GCDWebServerRequest*)request contentLength];
BOOL hasBody = [(GCDWebServerRequest*)request hasBody];
NSString *description = [(GCDWebServerURLEncodedFormRequest*)request description];
NSLog(@"\r\nType: %@\nLength: %lu\nHas Body: %@\nHeaders: %@\nConfig: %@", type, length, hasBody?@"YES":@"NO", description, @"");
return [GCDWebServerDataResponse responseWithHTML:@"TODO UPLOADED CONFIRMATION"];
}];
我可以获得内容类型、内容长度、附有 body 的布尔确认、所有 headers 和边界描述等。但我一辈子都做不到弄清楚如何获得实际的 body 内容。我不想将它保存为文件,我只是想将它保存为 NSString,这样我就可以解析它,然后将设置保存在我的应用程序中。
我试过的一些东西:
//NSData *data = [(GCDWebServerRequest*)request data];
//NSString *config = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
//NSString *config = [(GCDWebServerMultiPartFormRequest*)request files];
//NSString *config = [[(GCDWebServerURLEncodedFormRequest*)request arguments] objectForKey:@"filename"];
我认为 NSData 最有可能,但调用它时应用程序崩溃了。如果有人知道我如何访问此发布内容的 body,我将不胜感激!
提前致谢!
等离子
您需要使用 GCDWebServerMultiPartFormRequest
。 https://github.com/swisspol/GCDWebServer/blob/master/Mac/main.m#L257.