2012-06-07 16 views
7

Rails sunucumuza güncelleme PUT istekleri göndererek birçok kez denedik ve 404 "almaya çalıştığınız sayfa mevcut değil"iOS cihazları Rails uygulamalarına PUT istekleri gönderebilir mi?

Güncelleştirme yöntemimiz çok basit (pratik olarak genel raylar).

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 

ben güncelleme yöntemi sınamak için komut satırından CURL çalıştırmak uç

, iyi çalışıyor. Ancak, aynı yöntemleri objektif-c'de denediğimde, her zaman bir 404 hatasıyla sonuçlanır.

Sorularım: iOS cihazları, NSURLConnection kullanan sunuculara PUT istekleri gönderebilir mi veya bu uygulanmadı mı?

GÜNCELLEME ::

Bu

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]; 

Bu Bir NSMutableURLRequest yapmak ve HTTP yöntemi ayarlayabilirsiniz

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

Yakut kodunu zaman Gönderme Sorunuz iOS desteği hakkındadır, muhtemelen iyi bir şey yapmazsınız. Bunun yerine Objective-C kodunuzu gönderirseniz, HTTP yöntemini doğru olarak ayarlayıp ayarlamadığınızı görebiliriz (aşağıda David V aşağıda gösterildiği gibi). – glorifiedHacker

+0

Evet, bunun için üzgünüm. Rayları bitiriyorum, ve farklı bir geliştirici hedef-c yazıyordu ve onun koduna erişimim yoktu. Şimdi bitti. –

+0

'[' ve ']' karakterlerinden kaçmamanızla ilgili bir şey olup olmadığını merak ediyorum. HTTP gövdesini "@ user% 5Bfirst_name% 5D = brian" dizisinden türetilen verilerle ayarlamayı deneyin. – glorifiedHacker

cevap

6

veritabanını günceller veritabanını güncellemek gelmez :

- (void)setHTTPMethod:(NSString *)method 

@"PUT" dizesini verin.

Böyle bir istekte nasıl bir NSURLConnection oluşturabilirsiniz.

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

Bunu denedi, ama işe yaramadı. POST ve GET istekleri işe yarar. –

+0

Belki de URL'niz, parametreler veya üstbilgilerinizde bir sorun var. Doğru biçimlendirildiğini doğrulamak için isteği ayıklar mıydınız? İsteğinize cURL için sağladığınız dizgiyi koyup, yardımcı olup olmadığına bakın. –

+0

Hm, bu ilginç.[Request setHTTPBody: @ ”kullanıcı [first_name] = brian"] aracılığıyla PUT isteğine gövde verisi eklemeye çalıştığımda, 200 yanıtla yanıt verirdi, ancak veritabanı kaydını güncellemedi. HOWEVER, verileri URL'ye eklediğimde değişiyor. Örneğin: test.com/users/1.json?user[first_name]=joe <- PUT ile çalışır ve çalışır! –

4

@ "POST"

olarak HTTP yöntemi türünü ayarlayın Ve istek gövdesine bir parametreyi ekleyin: Bu çalışması gerektiğini @ "_ yöntemi"

anahtar için "PUT" @ . akshay1188 @ Aslında

+0

Çok kibar ve tam çalışma örneği verebilir misiniz? – andi

7

çalışılabilir bir çözümü vardır, ama daha şık bir yaklaşım isteğine "application/x-www-form-urlencoded" içerik türü ekleme olduğunu düşünüyorum:

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