2015-01-18 34 views
6

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

सर्वर सारांश में अनुरोध प्राप्त होता है और उदाहरण के लिए अगर मैं स्वयं एक में प्रवेश छद्म यह काम करता है, यह वास्तव में 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()*/ 

पीएचपी कोड:

$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); 

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

+1

कृपया "काम नहीं करता" का थोड़ा और विवरण दें? शुरुआत से और आगे बढ़ने से, कौन सा कदम आपको अपेक्षित परिणाम नहीं देता है। क्या सर्वर को अनुरोध बिल्कुल प्राप्त नहीं हुआ? – kcome

+0

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

+0

प्राप्त नहीं होता है, वैसे, मामूली बिंदु, लेकिन देखें ['addSlashes' दस्तावेज़] (http://php.net/manual/en/function.addslashes.php) जो सलाह देता है कि आप [' mysqli_real_escape_string'] (http://php.net/manual/en/mysqli का उपयोग करें .real-escape-string.php), इसके बजाए। – Rob

उत्तर

11

से प्रयास करें सुधार के साथ अद्यतन :

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() 

आपको यूटीएफ 8 स्ट्रिंग एन्कोडिंग का उपयोग करके अपना डेटा एन्कोड करना होगा। यदि आपको अनुरोध फ़ील्ड के लिए एक से अधिक फ़ील्ड & मान जोड़े सेट करने की आवश्यकता है, तो आप बॉडी स्ट्रिंग को बदल सकते हैं, उदाहरण के लिए, "pseudo = test & भाषा = स्विफ्ट"। वास्तव में, मैं आमतौर पर 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) 

मुझे आशा है कि इस मदद करता है!

+1

इसके लिए बहुत बहुत धन्यवाद! =) – CodeMonkey

1

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

$_POST["pseudo"] 

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

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

// @Rob

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) 
+0

मैंने कोशिश की है लेकिन यह काम नहीं करता है:/लेकिन मैं सबकुछ बदल सकता हूं (PHP या स्विफ्ट में) कोई समस्या नहीं है :) – sebasthug

+0

मुझे खेद है कि मैं PHP में कोई विशेषज्ञ नहीं हूं, इसलिए जो मैं समझता हूं उससे आपका PHP कोड, समस्या पक्ष भेजने और प्राप्त करने के बीच डेटा के विभिन्न प्रारूप के कारण होती है। – kcome

+0

प्रेषक/स्विफ्ट में 'सामग्री-प्रकार' को बदलने के लिए मत भूलना, इसे सेट करें: 'request.addValue (" एप्लिकेशन/एक्स-www-form-urlencoded ", एचटीटीपी हैडर फ़ील्ड के लिए:" सामग्री-प्रकार ") मूल जेसन नहीं एक। – kcome

15

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

var request = URLRequest(url: url) 
request.httpMethod = "POST" 

let parameters = ["somekey" : "valueforkey"] 
request.setContent(with: parameters) 

let task = session.dataTask(with: request) { data, response, error in 
    guard let data = data, error == nil else { 
     print(error ?? "Unknown error") 
     return 
    } 
    // your response parsing code here 
} 
task.resume() 

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

extension URLRequest { 
    /// Set body and header for x-www-form-urlencoded request 
    /// 
    /// - Parameter parameters: Simple string dictionary of parameters to be encoded in body of request 

    mutating func setContent(with parameters: [String: String]) { 
     setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 

     let array = parameters.map { entry -> String in 
      let key = entry.key.addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed)! 
      let value = entry.value.addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed)! 
      return key + "=" + value 
     } 
     httpBody = array.joined(separator: "&").data(using: .utf8)! 
    } 
} 

नोट, यह मूल्यों को भी एन्कोड करता है (और, केवल मामले में, चाबियाँ भी), जो महत्वपूर्ण है। जबकि अन्य ने addingPercentEncoding.urlQueryAllowed के साथका उपयोग करने की सलाह दी है, दुख की बात है कि यह काम नहीं करेगा, क्योंकि यह कुछ आरक्षित पात्रों (विशेष रूप से +) को अनदेखा कर देगा। the x-www-form-urlencoded spec के अनुरूप, अधिकांश वेब सेवाएं + को एक स्थान के रूप में व्याख्या करती हैं।

extension CharacterSet { 

    /// Returns the character set for characters allowed in the individual parameters within a query URL component. 
    /// 
    /// The query component of a URL is the component immediately following a question mark (?). 
    /// For example, in the URL `http://www.example.com/index.php?key1=value1#jumpLink`, the query 
    /// component is `key1=value1`. The individual parameters of that query would be the key `key1` 
    /// and its associated value `value1`. 
    /// 
    /// According to RFC 3986, the set of unreserved characters includes 
    /// 
    /// `ALPHA/DIGIT/"-"/"."/"_"/"~"` 
    /// 
    /// In section 3.4 of the RFC, it further recommends adding `/` and `?` to the list of unescaped characters 
    /// for the sake of compatibility with some erroneous implementations, so this routine also allows those 
    /// to pass unescaped. 

    static var urlQueryValueAllowed: CharacterSet = { 
     let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4 
     let subDelimitersToEncode = "!$&'()*+,;=" 

     var allowed = CharacterSet.urlQueryAllowed 
     allowed.remove(charactersIn: generalDelimitersToEncode + subDelimitersToEncode) 
     return allowed 
    }() 
} 

स्विफ्ट 2 गायन के लिए, previous revision of this answer देखें: तो, एक दृष्टिकोण Alamofire द्वारा अपनाया अनुकूल, मैं एक वर्ण सेट जो विभिन्न सीमांकक के साथ मूल्यों सांकेतिक शब्दों में बदलना होगा परिभाषित करते हैं।

+1

मुझे कुछ पैरामीटर में '+' चरित्र मिला है, लगातार असफल रहा .... धन्यवाद अंत में यह मिला :) –

+0

धन्यवाद आदमी .. ठीक काम कर रहा है – Sandu

संबंधित मुद्दे