2017-01-01 40 views
2

我在我的项目中使用了swiftyJSON,当我使用php创建的API时,它在项目中工作正常,但是当我在项目中使用C#创建的API时,它会给出null作为响应。 我在网上搜索,我得到你可以在你的项目中使用它。如何在Swift中使用.net(C#创建的API)。我可以使用它吗?

这里是代码

let url: NSURL = NSURL(string: "http://compareit.unitechecom.com/AndroidClass/API/login.aspx?Mobile_Number=8523697888&Password=123")! // Enter URL Here 

     let request:NSMutableURLRequest = NSMutableURLRequest(url:url as URL) 
     //let bodyData = "employeeVerify & employeeID=\(empID)"// Pass parameter Form Here. 
     // print(bodyData) 
     request.httpMethod = "GET" 
     //request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding); 

     print(request) 
     let task = URLSession.shared.dataTask(with: request as URLRequest) 
     { 

      data, response, error in 

      if error != nil 
      { 

       print("error=\(error)") 
       return 
      } 
      // You can print out response object 
      print("response = \(response)") 


      do { 
       let json = JSON(data: data!) 

       print(json) 

      } 
       } 

     task.resume() 

究竟是什么解决方案?我可以使用它吗?

回答

1

回答你的问题,是的,你可以从Swift调用你的C#,ASP.NET web服务。这就是Web服务的美妙之处,只要请求和响应格式正确,客户端和服务器代码中使用的相应技术就完全相互独立。

话虽如此,有几个问题在这里:

  1. 如果response(该)为nil,则error不会nil。看看错误是什么,并采取相应的行动。

    例如,如果您未更新Info.plist接受不安全的请求(即没有0​​的请求),则会发生错误。但是你可以将以下条目添加到您的plist:

    https://www.dropbox.com/s/2q0r8nhx8lxr6dm/Screenshot%202017-01-01%2017.45.37.png?dl=0

  2. 说了这么多,我怀疑是网络响应可能没有失败(即response的对象,本身不是nil) ,而是JSON解析失败,但是您没有捕获JSON解析错误。

    对于名为SwiftyJSON的库来说,具有讽刺意味的是,它捕获错误的方式是独一无二的。要捕获错误,您必须致电JSON()初始化程序,并提供error参数。因此,在SwiftyJSON的当前版本,你会做这样的事情:

    func performGetRequest(completionHandler: @escaping (JSON?, Error?) -> Void) { 
        let url = URL(string: "http://compareit.unitechecom.com/AndroidClass/API/login.aspx?Mobile_Number=8523697888&Password=123")! 
    
        var request = URLRequest(url: url) 
        request.httpMethod = "GET" 
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
        request.setValue("application/json", forHTTPHeaderField: "Accept") 
    
        let task = URLSession.shared.dataTask(with: request) { data, response, error in 
         guard let data = data, error == nil else { 
          completionHandler(nil, error) 
          return 
         } 
    
         var error: NSError? 
         let json = JSON(data: data, options: [], error: &error) 
         completionHandler(json, error) 
        } 
    
        task.resume() 
    } 
    

    ,然后调用它像这样:

    performGetRequest() { json, error in 
        guard let json = json, error == nil else { 
         print("error = \(error)") 
         return 
        } 
    
        print("\(json)") 
    } 
    

    如果你这样做,你会看到它报告:

    误差=可选(错误域= NSCocoaErrorDomain代码= 3840 “垃圾在端。” 的UserInfo = {在端NSDebugDescription =垃圾。})

    看着由Web服务返回的data的内容,问题是显而易见的:

    [{"success":"1","Id":"5","FirstName":"admin","LastName":"admin","Email":"[email protected]","Password":"123","Mobile_Number":"8523697888"}] 
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head><title> 
    
    </title></head> 
    <body> 
        <form method="post" action="./login.aspx" id="form1"> 
    <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="dLzeSuX8RwkzsXsmp+fPMkjIu69T9SDFeB24ER3qTQYwmIJB0b8hk32gWHwKrHiE2deVYOcUhwor5igxXXPwUh/uQ+FoE26gCWjolkMFgpg=" /> 
    
    <input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="45AB9188" /> 
        <div> 
    
        </div> 
        </form> 
    </body> 
    </html> 
    

    正如你所看到的,您的Web服务正在恢复不仅JSON,但HTML,太。您需要修复您的Web服务才能返回JSON。


说到所有这一切,有几个,在很大程度上不相关的意见:

  • 如上我的例子所示,一个公形成的请求通常会指定某些标题,即Content-Type(告诉Web服务如何构建您的请求)和Accept(以期望响应正文的形式告知Web服务)。这些在技术上并不需要,但(a)这是最佳做法;和(b)取决于你如何编写你的Web服务,它可能需要它。在这种情况下不是这样,但是在编写C#ASP.NET Web API时,它通常可以默认发送XML响应,除非客户端请求明确请求Accept标头中的JSON。

  • 另请注意,在我上面的示例中,我没有使用NSURLNSURLRequestNSMutableURLRequest。我直接使用URLURLRequest

  • 请注意,在URL中发送密码并不是一个好习惯。这并不像人们想象的那样安全。你想把它放在请求的主体中,而不是URL。因此,你可能想使用POST请求(然后改变你的服务器使用https,而不是http):

    func performPostRequest(completionHandler: @escaping (JSON?, Error?) -> Void) { 
        let url = URL(string: "http://compareit.unitechecom.com/AndroidClass/API/login.aspx")! // Enter URL Here 
    
        var request = URLRequest(url: url) 
        request.httpMethod = "POST" 
        request.httpBody = "Mobile_Number=8523697888&Password=123".data(using: .utf8) 
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
        request.setValue("application/json", forHTTPHeaderField: "Accept") 
    
        let task = URLSession.shared.dataTask(with: request) { data, response, error in 
         guard let data = data, error == nil else { 
          completionHandler(nil, error) 
          return 
         } 
    
         var error: NSError? 
         let json = JSON(data: data, options: [], error: &error) 
         completionHandler(json, error) 
        } 
    
        task.resume() 
    } 
    
  • 另外值得一提的是,虽然我没有做过上面,准备这些时请求,如果它们包含任何保留字符,则实际上应该百分比转义这些字段值。一个例子见https://stackoverflow.com/a/41092318/1271826

    另外,在您注释掉的httpBody中,有空格,但在正确的x-www-form-urlencoded请求中,您应该没有空格。

  • 正如您所看到的,除了服务器代码问题之外,还有与您的客户端代码相关的问题。要做好所有这些并不难,你可能会考虑使用像Alamofire这样的库,这样做会更容易一些。

    +0

    所以基本上我的API给了我错误的答案。所以,我必须建议我的API创建者。 @Rob –

    +1

    @DhruvKhatri - 是的,API给你错误的答案,但你也写了代码,无法检测/处理错误。告诉API创建者,响应不仅发送预期的JSON,而且之后还发送HTML。只要向任何有经验的Web服务开发人员展示了响应的样子(上面第2点结尾处的JSON/HTML),他们可能会感到震惊,并立即知道如何解决它。 – Rob

    +0

    非常感谢@ Rob –

    相关问题