POST

2010-03-30 15 views
16

के साथ PHP स्क्रिप्ट में कुंजी-मान जोड़े को पास करने के लिए NSURLRequest का उपयोग करना मैं उद्देश्य-सी के लिए बिल्कुल नया हूं, और POST का उपयोग करके एक PHP स्क्रिप्ट में कई कुंजी-मूल्य जोड़े को पास करने के लिए देख रहा हूं। मैं निम्नलिखित कोड का उपयोग कर रहा हूं लेकिन डेटा को पोस्ट करने के लिए प्रतीत नहीं होता है। मैंने NSData का उपयोग करके सामान भेजने की कोशिश की, लेकिन न ही काम करने लगते हैं।POST

NSDictionary* data = [NSDictionary dictionaryWithObjectsAndKeys: 
    @"bob", @"sender", 
    @"aaron", @"rcpt", 
    @"hi there", @"message", 
    nil]; 

NSURL *url = [NSURL URLWithString:@"http://myserver.com/script.php"]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 

[request setHTTPMethod:@"POST"]; 
[request setHTTPBody:[NSData dataWithBytes:data length:[data count]]]; 

    NSURLResponse *response; 
    NSError *err; 
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err]; 
    NSLog(@"responseData: %@", content); 

यह इस सरल स्क्रिप्ट के लिए भेजा जा रहा है एक डाटाबेस डालने प्रदर्शन करने के लिए:

<?php $sender = $_POST['sender']; 
     $rcpt = $_POST['rcpt']; 
     $message = $_POST['message']; 

     //script variables 
     include ("vars.php"); 

     $con = mysql_connect($host, $user, $pass); 
     if (!$con) 
     { 
     die('Could not connect: ' . mysql_error()); 
     } 

     mysql_select_db("mydb", $con); 

     mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) 
     VALUES ($sender, $rcpt, $message)"); 

     echo "complete" 
?> 

कोई भी विचार?

+1

pinkgothic के लिए धन्यवाद, मैं हूँ अब बोली-enclosing मेरी डालने बयान, लेकिन यह केवल DB को खाली मान जोड़ रहा है । मुझे लगता है कि इसका मतलब है कि मूल्य अभी भी ठीक से पोस्ट नहीं किए जा रहे हैं? –

उत्तर

36

सभी के सुझावों के लिए धन्यवाद। अंत में मैंने here दिए गए सामानों का उपयोग करके इस मुद्दे को हल करने में कामयाब रहे।

कोड:

NSString *myRequestString = @"sender=my%20sender&rcpt=my%20rcpt&message=hello"; 
NSData *myRequestData = [ NSData dataWithBytes: [ myRequestString UTF8String ] length: [ myRequestString length ] ]; 
NSMutableURLRequest *request = [ [ NSMutableURLRequest alloc ] initWithURL: [ NSURL URLWithString: @"http://people.bath.ac.uk/trs22/insert.php" ] ]; 
[ request setHTTPMethod: @"POST" ]; 
[ request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; 
[ request setHTTPBody: myRequestData ]; 
NSURLResponse *response; 
NSError *err; 
NSData *returnData = [ NSURLConnection sendSynchronousRequest: request returningResponse:&response error:&err]; 
NSString *content = [NSString stringWithUTF8String:[returnData bytes]]; 
NSLog(@"responseData: %@", content); 
0

संपादित करें: ओपी में तय किया गया है।


यह आपके एकमात्र समस्या नहीं हो सकता है (मैं चारों ओर उद्देश्य-सी मेरे रास्ते पता नहीं है), लेकिन यहाँ जाता है:

mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) 
VALUES ($sender, $rcpt, $message)"); 

आप नहीं अपने तार बोली-संलग्न कर रहे हैं - MySQL उस पर एक फिट फिट होने के लिए बाध्य है।

mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) 
VALUES ('$sender', '$rcpt', '$message')"); 

इसके अलावा, आम तौर पर, भले ही अपनी स्क्रिप्ट के बाहर से पहुंच योग्य नहीं है, तो आप उपयोगकर्ता इनपुट पर भरोसा नहीं करना चाहिए और या तो mysql_real_escape_string() का उपयोग अपने मूल्यों से बचने के लिए इससे पहले कि आप उन्हें SQL विवरण में डालने एसक्यूएल इंजेक्शन को रोकने के लिए , या prepared statements (पसंदीदा) का उपयोग करें - अन्यथा आपके वैध डेटा में एकल उद्धरण SQL कथन के वाक्यविन्यास को तोड़ देगा।

संदर्भ के लिए पूरी तरह से नमकहराम उदाहरण:

mysql_query("INSERT INTO php_test (SENDER, RCPT, MESSAGE) 
VALUES ('" . mysql_real_escape_string($sender) ."'," 
." '" . mysql_real_escape_string($rcpt) ."'," 
." '" . mysql_real_escape_string($message) ."')"); 
2

इस लाइन [request setHTTPBody:[NSData dataWithBytes:data length:[data count]]]; तरह से मेरे लिए गलत लग रहा है।

मुझे लगता है कि आप चाहते हैं: [request setAllHTTPHeaderFields:data];

दूसरे, आप कोको ढांचे उन्हें (annoyingly) भेजने से पहले अपने क्षेत्र के नाम के पहले अक्षर को बड़ा करता मिल जाएगा। इससे निपटने के लिए आपको कुछ बदलाव करना पड़ सकता है।

+0

डर नहीं - अब मैं हो रही है: 400 गलत अनुरोध

400 गलत अनुरोध

आपका ग्राहक विकृत या अवैध अनुरोध जारी किया है। sendSynchronousRequest: विधि से वापस। क्या कोई अन्य हेडर फ़ील्ड है जो मुझे HTTP के अनुरूप भेजने के लिए भेजने की ज़रूरत है? –

2

यदि आप बहुत सारे फॉर्म पोस्टिंग करने जा रहे हैं, तो मैं NSURLRequest को छोड़ने और ASIHTTPRequest का उपयोग करने की सलाह दूंगा। आईएमएचओ, यह अच्छी तरह से प्रलेखित है और वेब सर्विसेज के साथ बातचीत करने का एक सीधा तरीका प्रदान करता है।

+0

धन्यवाद, लेकिन पूरी परियोजना में वास्तव में इसे एक से अधिक बार उपयोग करने की तलाश नहीं कर रहा है। हालांकि मुझे लगता है कि सामान पोस्ट करने में कितना आसान लगता है। –

4

यह गलत है:

[NSData dataWithBytes:[post UTF8String] length:[post length]] 

लंबाई UTF8 वर्ण की गिनती में नहीं बाइट में व्यक्त किया जाना चाहिए। इस लाइन के बजाय का उपयोग करना चाहिए:

NSData *data = [post dataUsingEncoding: NSUTF8StringEncoding]; 
+0

लगभग हर चीज की कोशिश की, पूरी चीज इस स्ट्रिंग में थी। धन्यवाद! – blackhawk4152

1

यह आईओएस 5 पर काम कर रहा है।फार्म पोस्टिंग के लिए और ओ डाटा रही:

self.requestFor = serviceNameT; 

responseData = [[NSMutableData data] retain]; 

SharedResponsedObject* sharedResponsedObject = [SharedResponsedObject returnSharedInstance]; 
LoginInfo* loginInfo = (LoginInfo*)sharedResponsedObject.loginInfo; 

NSLog(@"DEVICE_TOKEN: %@, loginInfo.sessionId: %@, itemIdT: %@", DEVICE_TOKEN, loginInfo.sessionId, itemIdT); 

NSString* requestStr = [NSString stringWithFormat:@"Token=%@&SessionId=%@&ItemId=%@", DEVICE_TOKEN, loginInfo.sessionId, itemIdT]; 


NSData *myRequestData = [ NSData dataWithBytes: [ requestStr UTF8String ] length: [ requestStr length ] ]; 

NSMutableURLRequest *request = [[ NSMutableURLRequest alloc ] initWithURL: [ NSURL URLWithString:@"http://menca.com:1500/DownloadContent.aspx"]]; 

[request setHTTPMethod: @"POST" ]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; 
[ request setHTTPBody: myRequestData ]; 


NSURLResponse *response; 
NSError *err; 
NSData *returnData = [ NSURLConnection sendSynchronousRequest: request returningResponse:&response error:&err]; 
NSString *content = [NSString stringWithUTF8String:[returnData bytes]]; 
NSLog(@"ServerRequestResponse::responseData: %@", content); 

धन्यवाद & सादर, अरुण ध्वज