【问题标题】:Error on sending JSON through POST通过 POST 发送 JSON 时出错
【发布时间】:2023-04-06 12:01:01
【问题描述】:

我正在尝试在 POST 中发送 JSON,但我收到一个错误:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项。

如果我通过 Postman(用于测试请求的浏览器应用程序)发送此数据 - 它工作正常(返回数据)

NSString*params = @"{  \"devID\" : \"I:73899EAB-BB4F-4AE5-A691-8505E6AF0C3A\", \"msisdn\": \"+380503424248\"}";

NSURL* url = [NSURL URLWithString:@"https://link.privatbank.ua/dms/gpsMobile/commonSMART/init?app=gpsMobile"];
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";

request.HTTPBody = [params dataUsingEncoding:NSUTF8StringEncoding];


NSURLResponse *response;
NSError *error;
NSData *jsonData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];

NSDictionary *results = jsonData ? [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error] : nil;

【问题讨论】:

  • 您是否在响应请求时收到此错误?
  • 顺便说一句,如果您发送 JSON 请求,约定建议您的请求指定它正在这样做,例如[request setValue:@"application/json" forHTTPHeaderField:@"Content-type"];。有时会编写 Web 服务代码来验证请求的内容类型是否符合预期。
  • 是的!我的代码中有很多错误,但您的帮助很有帮助,我已经纠正了它并得到了正确的请求。

标签: ios json post


【解决方案1】:

您的 JSON 字符串似乎无效。 在\"msisdn\" 和\"+380503424248\" 之间应该是:

NSString*params = @"{\"devID\" : \"I:73899EAB-BB4F-4AE5-A691-8505E6AF0C3A\", \"msisdn\" : \"+380503424248\"}";

【讨论】:

    【解决方案2】:

    您可能想要检查您收到的响应中的jsonData,并确保它实际上是 JSON。因此,正如 Ashutosh 所建议的,您应该检查来自sendSynchronousRequest 的NSError。此外,如果 JSON 解析失败,请检查 NSData 对象:

    NSError *requestError;
    NSURLResponse *response;
    NSData *jsonData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError];
    
    // examine the HTTP status code (if any)
    
    if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
        int statusCode = [(NSHTTPURLResponse *)response statusCode];
        if (statusCode != 200) {
            NSLog(@"%s: sendSynchronousRequest responded with statusCode = %d; expected 200", __PRETTY_FUNCTION__, statusCode);
        }
    }
    
    // examine the `requestError` (if any)
    
    if (!jsonData) {
        NSLog(@"%s: sendSynchronousRequest error = %@", __PRETTY_FUNCTION__, requestError);
    }
    
    // now try to parse the response, reporting the JSON object if successful; reporting the `NSString` representation of the `jsonData` if not
    
    NSError *parseError;
    NSDictionary *results = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&parseError];
    if (results) {
        NSLog(@"%s: JSON parse succeeded; results = %@", __PRETTY_FUNCTION__, results);
    } else {
        NSLog(@"%s: JSON parse failed; parseError = %@"; jsonData = %@", __PRETTY_FUNCTION__, parseError, [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);
    }
    

    有了这样的东西,你就可以准确地诊断出发生了什么。


    正如 VaaChar 观察到的 (+1),您对原始问题的 JSON 请求无效(尽管您随后已修复它)。上面的代码可以帮助您识别该错误,因为您可以准确地看到服务器的响应。

    您可以使用NSJSONSerialization 为您构建它,而不是手动构建您的 JSON,这很容易出现这种简单的错误,以确保您拥有有效的 JSON。因此:

    NSDictionary *params = @{@"devID"  : @"I:73899EAB-BB4F-4AE5-A691-8505E6AF0C3A",
                             @"msisdn" : @"+380503424248"};
    
    NSError *jsonError;
    NSData *body = [NSJSONSerialization dataWithJSONObject:params options:0 error:&jsonError];
    if (!body) {
        NSLog(@"%s: dataWithJSONObject failed: %@", __PRETTY_FUNCTION__, jsonError);
    } else {
        request.HTTPBody = body;
    }
    

    【讨论】:

      【解决方案3】:

      只需尝试将您的params 字符串和URLRequest更改为:

      NSString *params = @"devID=73899EAB-BB4F-4AE5-A691-8505E6AF0C3A&msisdn=+380503424248";
      NSData *postData = [params dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
      [request setValue:postLenght forHTTPHeaderField:@"Content-Lenght"];
      [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
      [request setHTTPShouldHandleCookies:YES];
      [request setHTTPBody:postData];
      

      【讨论】:

      • 这是发送请求的另一种方式,但这显然假定服务器不期待 JSON,正如他在问题中所建议的那样,而是application/x-www-form-urlencoded。这完全取决于他的服务器代码是如何配置的。
      【解决方案4】:

      这段代码可以正常工作:

      NSDictionary *params = @{@"devID"  : [self getUUID],
                               @"msisdn" : [[NSUserDefaults standardUserDefaults] stringForKey:@"phone_number"]};
      
      NSError *jsonError;
      NSData *body = [NSJSONSerialization dataWithJSONObject:params options:0 error:&jsonError];
      
      NSURL* url = [NSURL URLWithString:@"https://link.privatbank.ua/dms/gpsMobile/commonSMART/init?app=gpsMobile"];
      
      request.URL = url;
      request.HTTPMethod = @"POST";
      [request setValue:@"application/json" forHTTPHeaderField:@"Content-type"];  
      request.HTTPBody = body;
      
      NSURLResponse *response;
      NSError *error;
      NSData *jsonData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
      
      NSDictionary *results = jsonData ? [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error] : nil;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-10
        • 1970-01-01
        • 2011-11-16
        • 2016-05-11
        相关资源
        最近更新 更多