在ObjC中工作,而不是迅速。什么是错误的,我正在用快速解析JSON解析

在ObjC中工作,而不是迅速。什么是错误的,我正在用快速解析JSON解析

问题描述:

我只是想解析URL中的JSON, 下面的代码写在ObjC中运行良好,给我正确的响应, ,但代码写在swift 3.1中,没有给出正确的响应。 Giving me 500 Internal Error在ObjC中工作,而不是迅速。什么是错误的,我正在用快速解析JSON解析

我在做什么错。 任何人都可以指导。 在此先感谢。

我也尝试使用转换器从ObjC到Swift。 但它失败了一些错误,虽然我解决了这些错误,但仍然没有给出正确的输出。

下面是ObjC代码。

-(void)comparedatainserturl 

{ 
    NSError *error; 
    NSMutableArray *arr=[[NSMutableArray alloc]init]; 
    NSMutableDictionary *dict=[[NSMutableDictionary alloc]init]; 

    [dict setObject:@"e639e129d0f3ab7d" forKey:@"imei_no"]; 
    [dict setObject:@"2017-08-29 12:18:44" forKey:@"current_time"]; 
    [dict setObject:@"0" forKey:@"tbl_offer_details"]; 
    [dict setObject:@"0" forKey:@"tbl_card_type"]; 
    [dict setObject:@"0" forKey:@"tbl_dashboard"]; 
    [dict setObject:@"0" forKey:@"tbl_category_details"]; 
    [dict setObject:@"0" forKey:@"tbl_sub_category_details"]; 
    [dict setObject:@"0" forKey:@"tbl_payment_option"]; 
    [dict setObject:@"0" forKey:@"tbl_payment_option_provider"]; 
    [dict setObject:@"0" forKey:@"tbl_like_favorite_share"]; 
    [dict setObject:@"0" forKey:@"tbl_user_details"]; 

    [arr addObject:dict]; 

    NSLog(@"arra :- %@",[arr description]); 

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arr options:NSJSONWritingPrettyPrinted error:&error]; 
    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 

    NSString *string = [NSString stringWithFormat:@"data=%@",jsonString]; 

    NSLog(@"jsonData as string:\n%@", string); 

    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; 

    NSString *urlString=[NSString stringWithFormat:@"%@",@"http://admin.scontos.com/index.php/Android_api/Offers_download"]; 

    NSURL *url = [NSURL URLWithString:urlString]; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 

    [request setHTTPMethod: @"POST"]; 

    [request setHTTPBody: data]; 

    NSError *err; 

    NSURLResponse *response; 

    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err]; 

    NSString *resSrt = [[NSString alloc]initWithData:responseData encoding:NSASCIIStringEncoding]; 

    NSLog(@"gotresponsestring=%@", resSrt); 
} 

低于银行代码,

func comparedatainserturl() { 


     var arrayParams : NSDictionary = [:] 

     arrayParams = ["imei_no":"e639e129d0f3ab7d","current_time":"2017-08-2911:08:26","tbl_offer_details":"0","tbl_card_type":"0","tbl_dashboard":"0","tbl_category_details":"0","tbl_sub_category_details":"0","tbl_payment_option":"0","tbl_payment_option_provider":"0","tbl_like_favorite_share":"0","tbl_user_details":"0"] 

     print(arrayParams) 

     let valueArr : Array = [arrayParams] 
     print(valueArr) 

     let jsonData: Data? = try! JSONSerialization.data(withJSONObject: valueArr, options: .prettyPrinted) 

     let jsonString = String(data: jsonData!, encoding: String.Encoding.utf8) 
     let string: String = "data=\(jsonString)" 
     print("jsonData as string:\n\(string)") 
     let dataa: Data? = string.data(using: String.Encoding.utf8) 

     var _: NSError? 
     let url1:URL = URL(string:"http://admin.scontos.com/index.php/Android_api/Offers_download")! 
     let request:NSMutableURLRequest = NSMutableURLRequest(url: url1) 
     request.httpMethod = "POST" 

     request.httpBody = dataa 

     var response: URLResponse? 

     do{ 
      let urlData: Data? = try NSURLConnection.sendSynchronousRequest(request as URLRequest, returning:&response) 


      let resstr = NSString(data: urlData!, encoding: String.Encoding.utf8.rawValue) 
      print("Response is \(resstr! as String)") 

     }catch{ 
      print(error) 
     } 

    } 
+2

你尝试过什么基本的调试策略? –

+1

顺便说一句,我建议不要使用ObjC - > Swift转换器,如果可能的话。它们会生成直接翻译,这会导致代码非常糟糕。就像期待Google Translate将一首法语诗一样转换成英文。当然,所有的单词都会在那里,但它会是一首可怕的诗。 – Rob

+0

你的网址是否有效?因为我收到了一些数据库错误。 –

在您的swift代码中,您将追加以下字符串。

let jsonString = String(data: jsonData!, encoding: String.Encoding.utf8) /在以下代码行中,您将使用可选关键字和可选值附加JsonString并使用此“()”。所以,你需要解开的可选值/

let string: String = "data=\(jsonString!)"

您的代码发送,有效地看起来像一个请求的身体:

data=[ 
    { 
    "key1" : "value1", 
    "key2" : "value2", ... 
    } 
] 

这是不正确。

  • 如果您的服务器期待只是JSON,你应该发送JSON而不data=前缀。

  • 如果您的服务器期待application/x-www-form-urlencoded请求,那么该值不能包含空格,换行符或其他任何保留字符。在这种情况下,您必须“百分比转义”请求的正文。

您应该确切地确认Web服务期望的内容,并相应地调整您的代码。


无关,我会退休NS类并留在Swift中。因此,假设你想只发送JSON,代码可能看起来像:

func comparedatainserturl() { 
    let arrayParams = [ 
     [ 
      "imei_no":"e639e129d0f3ab7d", 
      "current_time":"2017-08-2911:08:26", 
      "tbl_offer_details":"0", 
      "tbl_card_type":"0", 
      "tbl_dashboard":"0", 
      "tbl_category_details":"0", 
      "tbl_sub_category_details":"0", 
      "tbl_payment_option":"0", 
      "tbl_payment_option_provider":"0", 
      "tbl_like_favorite_share":"0", 
      "tbl_user_details":"0" 
     ] 
    ] 

    let data = try! JSONSerialization.data(withJSONObject: arrayParams) 

    let jsonString = String(data: data, encoding: .utf8)! 
    let string: String = "data=" + jsonString 
    print("jsonData as string:\n\(string)") 

    let url1 = URL(string:"http://admin.scontos.com/index.php/Android_api/Offers_download")! 
    var request = URLRequest(url: url1) 
    request.httpMethod = "POST"   
    request.httpBody = data 

    let task = URLSession.shared.dataTask(with: request) { data, response, error in 
     if let error = error { 
      print(error) 
      return 
     } 

     guard let data = data else { return } 

     let string = String(data: data, encoding: .utf8) 
     print("response is \(string)") 
    } 
    task.resume() 
} 

或者,如果服务器期待x-www-form-urlencoded要求:

let data = try! JSONSerialization.data(withJSONObject: arrayParams) 

let jsonString = String(data: data, encoding: .utf8)! 
let string: String = "data=" + jsonString.addingPercentEncodingForQuery()! 

let url1 = URL(string:"http://admin.scontos.com/index.php/Android_api/Offers_download")! 
var request = URLRequest(url: url1) 
request.httpMethod = "POST" 
request.httpBody = string.data(using: .utf8) 

如果你使用这个程序,改编自%的逃生Alamofire的escape routine

extension String { 
    public func addingPercentEncodingForQuery() -> String? { 
     let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4 
     let subDelimitersToEncode = "!$&'()*+,;=" 

     var allowed = CharacterSet.urlQueryAllowed 
     allowed.remove(charactersIn: generalDelimitersToEncode + subDelimitersToEncode) 

     return addingPercentEncoding(withAllowedCharacters: allowed) 
    } 
}