swift 中这个 curl 请求的等效项是什么
what's the equivalent of this curl request in swift
我已经尝试了很多不同的方法来重新创建这个 curl 请求,但我快要疯了。如果有人能提供帮助,我将不胜感激。
curl -H "Content-Type: application/json" -X POST --data '[{"a": 4, "b": 5, "c": 6}]' \ -u username:password \ https://www.mywebsite.com
我最近的尝试是:
let loginString = NSString(format: "%@:%@", username!, password!)
let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)!
let base64LoginString = loginData.base64EncodedStringWithOptions(nil)
var url: NSURL = NSURL(string: "www.mywebsite.com")!
var request: NSMutableURLRequest = NSMutableURLRequest(URL: url)
request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")
request.addValue("text/plain; charset=UTF-8", forHTTPHeaderField: "Content-Type")
request.HTTPMethod = "POST"
let bodyData = JSON(data!).rawString(encoding: NSUTF8StringEncoding, options: NSJSONWritingOptions.allZeros)
request.HTTPBody = bodyData?.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
if let tabBarVC : TabBarController = self.tabBarController as? TabBarController {
println(NSString(data: data, encoding: NSUTF8StringEncoding))
}
}
在此示例中,数据是一个字典 ([String:String]),JSON 是 SwiftyJSON 的形式。
上面发送NSData给服务器,是编码的,服务器不喜欢。请求正在通过,但服务器无法正确读取数据。我需要做什么才能完全复制上面的 curl 请求?我卡住了!
更新以反映下面的良好反应。
我确实尝试使用 application/json 作为内容类型,但是 returns 消息:
{"status": "Internal error JSON uploads must be formatted as an array of objects", "code": 400, "version": "v1"}
如果我使用 text/plain(如上),我得到:
{"status": "Column a is missing", "code": 400, "version": "v1"}
我似乎想不通。
几个想法:
如果不出意外,那一行:
request.addValue("text/plain; charset=UTF-8", forHTTPHeaderField: "Content-Type")
应该是:
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
你的 curl
明确指出内容类型 header 应该是 JSON,所以我会相应地设置它。
另外,那一行说:
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Accept-encoding")
这显然也不正确。我认为您的意思是 Accept
而不是 Accept-encoding
,而且服务器无疑不会以 x-www-form-urlencoded
响应进行响应。
我会简单地删除该行。
您的 URL 缺少方案(http://
),但我认为在编辑您的问题时已将其删除,因为我认为没有它就无法工作那个,但是你向我们保证服务器确实收到了请求。
我建议您考虑使用像 Charles 这样的工具。观察来自 curl
的请求,然后再次观察您的代码。比较和对比并确定它们的不同之处。使用它,您应该能够准确地诊断发生了什么以及差异所在。
你说:
The request is getting through, but the server can't read the data right.
如果问题仍然存在,您应该与我们分享您是如何知道请求正在通过的,以及您所说的 "can't read the data right."
是什么意思
我已经尝试了很多不同的方法来重新创建这个 curl 请求,但我快要疯了。如果有人能提供帮助,我将不胜感激。
curl -H "Content-Type: application/json" -X POST --data '[{"a": 4, "b": 5, "c": 6}]' \ -u username:password \ https://www.mywebsite.com
我最近的尝试是:
let loginString = NSString(format: "%@:%@", username!, password!)
let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)!
let base64LoginString = loginData.base64EncodedStringWithOptions(nil)
var url: NSURL = NSURL(string: "www.mywebsite.com")!
var request: NSMutableURLRequest = NSMutableURLRequest(URL: url)
request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")
request.addValue("text/plain; charset=UTF-8", forHTTPHeaderField: "Content-Type")
request.HTTPMethod = "POST"
let bodyData = JSON(data!).rawString(encoding: NSUTF8StringEncoding, options: NSJSONWritingOptions.allZeros)
request.HTTPBody = bodyData?.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
if let tabBarVC : TabBarController = self.tabBarController as? TabBarController {
println(NSString(data: data, encoding: NSUTF8StringEncoding))
}
}
在此示例中,数据是一个字典 ([String:String]),JSON 是 SwiftyJSON 的形式。
上面发送NSData给服务器,是编码的,服务器不喜欢。请求正在通过,但服务器无法正确读取数据。我需要做什么才能完全复制上面的 curl 请求?我卡住了!
更新以反映下面的良好反应。
我确实尝试使用 application/json 作为内容类型,但是 returns 消息:
{"status": "Internal error JSON uploads must be formatted as an array of objects", "code": 400, "version": "v1"}
如果我使用 text/plain(如上),我得到:
{"status": "Column a is missing", "code": 400, "version": "v1"}
我似乎想不通。
几个想法:
如果不出意外,那一行:
request.addValue("text/plain; charset=UTF-8", forHTTPHeaderField: "Content-Type")
应该是:
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
你的
curl
明确指出内容类型 header 应该是 JSON,所以我会相应地设置它。另外,那一行说:
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Accept-encoding")
这显然也不正确。我认为您的意思是
Accept
而不是Accept-encoding
,而且服务器无疑不会以x-www-form-urlencoded
响应进行响应。我会简单地删除该行。
您的 URL 缺少方案(
http://
),但我认为在编辑您的问题时已将其删除,因为我认为没有它就无法工作那个,但是你向我们保证服务器确实收到了请求。我建议您考虑使用像 Charles 这样的工具。观察来自
curl
的请求,然后再次观察您的代码。比较和对比并确定它们的不同之处。使用它,您应该能够准确地诊断发生了什么以及差异所在。你说:
The request is getting through, but the server can't read the data right.
如果问题仍然存在,您应该与我们分享您是如何知道请求正在通过的,以及您所说的 "can't read the data right."
是什么意思