使用 NSURLRequest 发送 NSMutableDictionary 数据的 NSMutableArray

Send NSMutableArray of NSMutableDictionary data using NSURLRequest

这是我的请求正文

[
    {
    "DealId":677304,
    "CustomerId":328702,
    "CouponQtn":1,
    "PaymentType":"MPD",
    "CustomerMobile":"01670234032",
    "CustomerAlternateMobile":"01670234032",
    "CustomerBillingAddress":"IT test order.......",
    "Sizes":"not selected",
    "Color":"",
    "DeliveryDist":62,
    "CardType":"Manual",
    "OrderFrom":"iOS",
    "MerchantId":14025,
    "OrderSource":"app",
    "AdvPaymentType":0,
    "AdvPayPhoneId":0,
    "deliveryCharge":45,
    "OrderCouponPrice":500

    }

]

我正在尝试在 Restful api 中使用 NSURLRequest 发送 NSMutableDictionary 数据的 NSMutableArray,但我的应用出现异常

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'-[__NSArrayM 字节]:无法识别的选择器发送到实例 0x600000855e40'。

我的解析代码:

    -(NSDictionary*)getDataByPOST:(NSString*)url parameter:(id)parameter{

    NSDictionary *dictionaryData;
    NSDictionary *dic;
    Reachability *reachTest = [Reachability reachabilityWithHostName:@"www.apple.com"];
    NetworkStatus internetStatus = [reachTest  currentReachabilityStatus];
    if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN)){
        dictionaryData = [[NSDictionary alloc] initWithObjectsAndKeys:@"error",@"status",@"No Network",@"message",nil];
        dic = [NSDictionary dictionaryWithObjectsAndKeys:dictionaryData, @"response",nil];
        return dic;
    }

    else{


        NSURL *s =[self getAbsoluteURL:url];
        NSMutableURLRequest *requestURL = [NSMutableURLRequest requestWithURL:s cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:900.00];
        //NSLog(@"%@",requestURL);
        [requestURL setHTTPMethod:@"POST"];


        NSError *error=nil ;
        if ([parameter isKindOfClass : [NSString class]]) {
            [requestURL setHTTPBody:[parameter dataUsingEncoding:NSUTF8StringEncoding]];
        }
        else if([parameter isKindOfClass:[NSDictionary class]]) {
            [requestURL setHTTPBody:parameter];
        }
        else {
            [requestURL setHTTPBody:parameter];
        }
        NSHTTPURLResponse *response;
        NSError *error1=nil;
//        NSLog(@"%@\n\n%@",s,parameter);
        NSData *apiData = [NSURLConnection sendSynchronousRequest:requestURL returningResponse:&response error:&error1];
        if (!apiData) {
            NSLog(@"Error: %@", [error localizedDescription]);
            return NO;
        }

        if (response.statusCode == 0) {

            dictionaryData = [[NSDictionary alloc] initWithObjectsAndKeys:@"error",@"status",@"Server Error",@"message",nil];
            return dic;

        }
        else if(response.statusCode == 404) {
            dictionaryData= [[NSDictionary alloc] initWithObjectsAndKeys:@"error",@"status",@"Server is Currently Down.",@"message", nil];
            return dic;

        }
        else {
            dictionaryData = [NSJSONSerialization JSONObjectWithData:apiData options:0 error:&error];
        }
    }
    return dictionaryData;
}

这是我的 api 调用代码

 tempDic = [apiCom getNodeDataByPOST:CART_ORDER_URL parameter:orderArray];

这里的 orderArray 是 NSMutableArrray 包含 NSMutableDictionary 对象。

谢谢

您遇到错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM bytes]: unrecognized selector sent to instance 0x600000855e40'.

这意味着在您的代码中的某个时刻,您认为您可以在具有它的对象上使用 bytes 方法 (getter),但实际上该对象是 NSMutableArray 一个,并且由于它没有实现 bytes,您的代码因该错误而崩溃。现在,bytes 例如是一个 NSData 方法。我会回来的。

作为开发人员,您需要找到导致崩溃的行。即使您不理解,如果您指出了问题所在,其他人可能会更乐于提供帮助,因为他们可以专注于问题而不是浪费时间查看大量代码以期找到问题所在。即使不是为了别人,也要为你做。 这不是负面评论,这是提示。

罪魁祸首行:

if ([parameter isKindOfClass : [NSString class]]) {
    [requestURL setHTTPBody:[parameter dataUsingEncoding:NSUTF8StringEncoding]];
}
else if([parameter isKindOfClass:[NSDictionary class]]) {
    [requestURL setHTTPBody:parameter];
}
else {
    [requestURL setHTTPBody:parameter];
}

NSMutableURLRequest 的文档:

@property(copy) NSData *HTTPBody;

很明显,如果 parameterNSDictionaryNSArray,您将遇到同样的崩溃,其中之一是:-[__NSDictionary bytes]: unrecognized selector sent to instance(或类似的,与IM 在 class 名称中某处用于 Mutable/Immutable 或 Single 用于优化 Dictionary/Array 等)

现在,这取决于您的 Web 文档 API: 一个常见的用法是使用 JSON:

else if([parameter isKindOfClass:[NSDictionary class]] || [parameter isKindOfClass:[NSArray class]]) {
    [request setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameter options:0 error:nil]];
}

我使用 nil 作为 error,但在失败的情况下检查它的值可能会很有趣。