2017-06-12 165 views
0

我对Swift非常陌生,在我的应用程序中,我正在尝试执行POST请求。在swift 3中的多个参数的HTTP POST请求

网址看起来像下面

https://example.com/login/auto/uid/5465656/hash/9530cf040a49fba786100a44f913ad25/preset/986tzugh76rtzu00fg

下面是我的代码

let parameters = ["/uid/": "12234353", "/hash/": "9530cf040a49fba786100a44f913ad25", "/preset/":"986tzugh76rtzu00fg"]as Dictionary<String, String> 


    guard let url = URL(string: "https://example.com/login/auto/") else { return } 
    var request = URLRequest(url: url) 
    request.httpMethod = "POST" 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: []) else { return } 
    request.httpBody = httpBody 

    let session = URLSession.shared 
    session.dataTask(with: request) { (data, response, error) in 
     if let response = response { 
      print(response) 
     } 

     if let data = data { 
      do { 
       let json = try JSONSerialization.jsonObject(with: data, options: []) 
       print(json) 
      } catch { 
       print(error) 
      } 
     } 

    }.resume() 

我收到以下错误

错误域= NSCocoaErrorDomain代码= 3840“JSON文本没有从数组或对象开始并选择允许片段未设置的选项。“

任何人都可以帮助我在代码中做错了什么,我怕我没有正确地发送多个参数。

如果可能的话,我会很感激你的答案。

回答

0

此错误可能是因为您的参数中存在重复。字典键应该是独一无二的。

let parameters = ["/uid/": "12234353", "/hash/": "9530cf040a49fba786100a44f913ad25", "/hash/":986tzugh76rtzu00fg]as Dictionary<String, String>你有2个"\hash\"的实例。也输入"/hash/":986tzugh76rtzu00fg]as可能会给你一个错误,因为它应该是String

试试这个代码:

let parameters = ["/uid/": "12234353", "/hash/": "9530cf040a49fba786100a44f913ad25", "/preset/":"986tzugh76rtzu00fg"] as Dictionary<String, String> 

guard let url = URL(string: "https://example.com/login/auto/") else { return } 
var request = URLRequest(url: url) 
request.httpMethod = "POST" 
request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: []) else { return } 
request.httpBody = httpBody 

let session = URLSession.shared 
session.dataTask(with: request) { (data, response, error) in 
    if let response = response { 
     print(response) 
    } 

    if let data = data { 
     do { 
      let json = try JSONSerialization.jsonObject(with: data, options: []) 
      print(json) 
     } catch { 
      print(error) 
     } 
    } 

    }.resume() 
+0

感谢您的答复。我刚刚编辑了我的问题,纠正了重复的参数问题后,我得到了同样的错误。 –

+0

你的'/ preset /'的值不是'String',所以不应该编译。试试这个let参数= [“/ uid /”:“12234353”,“/ hash /”:“9530cf040a49fba786100a44f913ad25”,“/ preset /”:“986tzugh76rtzu00fg”] Dictionary ' –

+0

非常感谢回复,请你看看我的评论上面的其他答案,我真的很感谢一些帮助 –

0

确保httpBody被设置正确。从上面使用你的确切代码我得到了3个错误,我需要修复。在参数

  1. 第二哈希不括在双引号
  2. 你不能有两个键在字典中的相同。所以我不得不删除第二个散列。
  3. 你的逃逸是错误的,“/我不起作用。我删除了所有的斜线。

一旦我这样做,我得到这个作为httpBody,这应该工作。

let parameters = ["uid": "12234353", "hash": "9530cf040a49fba786100a44f913ad25"] as Dictionary<String, String> 

let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: []) 

let string = String(data: httpBody!, encoding: String.Encoding.utf8) 
print(string) 

Optional("{\"hash\":\"9530cf040a49fba786100a44f913ad25\",\"uid\":\"12234353\"}") 

修订基础上,以产生与这些PARAMS,而不是用头一个URL需要下面的对话。用户

let baseUrl = "https://example.com/login/auto" 

let parameters = ["uid": "12234353", "hash": "9530cf040a49fba786100a44f913ad25"] as Dictionary<String, String> 

var queryString = "" 
for (key, value) in parameters { 
    queryString += "/\(key)/\(value)" 
} 
print(queryString) 
// output /hash/9530cf040a49fba786100a44f913ad25/uid/12234353 

print("\(baseUrl)\(queryString)") 
// output https://example.com/login/auto/hash/9530cf040a49fba786100a44f913ad25/uid/12234353 

UPDATE:

为了使动态参数,只需要创建一个空的字典,并添加键和值需要

let baseUrl = "https://example.com/login/auto" 

var parameters = [String:String]() 
parameters["uid"] = "12234353" 
parameters["hash"] = "9530cf040a49fba786100a44f913ad25" 

var queryString = "" 
for (key, value) in parameters { 
    queryString += "/\(key)/\(value)" 
} 

let urlString = "\(baseUrl)\(queryString)" 
let url = URL(string: urlString) 
+0

键中的斜杠字符正在为我工​​作。这似乎不成问题。 –

+0

'“/ uid /”'这里的第一个斜杠是在报价之后? – Scriptable

+0

我修正了Http body的参数,如下让参数= [“uid”:“12234353”,“hash”:“9530cf040a49fba786100a44f913ad25”,“preset”:“c3VybmFtZT1Tb25uYXRpJmdlbmRlcj0xJmVtYWlsPW1hc3NpbW8uc29ubmF0aUB0aW4uaXQ =”] Dictionary 与我之前在我的问题中最初强调的错误一样。 –