如何在 Swift 中使用 .net(C# 创建的 API)?我可以用吗。?
Posted
技术标签:
【中文标题】如何在 Swift 中使用 .net(C# 创建的 API)?我可以用吗。?【英文标题】:How to use .net (C# Created API) in Swift.? can i use it.? 【发布时间】:2017-01-01 10:32:06 【问题描述】:当我使用 php 创建的 API 时,我在项目中使用了 swiftyJSON,它在项目中运行良好,但是当我在项目中使用 C# 创建的 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】:回答您的问题,是的,您可以从 Swift 调用您的 C#、ASP.NET Web 服务。这就是 Web 服务的美妙之处,只要请求和响应的格式正确,客户端和服务器代码中使用的各自技术完全相互独立。
话虽如此,这里有几个问题:
如果response
(URLResponse
)是nil
,那么error
将不是nil
。查看错误是什么并采取相应措施。
例如,如果您没有更新您的 Info.plist
以接受不安全的请求(即那些没有 https://
的请求),则会收到错误消息。但是您可以将以下条目添加到您的 plist 中:
话虽如此,我怀疑网络响应可能没有失败(即response
,URLResponse
对象本身不是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)")
如果你这样做,你会看到它报告:
error = Optional(Error Domain=NSCocoaErrorDomain Code=3840 "Garbage at end." UserInfo=NSDebugDescription=Garbage at end.)
查看你的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。
说了这么多,还有一些基本不相关的观察:
-
1234563形成您期望的响应正文)。这些在技术上不是必需的,但 (a) 最好这样做; (b) 根据您编写 Web 服务的方式,它可能需要它。在这种情况下并非如此,但在编写 C# ASP.NET Web API 时,它通常可以默认发送 XML 响应,除非客户端请求在
Accept
标头中明确请求 JSON。
还要注意,在上面的示例中,我没有使用NSURL
、NSURLRequest
或NSMutableURLRequest
。我直接使用URL
和URLRequest
。
注意,在 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://***.com/a/41092318/1271826。
此外,在您已注释掉的httpBody
中,其中有空格,但在正确的x-www-form-urlencoded
请求中,您应该没有空格。
如您所见,除了您的服务器代码问题之外,还有与您的客户端代码相关的问题。正确地完成所有这些工作并非易事,您可能需要考虑使用像 Alamofire 这样的库,这样会更容易一些。
【讨论】:
所以基本上我的 API 给了我错误的答案。所以我必须建议我的 API Creator 的任何东西。? @Rob @DhruvKhatri - 是的,API 给了您错误的答案,但您还编写了未能检测/处理错误的代码。告诉 API 创建者,响应不仅发送了预期的 JSON,还发送了 HTML。一旦您向任何有经验的 Web 服务开发人员展示响应的样子(上面我第 2 点末尾的 JSON/HTML 组合),他们可能会感到震惊并立即知道如何解决它。 顺便说一句,我向 SwiftyJSON 的作者提到了这种尴尬的解析错误检测,值得称赞的是,他们不仅认识到了这个问题,而且似乎他们已经在进行修复。以向后兼容的方式修复此问题并不容易,因此他们可能会将此更改推迟到库的下一次重大更新。无论如何,请参阅我们在 pull #774 中的讨论。不过,您仍然可以使用上述方法来检测错误,直到更快速的东西被集成到库中。或者直接使用JSONSerialization
,如果你愿意的话。以上是关于如何在 Swift 中使用 .net(C# 创建的 API)?我可以用吗。?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 .net mvc 中使用 c# 创建和删除边缘属性(Titan 1.0)?
如何在 .NET (C#) 中使用 AutoItX 而无需注册
如何在 c# ASP.Net 中使用有效的 JSON 输出创建 JSON WebService 并使用 JQuery/Ajax 进行查询