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

Json 如何在Swift中使用.net(C#Created API)。?我能用它吗。?,json,swift3,swifty-json,Json,Swift3,Swifty Json,当我在项目中使用php创建的API时,我在项目中使用了swiftyJSON,它在项目中运行良好,但当我在项目中使用C#created API时,它会给出null作为响应。 我在网上搜索了一下,我发现你们可以在你们的项目中使用它 这是代码 let url: NSURL = NSURL(string: "http://compareit.unitechecom.com/AndroidClass/API/login.aspx?Mobile_Number=8523697888&Password=

当我在项目中使用php创建的API时,我在项目中使用了swiftyJSON,它在项目中运行良好,但当我在项目中使用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()

解决这个问题的办法是什么。?我可以用它吗?

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

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

  • 如果
    response
    urresponse
    )为
    nil
    ,则
    error
    将不会为
    nil
    。看看错误是什么,并相应地采取行动

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

  • 话虽如此,我怀疑网络响应可能没有失败(即
    响应
    urresponse
    对象本身不是
    nil
    ),而是JSON解析失败,但您没有捕获JSON解析错误

    具有讽刺意味的是,对于一个名为SwiftyJSON的库来说,它捕获错误的方式非常不简洁。要捕获错误,必须使用提供的
    error
    参数调用
    JSON()
    初始值设定项。因此,在当前版本的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)")
    }
    
    如果您这样做,您将看到it报告:

    error=可选(error Domain=NSCocoaErrorDomain Code=3840“末尾的垃圾”。UserInfo={NSDebugDescription=末尾的垃圾。})

    查看web服务返回的
    数据的内容,问题显而易见:

    [{"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>
    
  • 还值得注意的是,虽然我没有在上面做过,但在准备这些请求时,您确实应该对这些字段值进行百分比转义,以防它们包含任何保留字符。有关示例,请参见

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


  • 正如您所看到的,除了服务器代码问题外,还有与客户机代码相关的问题。要正确地完成所有这些操作是不平凡的,你可能需要考虑使用这样的库使这更容易。

    基本上,我的API给了我错误的答案。所以,任何我必须建议我的API创建者的东西@Rob@DhruvKhatri-是的,API给出了错误的答案,但您编写的代码未能检测/处理错误。告诉API创建者,响应不仅发送预期的JSON,而且在此之后还发送HTML。一旦您向任何有经验的web服务开发人员展示响应的样子(上面我的第2点末尾的JSON/HTML组合),他们很可能会感到震惊,并立即知道如何修复它。顺便说一句,我向SwiftyJSON的作者提到了这种笨拙的解析错误检测,值得赞扬的是,他们不仅认识到了这个问题,但他们似乎在工作中找到了解决办法。用向后兼容的方式解决这个问题并不容易,所以他们可能会将此更改推迟到库的下一次主要更新。无论如何,请看我们在pull#中的讨论。不过,您仍然可以使用上述方法来检测错误,直到库中集成了更快速的内容。或者直接使用
    JSONSerialization
    ,如果需要的话。
    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()
    }