2012-06-07 16 views
7

हमने कई बार हमारे रेल सर्वर को अद्यतन पुट अनुरोध भेजने की कोशिश की है और हम 404 प्राप्त करते रहेंगे "जिस पृष्ठ को आप ढूंढ रहे थे वह मौजूद नहीं है"क्या आईओएस डिवाइस रेल एप्स को पुट अनुरोध भेज सकते हैं?

हमारी अपडेट विधि बहुत सरल (व्यावहारिक रूप से सामान्य रेल) ​​है।

def update 
@user = User.find(params[:id]) 

respond_to do |format| 
    if @user.update_attributes(params[:user]) 
    format.html { redirect_to @user, notice: 'User was successfully updated.' } 
    format.json { head :no_content } 
    else 
    format.html { render action: "edit" } 
    format.json { render json: @user.errors, status: :unprocessable_entity } 
    end 
end 

अंत

जब मैं अद्यतन विधि का परीक्षण करने के कमांड लाइन से कर्ल चलाने के लिए, यह ठीक काम करता है। लेकिन, जब मैं उद्देश्य-सी में एक ही तरीके का प्रयास करता हूं, तो यह हमेशा 404 त्रुटि में परिणाम देता है।

तो मेरा सवाल यह है: क्या आईओएस डिवाइस NSRLConnection का उपयोग कर सर्वरों को PUT अनुरोध भेज सकते हैं या यह लागू नहीं किया गया है?

अद्यतन ::

इस डेटाबेस

NSString *dataString = @"user[first_name]=bob"; 
NSData *postBodyData = [NSData dataWithBytes: [dataString UTF8String] length:[dataString length]]; 
NSString *urlString = [NSString stringWithFormat:@"example.com/users/1.json"]; 
NSURL *fullURL = [NSURL URLWithString:urlString]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:fullURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20]; 
[request setHTTPMethod: @"PUT"]; 
[request setHTTPBody:postBodyData]; 
self.todoConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
receivedData = [NSMutableData data]; 

इस डेटाबेस

NSString *urlString = [NSString stringWithFormat:@"example.com/users/1.json?user[first_name]=bob"]; 
NSURL *fullURL = [NSURL URLWithString:urlString]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:fullURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20]; 
[request setHTTPMethod: @"PUT"]; 
self.todoConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
receivedData = [NSMutableData data]; 
+0

पोस्ट करना रूबी कोड जब आपका प्रश्न आईओएस समर्थन के बारे में है शायद आप कोई अच्छा नहीं करेंगे। यदि आप इसके बजाय अपना उद्देश्य-सी कोड पोस्ट करते हैं, तो हम देख सकते हैं और देख सकते हैं कि आप HTTP विधि को सही तरीके से सेट कर रहे हैं (जैसा डेविड वी नीचे दिखाया गया है)। – glorifiedHacker

+0

हाँ, इसके बारे में खेद है। मैं रेल के अंत लिख रहा हूं, और एक अलग डेवलपर उद्देश्य-सी लिख रहा था और मुझे उसके कोड तक पहुंच नहीं थी। यह अभी खत्म हो गया है –

+0

मुझे आश्चर्य है कि क्या इस तथ्य के साथ कुछ करना है कि आप '[' और ']' वर्णों से बच नहीं रहे हैं। स्ट्रिंग @ "उपयोगकर्ता% 5Bfirst_name% 5D = ब्रायन" से व्युत्पन्न डेटा के साथ HTTP बॉडी को सेट करने का प्रयास करें। – glorifiedHacker

उत्तर

6

आप एक NSMutableURLRequest बनाने और HTTP विधि सेट कर सकते हैं अद्यतन करता अपडेट नहीं करता :

- (void)setHTTPMethod:(NSString *)method 

इसे स्ट्रिंग @"PUT" दें।

यहां बताया गया है कि आप इस अनुरोध से NSRLConnection कैसे बना सकते हैं।

NSMutableURLRequest *myMutableRequest[[NSMutableURLRequest alloc] initWithURL:myURL]; 
[myMutableRequest setHTTPMethod:@"PUT"]; 
[NSURLConnection connectionWithRequest:myMutableRequest delegate:myDelegate]; 
+1

कोशिश की, लेकिन यह काम नहीं किया। पोस्ट और जीईटी अनुरोध काम करते हैं। –

+0

शायद आपके यूआरएल, पैरामीटर या हेडर के साथ कुछ गलत है। क्या आपने यह सत्यापित करने के अनुरोध को डीबग किया था कि यह सही ढंग से स्वरूपित है? आप अपने अनुरोध में कर्ल को प्रदान की गई सटीक स्ट्रिंग डालने का प्रयास कर सकते हैं और देख सकते हैं कि इससे मदद मिलती है या नहीं। –

+0

एचएम, यह दिलचस्प है।जब मैंने पुट अनुरोध में अनुरोध डेटा [अनुरोध सेट एचटीटीपीबीडी: @ "उपयोगकर्ता [first_name] = ब्रायन" के माध्यम से बॉडी डेटा जोड़ने की कोशिश की तो यह 200 प्रतिक्रिया के साथ प्रतिक्रिया देगी, लेकिन यह डेटाबेस रिकॉर्ड अपडेट नहीं करेगा। हालांकि, जब मैं यूआरएल में डेटा जोड़ता हूं, तो यह बदल जाता है। उदाहरण के लिए: test.com/users/1.json?user[first_name]=joe <- पुट के माध्यम से, और यह काम करता है! –

4

@ "पोस्ट"

के रूप में HTTP विधि प्रकार सेट करें और के रूप में अनुरोध शरीर के लिए एक पैरामीटर जोड़ें: कुंजी @ "_ विधि"

यह काम करना चाहिए के लिए @ "डाल"।

+0

क्या आप इतने विनम्र हो सकते हैं और पूर्ण कार्य उदाहरण प्रदान कर सकते हैं? – andi

7
असल

@ akshay1188 से समस्या का समाधान नहीं है, लेकिन मुझे लगता है कि और अधिक सुरुचिपूर्ण दृष्टिकोण अनुरोध करने के लिए "application/x-www फार्म-urlencoded" सामग्री प्रकार जोड़ने के लिए है:

[request setHTTPMethod:@"PUT"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 

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

  • कोई संबंधित समस्या नहीं^_^