2015-10-06 10 views
13

मैं स्विफ्ट 1.2 उपयोग कर रहा हूँ मेरे iPhone आवेदन को विकसित करने और एक निश्चित बिंदु पर एक http वेब सेवा के साथ संवाद करने मिला ....यूआरएल डिकोड आईओएस स्विफ्ट

प्रतिक्रिया मैं हो रही है (कुंजी क्वेरी स्ट्रिंग स्वरूप में है -वर्त जोड़े) और यूआरएल एनकोड में एनकोडेड।

मैं प्रतिक्रिया प्राप्त कर सकता हूं, लेकिन स्विफ्ट का उपयोग करके डीकोड करने का उचित तरीका देख रहा हूं। लेकिन यह नहीं हटाया है + चिह्न (इनकोडिंग रिक्त स्थान)

:

नमूना प्रतिक्रिया के रूप में इस प्रकार है

status=1&message=The+transaction+for+GBP+12.50+was+successful 

की कोशिश की

// This provides encoded response String 
var responseString = NSString(data: data, encoding: NSUTF8StringEncoding) as! String 
var decodedResponse = responseString.stringByReplacingEscapesUsingEncoding(NSUTF8StringEncoding)! 

समस्या को डिकोड और सर्वर प्रतिक्रिया प्राप्त करने के लिए जिस तरह से पीछा कर रहा है

जावा (एंड्रॉइड) में मैं सफलतापूर्वक डीकोड कर सकता हूं और अपेक्षित प्रतिक्रिया प्राप्त कर सकता हूं जैसे

String responseStr = URLDecoder.decode(responseString, "UTF-8");  

लेकिन आईओएस में स्विफ्ट के साथ यह सीधे आगे नहीं है।

मैं सिर्फ पाया कुछ POSTS समझा समाधान (, की जगह "के साथ" + उपयोग करने से पहले 'stringByReplacingEscapesUsingEncoding' विधि), लेकिन स्विफ्ट में एक विश्वसनीय और एक सीधे आगे रास्ता (भाषा एपीआई विधि) की तलाश में यदि संभव हो तो

संपादन

मैं इसे निम्नानुसार काम कर सकता हूं, लेकिन यदि जावा में उपलब्ध है तो मैं एक भाषा एपीआई विधि की तलाश कर रहा हूं (SWIDT विधि का उपयोग करने से पहले "स्पेस" के साथ "+" जगह को ठीक से एनोड करें

var result = responseString.stringByReplacingOccurrencesOfString("+", withString: " ") 
var decodedResponse = result.stringByReplacingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! 
+0

बाद में स्विफ्ट 2 को अपडेट करने के लिए सबसे अच्छा। और यह वास्तव में कोड के लिए बेहतर और आसान है। – zaph

+0

"' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' को 'स्ट्रिंगब्यरलिंग एस्केपस यूजिंग एन्कोडिंग' विधि का उपयोग करने से पहले" तो समस्या क्या है? ऐसा करो और देखें कि क्या होता है। – matt

+0

@ मैट, हाँ, मैंने इसे किया है और + अंतरिक्ष के साथ बदल दिया गया है। लेकिन सोच रहा है कि क्या कोई अन्य विशेष मामला (जैसे +) हो सकता है और सर्वर को – JibW

उत्तर

3

stringByReplacingEscapesUsingEncoding विधि सही तरीके से व्यवहार कर रही है। "+" वर्ण प्रतिशत-एन्कोडिंग का हिस्सा नहीं है। यह सर्वर गलत तरीके से इसका उपयोग कर रहा है; यह यहां एक प्रतिशत से बचने वाली जगह का उपयोग करना चाहिए (%20)। यदि, किसी विशेष प्रतिक्रिया के लिए, आप रिक्त स्थान चाहते हैं जहां आप "+" वर्ण देखते हैं, तो आपको केवल प्रतिस्थापन करने के द्वारा सर्वर व्यवहार के आसपास काम करना होगा, जैसा कि आप पहले से ही कर रहे हैं।

+0

और यह जवाब यह समझने के लिए देखें कि '+' वास्तव में क्या है: http://stackoverflow.com/a/2700981/341994 – matt

+1

हाय मैट, हाँ, मुझे जवाब में अंतरिक्ष का प्रतिनिधित्व करने के लिए% 20 की बजाय सर्वर का उपयोग + पता है (एन्कोडेड क्वेरी स्ट्रिंग प्रतिक्रिया) ... जावा इस स्थिति को संभालता है और ठीक से डीकोड करता है "URLDecoder.decode (प्रतिक्रिया स्ट्रिंग," यूटीएफ -8 ");" ... मैंने अपने अस्थायी तरीके से इसे मेरे प्रश्न में संपादन के तहत काम करने के लिए जोड़ा है, लेकिन यह देखकर कि क्या कोई सीधी आगे की भाषा एपीआई विधि है जो स्ट्रिंगबियरिंग एस्केपसिंग एन्कोडिंग करने से पहले अंतरिक्ष के साथ + स्थानांतरित करने के बजाय ठीक से डीकोड करने के लिए उपलब्ध है ... क्या आप कह रहे हैं कि स्विफ्ट में उस प्रकार की विधि उपलब्ध नहीं है? – JibW

8

स्विफ्ट 2 और बाद में (Xcode 7)

var s = "aa bb -[:/?&=;[email protected]#$()',*]"; 

let sEncode = s.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet()) 

let sDecode = sEncode?.stringByRemovingPercentEncoding 
34

सांकेतिक शब्दों में बदलना करने के लिए और डिकोड यूआरएल परियोजना में कहीं इस विस्तार बनाने के लिए:

स्विफ्ट 2,0

extension String 
{ 
    func encodeUrl() -> String 
    { 
     return self.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet()) 
    } 
func decodeUrl() -> String 
    { 
     return self.stringByRemovingPercentEncoding 
    } 

} 

स्विफ्ट 3.0

extension String 
    { 
     func encodeUrl() -> String 
     { 
      return self.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed()) 
     } 
    func decodeUrl() -> String 
     { 
      return self.removingPercentEncoding 
     } 

    } 
+0

'जोड़ना पर्सेंट एन्कोडिंग' और 'रिमूइंग पर्सेंट एन्कोडिंग' रिटर्न 'वैकल्पिक' तार तो रिटर्न प्रकार 'स्ट्रिंग' होना चाहिए? – Extragorey

+0

[ऐप्पल की मार्गदर्शिका] से भी आसान (https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/URLLoadingSystem/WorkingwithURLEncoding/WorkingwithURLEncoding.html)। धन्यवाद। –

0

मेरे मामले में, मुझे "+55 11 99 999-5555" जैसे क्वेरी स्ट्रिंग के पैरामीटर में फ़ोन नंबर में एक प्लस ("+") सिग्नल चाहिए। मुझे पता चला कि swift3 (xcode 8।

स्विफ्ट 3,0

_strURL = _strURL.replacingOccurrences(of: "+", with: "%2B") 
0

स्विफ्ट में: 2) एनकोडर सांकेतिक शब्दों में बदलना नहीं है "+" के साथ साथ संकेत है, लेकिन स्थान के रूप में, मैं एनकोड के बाद एक समाधान के लिए अपील करना पड़ा 3

extension URL { 
    var parseQueryString: [String: String] { 
     var results = [String: String]() 

     if let pairs = self.query?.components(separatedBy: "&"), pairs.count > 0 { 
      for pair: String in pairs { 
       if let keyValue = pair.components(separatedBy: "=") as [String]? { 
        results.updateValue(keyValue[1], forKey: keyValue[0]) 
       } 
      } 
     } 
     return results 
    } 
} 

अपने कोड में

नीचे तक पहुँचने के लिए
let parse = url.parseQueryString 
     print("parse \(parse)") 
संबंधित मुद्दे