OStack程序员社区-中国程序员成长平台

标题: ios - 在 NSURLSession 中发布 json 字符串 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 03:38
标题: ios - 在 NSURLSession 中发布 json 字符串

在我的 iOS 应用程序中,我使用这样的 NSURLConnection 将 json 字符串发布到服务器。

    post_string = @"{"function":"getHuddleDetails", "parameters": {"user_id": "167","location_id": "71","huddle_id": "328","checkin_id": "1287"},"token":""}"


  -(void)myServerRequestsNSString *)post_string{


    NSData *postData = [post_string dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    NSString *postLength = [NSString stringWithFormat"%d", [postData length]];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString"http://www.myServerURl.com/jsonpost"]];
    [request setTimeoutInterval:100];

    [request setHTTPMethod"OST"];
    [request setValue:postLength forHTTPHeaderField"Content-Length"];
    [request setValue"application/x-www-form-urlencoded;charset=UTF-8" forHTTPHeaderField"Content-Type"];
    [request setHTTPBody:postData];

    conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    if (conn) {
        webData = [[NSMutableData alloc]init];
    }

   }

并使用以下代码使用 NSURLSession 发布 multipart/form-data(不是 JSON)

 -(void)myFunctionNSString *)user_name paswdNSString *)pass_word {

   NSString *boundary = [self boundaryString];
   NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString"http://www.myServerURl.com/formpost"]];
   [request setHTTPMethod"OST"];
   [request addValue:[NSString stringWithFormat"multipart/form-data; boundary=%@",boundary] forHTTPHeaderField"Content-Type"];



   NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
   NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];

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




   [postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"username\"\r\n\r\n%@", user_name] dataUsingEncoding:NSUTF8StringEncoding]];
   [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];


    [postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"password\"\r\n\r\n%@", pass_word] dataUsingEncoding:NSUTF8StringEncoding]];
   [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

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




     NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromData:postbody completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    NSAssert(!error, @"%s: uploadTaskWithRequest error: %@", __FUNCTION__, error);


      NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] ;



    }];
    [task resume];
  }

这对 NSURLSession 非常有效,但是当我尝试发布 json 字符串(将其转换为 NSDATA 并使用 NSURLSession 发布)时,它不起作用。

为什么会这样? 提前致谢



Best Answer-推荐答案


如果您想将 JSON 发送到服务器,您应该将内容类型相应地设置为 application/json,而您的内容实际上就是这样:最好以 UTF-8 编码的 JSON。

在您的方法 myServerRequests: 中,您设置了内容类型 application/x-www-form-urlencoded - 但您没有正确设置相应的内容。如何做到这一点可以在这里阅读:URL-encoded form data .此外,指定字符集参数完全没有效果。

如果您想为 application/x-www-form-urlencoded 内容类型发送字符串参数,您也不应该使用有损转换。而是使用 UTF-8。请注意,NSStrings length 返回 UTF-16 代码点的数量 - 这与 UTF-8 编码字符串的字节数不同。

回顾:

不要使用 application/x-www-form-urlencoded 内容类型。而是:

Content-Type = application/json

Content-Length =

当您解决这些问题时,请求应该是正常的。

当使用 multipart/form-data 请求时,我强烈建议使用网络库。手动执行此操作太容易出错,您需要阅读至少 300 份 RFC 才能知道您的操作是否正确;)

关于ios - 在 NSURLSession 中发布 json 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27022520/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4