如何在Swift中使用.net(C#Created API)。我能用吗?

时间:2017-01-01 10:32:07

标签: json swift3 swifty-json

我在我的项目中使用了swiftyJSON,当我使用php创建的API时,它在项目中工作得很好但是当我在我的项目中使用C#Created API时它会给出null作为响应。 我在网上搜索过,我得到了你可以在你的项目中使用它。

这是代码

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 个答案:

答案 0 :(得分:2)

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

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

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

    例如,如果您没有更新Info.plist以接受不安全的请求(即没有https://的请求),则会收到错误消息。但是您可以将以下条目添加到plist中:

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

  2. 话虽如此,我怀疑网络响应可能没有失败(即responseURLResponse对象本身不是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":"admin@gmail.com","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。

  3. 说完所有这些之后,还有一些基本上不相关的观察结果:

    1. 如上面的示例所示,格式正确的请求通常会指定某些标头,即Content-Type(告诉Web服务如何构建您的请求)和Accept(告诉Web服务以您期望的响应主体的形式)。这些技术上并不需要,但(a)最佳做法是这样做; (b)根据您编写Web服务的方式,可能需要它。在这种情况下并非如此,但在编写C#ASP.NET Web API时,除非客户端请求明确请求Accept标头中的JSON,否则它通常可以默认发送XML响应。

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

    3. 请注意,在网址中发送密码不是一种好习惯。这并不像人们想象的那样安全。您希望将其放在请求的正文中,而不是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()
      }
      
    4. 还值得注意的是,虽然我还没有完成上述操作,但在准备这些请求时,如果它们包含任何保留字符,您实际上应该百分之百地逃避这些字段值。有关示例,请参阅https://stackoverflow.com/a/41092318/1271826

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

    5. 如您所见,除了服务器代码问题之外,还存在与客户端代码相关的问题。要正确地完成所有这些操作并非易事,您可能需要考虑使用像Alamofire这样的库来使这更容易。

相关问题