2017-06-12 237 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 與我之前在我的問題中最初強調的錯誤一樣。 –