使用NSURLSession发送POST请求

我正在尝试使用对远程REST API执行POST请求NSURLSession。这个想法是使用两个参数发出请求:deviceId和textContent。


问题是服务器无法识别这些参数。服务器部分正常工作,因为我已经使用POSTMAN发送了适用于Google Chrome的POST,并且工作正常。


这是我现在正在使用的代码:


NSString *deviceID = [[NSUserDefaults standardUserDefaults] objectForKey:@"deviceID"];

NSString *textContent = @"New note";

NSString *noteDataString = [NSString stringWithFormat:@"deviceId=%@&textContent=%@", deviceID, textContent];


NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];

sessionConfiguration.HTTPAdditionalHeaders = @{

                                               @"api-key"       : @"API_KEY",

                                               @"Content-Type"  : @"application/json"

                                               };

NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];

NSURL *url = [NSURL URLWithString:@"http://url_to_manage_post_requests"];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

request.HTTPBody = [noteDataString dataUsingEncoding:NSUTF8StringEncoding];

request.HTTPMethod = @"POST";

NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

    // The server answers with an error because it doesn't receive the params

}];

[postDataTask resume];

我已经尝试了相同的过程NSURLSessionUploadTask:


// ...

NSURL *url = [NSURL URLWithString:@"http://url_to_manage_post_requests"];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

request.HTTPMethod = @"POST";

NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:[noteDataString dataUsingEncoding:NSUTF8StringEncoding] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

    // The server answers with an error because it doesn't receive the params

}];

[uploadTask resume];

有任何想法吗?


素胚勾勒不出你
浏览 954回答 3
3回答

慕娘9325324

我的方法的问题在于,我在发送Content-Type所有请求时都发送了不正确的标头。因此,代码正常运行所需的唯一更改是删除Content-Type = application/jsonHTTP标头。因此正确的代码是这样的:NSString *deviceID = [[NSUserDefaults standardUserDefaults] objectForKey:@"deviceID"];NSString *textContent = @"New note";NSString *noteDataString = [NSString stringWithFormat:@"deviceId=%@&textContent=%@", deviceID, textContent];NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];sessionConfiguration.HTTPAdditionalHeaders = @{                                               @"api-key"       : @"API_KEY"                                               };NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];NSURL *url = [NSURL URLWithString:@"http://url_to_manage_post_requests"];NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];request.HTTPBody = [noteDataString dataUsingEncoding:NSUTF8StringEncoding];request.HTTPMethod = @"POST";NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {    // The server answers with an error because it doesn't receive the params}];[postDataTask resume];发送图像以及其他参数如果您需要使用NSURLSession此处发布图像以及其他参数,请举一个例子:NSString *deviceID = [[NSUserDefaults standardUserDefaults] objectForKey:@"deviceID"];NSString *textContent = @"This is a new note";// Build the request bodyNSString *boundary = @"SportuondoFormBoundary";NSMutableData *body = [NSMutableData data];// Body part for "deviceId" parameter. This is a string.[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", @"deviceId"] dataUsingEncoding:NSUTF8StringEncoding]];[body appendData:[[NSString stringWithFormat:@"%@\r\n", deviceID] dataUsingEncoding:NSUTF8StringEncoding]];// Body part for "textContent" parameter. This is a string.[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", @"textContent"] dataUsingEncoding:NSUTF8StringEncoding]];[body appendData:[[NSString stringWithFormat:@"%@\r\n", textContent] dataUsingEncoding:NSUTF8StringEncoding]];// Body part for the attachament. This is an image.NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"ranking"], 0.6);if (imageData) {    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\n", @"image"] dataUsingEncoding:NSUTF8StringEncoding]];    [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];    [body appendData:imageData];    [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];}[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];// Setup the sessionNSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];sessionConfiguration.HTTPAdditionalHeaders = @{                                               @"api-key"       : @"55e76dc4bbae25b066cb",                                               @"Accept"        : @"application/json",                                               @"Content-Type"  : [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]                                               };// Create the session// We can use the delegate to track upload progressNSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil];// Data uploading task. We could use NSURLSessionUploadTask instead of NSURLSessionDataTask if we needed to support uploads in the backgroundNSURL *url = [NSURL URLWithString:@"URL_TO_UPLOAD_TO"];NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];request.HTTPMethod = @"POST";request.HTTPBody = body;NSURLSessionDataTask *uploadTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {    // Process the response}];[uploadTask resume];

Qyouu

您可以尝试使用NSDictionary作为参数。以下内容会将参数正确发送到JSON服务器。NSError *error;NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];NSURL *url = [NSURL URLWithString:@"[JSON SERVER"];NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy                                                   timeoutInterval:60.0];[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];[request addValue:@"application/json" forHTTPHeaderField:@"Accept"];[request setHTTPMethod:@"POST"];NSDictionary *mapData = [[NSDictionary alloc] initWithObjectsAndKeys: @"TEST IOS", @"name",                     @"IOS TYPE", @"typemap",                     nil];NSData *postData = [NSJSONSerialization dataWithJSONObject:mapData options:0 error:&error];[request setHTTPBody:postData];NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {}];[postDataTask resume];希望这会有所帮助(我正在尝试使用上述方法对CSRF真实性问题进行分类-但它确实在NSDictionary中发送了参数)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS