快速发布 json 请求
Posted
技术标签:
【中文标题】快速发布 json 请求【英文标题】:post json request in swift 【发布时间】:2015-08-25 10:45:08 【问题描述】:我知道如何发布简单的 json:
// Compose a query string
let postString = “firstName=James&lastName=Bond”;
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding);
现在服务器端需要json格式,如:
"name": "testuser123",
"pass": "testuser123",
"field_shouji":
"und":
[
"value": "15652344931"
]
并且内容类型应该是:application/json。 google了一整天,还是能找到正确的方法。
【问题讨论】:
【参考方案1】:您需要发送有效格式的 JSON。“firstName=James&lastName=Bond”;
不是 JSON 格式。
斯威夫特 4
自从 Swift 3 和 4 Apple 开始删除 NS*
的东西(即使其中许多只是 NS*
的别名),我们将使用更多的 Swift
方式
//Method just to execute request, assuming the response type is string (and not file)
func HTTPsendRequest(request: URLRequest,
callback: @escaping (Error?, String?) -> Void)
let task = URLSession.shared.dataTask(with: request) (data, res, err) in
if (err != nil)
callback(err,nil)
else
callback(nil, String(data: data!, encoding: String.Encoding.utf8))
task.resume()
// post JSON
func HTTPPostJSON(url: String, data: Data,
callback: @escaping (Error?, String?) -> Void)
var request = URLRequest(url: URL(string: url)!)
request.httpMethod = "POST"
request.addValue("application/json",forHTTPHeaderField: "Content-Type")
request.addValue("application/json",forHTTPHeaderField: "Accept")
request.httpBody = data
HTTPsendRequest(request: request, callback: callback)
使用示例
var dict = Dictionary<String, Any>()
dict["username"] = "hello"
dict["password"] = "swift"
let data = try JSONSerialization.data(withJSONObject: dict, options: [])
HTTPPostJSON(url: "http://example.com/login", data: data) (err, result) in
if(err != nil)
print(err!.localizedDescription)
return
print(result ?? "")
斯威夫特
func HTTPsendRequest(request: NSMutableURLRequest,
callback: (String, String?) -> Void)
let task = NSURLSession.sharedSession()
.dataTaskWithRequest(request)
(data, response, error) -> Void in
if (error != nil)
callback("", error.localizedDescription)
else
callback(NSString(data: data,
encoding: NSUTF8StringEncoding)! as String, nil)
task.resume()
func HTTPPostJSON(url: String, data: NSData,
callback: (String, String?) -> Void)
var request = NSMutableURLRequest(URL: NSURL(string: url)!)
request.HTTPMethod = "POST"
request.addValue("application/json",forHTTPHeaderField: "Content-Type")
request.addValue("application/json",forHTTPHeaderField: "Accept")
request.HTTPBody = data
HTTPsendRequest(request, callback: callback)
func HTTPsendRequest(request: NSMutableURLRequest,
callback: (String, String?) -> Void)
let task = NSURLSession.sharedSession()
.dataTaskWithRequest(request)
(data, response, error) -> Void in
if (error != nil)
callback("", error.localizedDescription)
else
callback(NSString(data: data,
encoding: NSUTF8StringEncoding)! as String, nil)
task.resume()
func HTTPPostJSON(url: String, data: NSData,
callback: (String, String?) -> Void)
var request = NSMutableURLRequest(URL: NSURL(string: url)!)
request.HTTPMethod = "POST"
request.addValue("application/json",forHTTPHeaderField: "Content-Type")
request.addValue("application/json",forHTTPHeaderField: "Accept")
request.HTTPBody = data
HTTPsendRequest(request, callback: callback)
使用示例
我们将设置 NSMutableDictionary
并将其转换为 JSON
var json = NSMutableDictionary()
json.setValue("testuser123", forKey: "name"); //set all your values..
let data = NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions(0), error: nil);
HTTPPostJSON("http;..", data:data!) (response, error) -> Void in
println(response);
【讨论】:
【参考方案2】:在上述答案中,应将代码行更改如下
var json = NSDictionary()
代码应更改为
let json = NSMutableDictionary()
因为 NSDictionary() 是不可变的,而 NSMutableDictionary() 是可变的
【讨论】:
以上是关于快速发布 json 请求的主要内容,如果未能解决你的问题,请参考以下文章
快速解析时无法在json post请求参数中添加文本字段输入的文本
python+requests接口自动化2. 发送get请求与post请求(包含json格式的请求)
python+requests接口自动化2. 发送get请求与post请求(包含json格式的请求)