2016-03-19 28 views
0

Raylarım uygulamasında http 200 kodu iyi görünüyor ancak bir hata varsa denetleyicimin hatayı JSON'a iletmesini istiyorum, böylece Android uygulamamda bununla başa çıkabilirim. API json'a Http hatası yanıtları döndürme

bir oylama benim raylar sunucusunda aşağıdaki olsun başarılı ise

:

Started PUT "/articles/10/dislike" for 49.199.139.48 at 2016-03-18 11:46:53 +0000 
Cannot render console from 49.199.139.48! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 
Processing by ArticlesController#downvote as JSON 
    Parameters: {"votes"=>{"votable_id"=>"10", "votable_type"=>"Article", "voter_id"=>"3", "voter_type"=>"User", "vote_flag"=>"f", "vote_weight"=>"1"}, "article"=>"10", "id"=>"10"} 
    User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."email" = ? ORDER BY "users"."id" ASC LIMIT 1 [["email", "[email protected]"]] 
    Article Load (0.3ms) SELECT "articles".* FROM "articles" WHERE "articles"."id" = ? ORDER BY "articles"."created_at" DESC LIMIT 1 [["id", 10]] 
    (0.3ms) SELECT COUNT(*) FROM "votes" WHERE "votes"."votable_id" = ? AND "votes"."votable_type" = ? AND "votes"."voter_id" = ? AND "votes"."voter_type" = ? AND "votes"."vote_scope" IS NULL [["votable_id", 10], ["votable_type", "Article"], ["voter_id", 3], ["voter_type", "User"]] 
    ActsAsVotable::Vote Load (0.4ms) SELECT "votes".* FROM "votes" WHERE "votes"."votable_id" = ? AND "votes"."votable_type" = ? AND "votes"."voter_id" = ? AND "votes"."voter_type" = ? AND "votes"."vote_scope" IS NULL ORDER BY "votes"."id" DESC LIMIT 1 [["votable_id", 10], ["votable_type", "Article"], ["voter_id", 3], ["voter_type", "User"]] 
    (0.1ms) begin transaction 
    (0.1ms) commit transaction 
Completed 302 Found in 140ms (Views: 0.5ms | ActiveRecord: 84.9ms) 

:

Started PUT "/articles/10/dislike" for 49.199.139.48 at 2016-03-18 11:46:08 +0000 
Cannot render console from 49.199.139.48! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 
Processing by ArticlesController#downvote as JSON 
    Parameters: {"votes"=>{"votable_id"=>"10", "votable_type"=>"Article", "voter_id"=>"3", "voter_type"=>"User", "vote_flag"=>"f", "vote_weight"=>"1"}, "article"=>"10", "id"=>"10"} 
    User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."email" = ? ORDER BY "users"."id" ASC LIMIT 1 [["email", "[email protected]"]] 
    Article Load (0.2ms) SELECT "articles".* FROM "articles" WHERE "articles"."id" = ? ORDER BY "articles"."created_at" DESC LIMIT 1 [["id", 10]] 
    (0.2ms) SELECT COUNT(*) FROM "votes" WHERE "votes"."votable_id" = ? AND "votes"."votable_type" = ? AND "votes"."voter_id" = ? AND "votes"."voter_type" = ? AND "votes"."vote_scope" IS NULL [["votable_id", 10], ["votable_type", "Article"], ["voter_id", 3], ["voter_type", "User"]] 
    ActsAsVotable::Vote Load (0.2ms) SELECT "votes".* FROM "votes" WHERE "votes"."votable_id" = ? AND "votes"."votable_type" = ? AND "votes"."voter_id" = ? AND "votes"."voter_type" = ? AND "votes"."vote_scope" IS NULL ORDER BY "votes"."id" DESC LIMIT 1 [["votable_id", 10], ["votable_type", "Article"], ["voter_id", 3], ["voter_type", "User"]] 
    (0.2ms) begin transaction 
    (0.1ms) commit transaction 
Completed 200 OK in 12ms (Views: 0.2ms | ActiveRecord: 1.1ms) 

o (kişi önce oy verildiği için) aşağıdaki alıyorum başarısız olursa

Sorun Tamamlandı 302 Bulunan yanıtı Android uygulamamıza geri gönderemiyorum. Sadece boş geri geçer.

Kontrolör: Bir hata varsa

def upvote 
    @article.upvote_by current_user 
    if @article.vote_registered? 
     flash[:success] = "Successfully liked" 
     respond_to do |format| 
     format.html {redirect_to :back } 
     format.json { render json: { count: @article.get_upvotes.size } } 
     end 
    else 
     flash[:danger] = "You have already liked this" 
     respond_to do |format| 
     format.html {redirect_to :back } 
     format.json { render json: { status: :found }, status: 302 } 
     end 
    end 
    end 

Android uygulaması oylama ve dize WebResponse uğraşan geri boş geliyor. 401 yetkisiz, 302 bulundu, vb, hala boş geri dönerse fark etmez:

Çok teşekkürler.

private class VoteTask extends UrlJsonAsyncTask { 
     public VoteTask(Context context) { 
      super(context); 
     } 

     @Override 
     protected JSONObject doInBackground(String... urls) { 
      DefaultHttpClient webClient = new DefaultHttpClient(); 
      HttpPut put = new HttpPut(urls[0]); 
      JSONObject holder = new JSONObject(); 
      JSONObject voteObj = new JSONObject(); 
      JSONObject json = new JSONObject(); 

      try { 
       try { 
        // setup the returned values in case 
        // something goes wrong 
        //json.put("success", false); 
        // json.put("info", "Something went wrong. Retry!"); 

        //get stored values to prove the user is authorised 
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
        String id = sharedPreferences.getString("userId", "default value"); 
        String authToken = sharedPreferences.getString("AuthToken", "default value"); 
        String email = sharedPreferences.getString("email", "default value"); 

        voteObj.put("votable_id",articleId); 
        voteObj.put("votable_type", "Article"); 
        voteObj.put("voter_id", id); 
        voteObj.put("voter_type", "User"); 
        voteObj.put("vote_flag", voteFlag); 
        voteObj.put("vote_weight", "1"); 
        holder.put("votes", voteObj); 
        holder.put("article", articleId); 
        StringEntity se = new StringEntity(holder.toString()); 
        put.setEntity(se); 

        // setup the request headers 
        put.setHeader("Accept", "application/json"); 
        put.setHeader("Content-Type", "application/json"); 
        // add email and auth token to validate 
        put.setHeader("X-User-Email", email); 
        put.setHeader("X-User-Token", authToken); 

        //response = webClient.execute(put); 
        //json = new JSONObject(response); 
        webResponse = String.valueOf(webClient.execute(put).getStatusLine().getStatusCode()); 
        json = new JSONObject(webResponse); 


       } catch (HttpResponseException e) { 
        e.printStackTrace(); 
        Log.e("ClientProtocol", "" + e); 
        json.put("info", "Email and/or password are invalid. Retry!"); 
       } catch (IOException e) { 
        e.printStackTrace(); 
        Log.e("IO", "" + e); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
       Log.e("JSON", "" + e); 
      } 

      return json; 
     } 

cevap

0

Kodumu aradıktan ve karşılaştırdıktan birkaç gün sonra% 99 çalışıyormuş gibi görünüyor. bu yüzden geri sunucudan yanıt aldı asla

http://guides.rubyonrails.org/layouts_and_rendering.html#the-status-option

Temelde bir 302-bulundu tepki sınıfı yönlendirme olarak işaretlenmiş: Ben eksikti bir şey bu oldu. Hatayı, yanıt sınıfı istemci hatası olan ve webResponse'de geri aldığım 409 çakışmasına dönüştürdüm, bu yüzden 409 alırsam, kullanıcı zaten oy kullandı.

def upvote 
    @article.upvote_by current_user 
    if @article.vote_registered? 
     flash[:success] = "Successfully liked" 
     respond_to do |format| 
     format.html {redirect_to :back } 
     format.json { render json: { count: @article.get_upvotes.size } } 
     end 
    else 
     flash[:danger] = "You have already liked this" 
     respond_to do |format| 
     format.html {redirect_to :back } 
     format.json { head :conflict } 
     end 
    end 
    end 
İlgili konular