2017-04-01 4 views
2

私はシンプルにGETログインが必要です。ユーザー名はシルバーで、パスワードはです。MOto & @ 10
私はSwiftHttpフレームワークを使ってリクエストを処理しています。ログイン要求を打つと、私は常に偽の応答を得ます。
は、しかし、ブラウザ(サーバーに置き換える実際のドメイン)にログイン要求のURLを打つには私が本当の取得:
https://server/api/check-access/by-login-pass?_key=wlyOF7TM8Y3tn19KUdlq&login=silver&pass=MOto%[email protected]Swiftエンコード&GETパラメーター

パスワードで&をコードしていると間違って何かがあります。私はエンコード率で置き換えましたが。ここに私のコードです:

do {    
    let passwordString = self.convertSpecialCharacters(string: password.text!) 
    print("%@", passwordString) 
    let opt = try HTTP.GET(Constants.kLoginUrl, parameters: ["login": username.text!, "pass": passwordString]) 
    opt.start { response in 
      if let err = response.error { 
       print("error: \(err.localizedDescription)") 
       return 
      } 

      print("opt finished: \(response.description)") 
      self.parseLoginResponse(response.data) 
} 
} catch _ as NSError { 

} 

そして、これはconvertSpecialCharactersです:エンコーディングの

func convertSpecialCharacters(string: String) -> String { 
     var newString = string 

     let arrayEncode = ["&", "<", ">", "\"", "'", "-", "..."] 

     for (escaped_char) in arrayEncode { 
      newString = newString.encode(escaped_char) 
     } 

     return newString 
    } 

拡張子:

extension String { 
     func encode(_ chars: String) -> String 
     { 
      let forbidden = CharacterSet(charactersIn: chars) 
      return self.addingPercentEncoding(withAllowedCharacters: forbidden.inverted) ?? self 
     } 
    } 
+3

は、あなたが一緒にパスワードを送信ログインの目的のために 'GET'を使用しないでください:これは誰かを助け、数時間を節約できます。.. OK

let someUrl = "https://example.com/bla/bla.json" var queryString = "" var index = 0 // dicParam is of type [String: AnyObject] with all needed keys and values for the query for (key, value) in dicParam { let encodedValue = (value as! String).encodeUrl() if index != 0 { queryString.append("&\(key)=\(encodedValue)") } else { queryString.append("?\(key)=\(encodedValue)") } index += 1 } let url = URLComponents(string: someUrl + queryString)! 

希望を非常に「SWIFT」を感じませんが。 http://stackoverflow.com/a/323286/2442804 – luk2302

+0

http://stackoverflow.com/questions/24551816/swift-encode-url – Sulthan

+0

SwiftHTTPの最新のソースを読んでいる限り、適切なエンコード率を'パラメータ'したがって、 'convertSpecialCharacters(string:)'を呼び出すと、パスワードは二重にエンコードされます。 'let passwordString = self.convertSpecialCharacters(string:password.text!)'行を削除し、 '["ログイン ":username.text !," pass ":password.text!]'として 'parameters'を作成します。 '!'は安全です) – OOPer

答えて

2

適切な方法は、すべてのパーセントエンコーディングを処理URLComponentsを使用することです:

var urlComponents = URLComponents(string: "https://server/api/check-access/by-login-pass")! 
let queryItems = [URLQueryItem(name:"_key", value:"wlyOF7TM8Y3tn19KUdlq"), 
        URLQueryItem(name:"login", value:"silver"), 
        URLQueryItem(name:"pass", value:"MOto&@10")] 
urlComponents.queryItems = queryItems 
let url = urlComponents.url 

print(url) // "https://server/api/check-access/by-login-pass?_key=wlyOF7TM8Y3tn19KUdlq&login=silver&pass=MOto%[email protected]" 

PS:luk2302さんのコメントに完全に同意します。

+2

小さな警告である 'URLQueryItem'は%エスケープに' + 'をエンコードしません。それは少し驚くべき '+'として残します。 – Sulthan

0

他のすべてがうまく動作しないと怒ってしまったので、私はGETリクエストの完全なカスタムに行くことに決めました。私は、私たちのサーバーからリストを取得するのと同じように、何か別の要求を使用しました。ログインは、より簡単なPOSTリクエストによって行われます。 GET-要求に固執するただし

、: は、私は「+」と「/」エンコード... まず、私は得ることができませんでした「+」「stringByAddingPercentEncodingWithAllowedCharacters」方式でエンコードされたような文字を必要としていました。 だから私は、文字列のための私自身の拡張を構築しています:

extension String 
{ 
    return CFURLCreateStringByAddingPercentEscapes(
     nil, 
     self as CFString, 
     nil, 
     "!*'();:@&=+$,/?%#[]" as CFString, 
     CFStringBuiltInEncodings.UTF8.rawValue 
    ) as String 
} 

第二ステップは、最終的な要求のために私のURLにこれを追加することでした。 URLQueryItemsを使用してurl.queryまたはurl.queryItemsを使用してURLに追加したいと考えました。悪い驚き:すでに正しくエンコードされた文字列が再びエンコードされ、その中のすべての "%"が "%25"になって無効になりました。 -.-

これで、各エンコードされた値をURLに追加される文字列に追加しました。/

関連する問題