Json 如何在Swift中使用.net(C#Created API)。?我能用它吗。?
当我在项目中使用php创建的API时,我在项目中使用了swiftyJSON,它在项目中运行良好,但当我在项目中使用C#created API时,它会给出null作为响应。 我在网上搜索了一下,我发现你们可以在你们的项目中使用它 这是代码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=
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()
}