Intereting Posts
क्या मुझे xcodeproject / project.pbxproj फ़ाइल को अनदेखा करना चाहिए? AppDelegate का उपयोग किए बिना यूटबबर नियंत्रक प्रोग्राम को कैसे जोड़ें? ऑडियोटूलबॉक्स – रिकॉर्डिंग के दौरान कॉलबैक विलंब iPhone UIImagePickerController Lat / Lng प्राप्त करें दो सरणी दोनों मूल्यों को एक पहले सरणी में वापस लेना स्टोरीबोर्ड में सबव्यूज़ फ़्रेम्स प्राप्त करना AddressDictionary से फ़ॉर्मेट किया गया पता NSString कैसे प्राप्त करें? SRCROOT और PROJECT_DIR के बीच क्या अलग है? MGSplitViewController सभी github पैच के साथ? शरीर के तत्व के लिए स्क्रॉल बाउंस को रोकें, लेकिन इसे आईओएस में डुप्लिकेट में रखने के लिए बाल तत्वों के लिए रखें खाली कस्टम प्रोटोटाइप सेल आईफ़ोन एप्लिकेशन से डिवाइस में दिनांक और समय सेटिंग्स जानने के लिए CFBundleVersion एक से अधिक तीन गैर-नकारात्मक पूर्णांकों की अवधि से अलग सूची होनी चाहिए (चेतावनी आईटीएमएस -9000) कैसे CMIotion प्रबंधक के साथ UIAccelerometer को बदलने के लिए? Google मानचित्र एसडीके आईओएस – ज़ूम पर स्थान बदलने से मानचित्र को रोका जा सकता है

तेज और एपीआई के साथ पोस्ट करें

मेरे पास एक समस्या है जब मैं अपने सर्वर पर अपने एपीआई पर एक पोस्ट अनुरोध भेजने का प्रयास करता हूं, मैंने कई सारे विभिन्न ट्यूटोरियल्स का पालन किया है लेकिन यह अभी भी काम नहीं करता है। मुझे पता है कि मेरी समस्या POST अनुरोध के साथ है, लेकिन मैं इसे हल नहीं कर सकता! तो यह मेरा कोड स्विफ्ट और php में मेरी एपीआई में है: (और हाँ मैंने अपने कोड में असली आईडी द्वारा xxxx को बदल दिया है)

अपमान करने के लिए सर्वर का अनुरोध प्राप्त होता है और उदाहरण के लिए यदि मैं मैन्युअल रूप से एक छद्म प्रविष्ट करता हूं, तो यह वास्तव में POST विधि है जो काम नहीं करता .. सर्वर को POST पैरामीटर प्राप्त नहीं होता है

स्विफ्ट कोड :

var request = NSMutableURLRequest(URL: NSURL(string: "http://localhost:8888/academy/test.php")!) var session = NSURLSession.sharedSession() request.HTTPMethod = "POST" var params = ["pseudo":"test"] as Dictionary<String, String> var err: NSError? request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err) request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue("application/json", forHTTPHeaderField: "Accept") var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in println("Response: \(response)") var strData = NSString(data: data, encoding: NSUTF8StringEncoding) println("Body: \(strData)") var err: NSError? var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSDictionary // Did the JSONObjectWithData constructor return an error? If so, log the error to the console if(err != nil) { println(err!.localizedDescription) let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding) println("Error could not parse JSON: '\(jsonStr)'") } else { // The JSONObjectWithData constructor didn't return an error. But, we should still // check and make sure that json has a value using optional binding. if let parseJSON = json { // Okay, the parsedJSON is here, let's get the value for 'success' out of it var success = parseJSON["success"] as? Int println("Succes: \(success)") } else { // Woa, okay the json object was nil, something went worng. Maybe the server isn't running? let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding) println("Error could not parse JSON: \(jsonStr)") } } }) task.resume()*/ 

PHP कोड:

 $BDD_hote = 'xxxxx'; $BDD_bd = 'xxxxx'; $BDD_utilisateur = 'xxxxx'; $BDD_mot_passe = 'xxxxx'; try{ $bdd = new PDO('mysql:host='.$BDD_hote.';dbname='.$BDD_bd, $BDD_utilisateur, $BDD_mot_passe); $bdd->exec("SET CHARACTER SET utf8"); $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); } catch(PDOException $e){ echo 'Erreur : '.$e->getMessage(); echo 'N° : '.$e->getCode(); } $pseudo = addslashes($_POST["pseudo"]); $req = $bdd->query("SELECT * from users WHERE pseudo='$pseudo'"); $resultArray = array(); $donnees = $req->fetch(); echo json_encode($donnees); 

अग्रिम धन्यवाद 🙂

Solutions Collecting From Web of "तेज और एपीआई के साथ पोस्ट करें"

इसे इस्तेमाल करे:

  let myURL = NSURL(string: "http://localhost:8888/academy/test.php")! let request = NSMutableURLRequest(URL: myURL) request.HTTPMethod = "POST" request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.setValue("application/json", forHTTPHeaderField: "Accept") let bodyStr:String = "pseudo=test" request.HTTPBody = bodyStr.dataUsingEncoding(NSUTF8StringEncoding) let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in // Your completion handler code here } task.resume() 

आपको UTF8 स्ट्रिंग एन्कोडिंग का उपयोग करके अपने डेटा को एन्कोड करना होगा। यदि आपको अनुरोध शरीर के लिए एक से अधिक फ़ील्ड और वैल्यू जोड़े सेट करना है, तो आप शरीर स्ट्रिंग को बदल सकते हैं, उदाहरण के लिए, "छद्म = परीक्षण और भाषा = तेज" वास्तव में, मैं आमतौर पर NSMutableURLRequest के लिए एक एक्सटेंशन बनाता हूं और एक ऐसी विधि जोड़ता हूं जो एक शब्दकोश को पैरामीटर के रूप में लेता है और इस मैप (शब्दकोश) की सामग्री को सही एन्कोडिंग का उपयोग कर HTTPBody के रूप में सेट करता है। यह आपके लिए काम कर सकता है:

  extension NSMutableURLRequest { func setBodyContent(contentMap: Dictionary<String, String>) { var firstOneAdded = false let contentKeys:Array<String> = Array(contentMap.keys) for contentKey in contentKeys { if(!firstOneAdded) { contentBodyAsString += contentKey + "=" + contentMap[contentKey]! firstOneAdded = true } else { contentBodyAsString += "&" + contentKey + "=" + contentMap[contentKey]! } } contentBodyAsString = contentBodyAsString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! self.HTTPBody = contentBodyAsString.dataUsingEncoding(NSUTF8StringEncoding) } } 

और आप इसे इस रूप में उपयोग कर सकते हैं:

 request.setBodyContent(params) 

मैं आशा करता हूं कि इससे तुम्हें सहायता मिलेगी!

जैसा कि दूसरों ने बताया है, अनुरोध का एन्कोडिंग बिल्कुल सही नहीं है आपका सर्वर कोड JSON अनुरोध की अपेक्षा नहीं कर रहा है, बल्कि $_POST चर का उपयोग कर रहा है (जिसका अर्थ है कि अनुरोध में Content-Type application/x-www-form-urlencoded )। तो यही आपको बनाना चाहिए। स्विफ्ट 3 में:

 var request = URLRequest(url: url) request.httpMethod = "POST" let parameters = ["somekey" : "valueforkey"] request.setBodyContent(parameters) request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.addValue("application/json", forHTTPHeaderField: "Accept") let task = session.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { print("\(error?.localizedDescription ?? "Unknown error")") return } // your response parsing code here } task.resume() 

setBodyContent विधि ["key1": "foo", "key2" : "bar"] एक शब्दकोश HTTPBody और कुछ ऐसी HTTPBody साथ HTTPBody को पॉप्यूलेट करेगा जैसे key1=foo&key2=bar यदि आप ऐसा करते हैं, तो सर्वर अनुरोध से $_POST को पार्स करने में सक्षम होगा।

 extension URLRequest { /// Populate the HTTPBody of `application/x-www-form-urlencoded` request /// /// - parameter parameters: A dictionary of keys and values to be added to the request mutating func setBodyContent(_ parameters: [String : String]) { let parameterArray = parameters.map { (key, value) -> String in return "\(key.addingPercentEncodingForQuery()!)=\(value.addingPercentEncodingForQuery()!)" } httpBody = parameterArray.joined(separator: "&").data(using: .utf8) } } 

ध्यान दें, यह भी मूल्यों को प्रतिशत-एन्कोड करता है, जो महत्वपूर्ण है। जबकि अन्य लोगों ने सलाह दी है कि addingPercentEncoding का उपयोग करना होगा, दुख की बात है कि वह नौकरी नहीं करेगा, क्योंकि यह कुछ आरक्षित वर्णों को addingPercentEncoding पास कर देगा। विशेष रूप से, संभावना की स्थिति में, अनुरोध मापदंडों के शब्दकोश के मानों में एक & या + चरित्र शामिल होता है, तो उन्हें उन्हें अनावश्यक पारित कर दिया जाता था (और गलत तरीके से मूल्य को समाप्त करने के रूप में समझा जाएगा और + को एक स्थान के रूप में व्याख्या किया जाएगा) तो आपको यह सुनिश्चित करने के लिए बचने के लिए अपना स्वयं का प्रतिशत करना होगा कि केवल अनारक्षित वर्णों का संकुचित रूप से परिभाषित समूह अनारक्षित छोड़ दिया गया है आप ऐसा कुछ कर सकते हैं:

 extension String { /// Percent escape value to be added to a HTTP request /// /// This percent-escapes all characters besides the alphanumeric character set and "-", ".", "_", and "*". /// This will also replace spaces with the "+" character as outlined in the application/x-www-form-urlencoded spec: /// /// http://www.w3.org/TR/html5/forms.html#application/x-www-form-urlencoded-encoding-algorithm /// /// - returns: Return percent escaped string. func addingPercentEncodingForQuery() -> String? { let allowed = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._* ") return addingPercentEncoding(withAllowedCharacters: allowed)?.replacingOccurrences(of: " ", with: "+") } } 

वैकल्पिक रूप से, आप .urlQueryAllowed साथ शुरू होने वाले अक्षरों के चरित्र सेट को बना सकते हैं, लेकिन आपको अभी भी कुछ वर्णों को निकालना होगा क्योंकि अन्यथा कुछ वर्णों को अबाधित (उदा। + ) https://stackoverflow.com/a/35912606/1271826 देखें।

स्विफ्ट 2 गायन के लिए, इस उत्तर के पिछले संशोधन देखें।

निम्नलिखित php कोड application/url+encode एन्कोडेड एन्कोडेड पोस्ट मेसेज प्राप्त करने के लिए है। कृपया https://en.wikipedia.org/wiki/Percent-encoding देखें

 $_POST["pseudo"] 

और आपकी स्विफ्ट कोड JSON इनकोडेड स्ट्रिंग डेटा भेज रहा था। वे असंगत हैं।

यदि आप php कोड को बदलना नहीं चाहते हैं, स्विफ्ट में आपको यूआरएल-एन्कोड प्रारूप संदेश भेजना चाहिए, ली:

// @ रॉ से सुधार के साथ अद्यतन

  var params = ["param1":"value1", "papam2": "value 2"] var body = "" for (key, value) in params { body = body.stringByAppendingString(key) body = body.stringByAppendingString("=") body = body.stringByAppendingString(value.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!) body = body.stringByAppendingString("&") } body = body.substringToIndex(advance(body.startIndex, countElements(body)-1)) // remove the last "&" request.HTTPBody = body.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)