【发布时间】:2018-07-24 05:07:17
【问题描述】:
这是我的请求正文
[
{
"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 bytes]: unrecognized selector sent to instance 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 对象。
谢谢
【问题讨论】:
-
我不建议使用
NSURLConnection(已弃用),也不建议使用sendSynchronousRequest:,因为它是同步的,因此会阻塞。请改用NSURLSession。关于您的问题,您知道哪条线路导致崩溃吗?因为在某些时候,您的代码认为它正在操作NSData对象,而实际上它是NSMutableArray,这会导致崩溃和错误消息。这是您的工作:始终尝试找出问题所在。 -
现在,有两个问题:
[requestURL setHTTPBody:parameter];。Parameter需要是NSData对象(与错误一致)。 XCode 甚至不会向您发出警告吗?如果parameter是NS(Mutable)Dictionary也不是NS(Mutable)Array,则不能这样做。我不知道您的 API 要求/规范,但我猜您需要使用NSJSONSerialization将该参数转换为 JSONNSData:[request setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameter options:0 error:nil]]; -
你不能发送NS类;您需要将它们序列化为数据。尝试转换为 NSData 并发送;最有可能编码 UTF8,但取决于您的服务器
标签: objective-c json nsurlsession restful-url nsurlrequest