2013-04-03 11 views
8

Staram się więc publikować w aplikacji railsowej z aplikacji na Androida, którą piszę. Udostępniam posty z poziomu aplikacji rails. Udało mi się również wysłać pomyślnie za pomocą dodatku chrome o nazwie klient Simple Rest.Wysyłanie do aplikacji Ruby on Rails z Androidem

enter image description here

Gdy próbuję i post z Android App jego uderzenie app szyn ale tworząc pustą post. Żadne dane wejściowe nie są odbierane przez szyny.

Przeczytałem, że aplikacje innych firm są w stanie pobrać tylko z aplikacji Rails w zależności od uwierzytelniania, więc aby upewnić się, że to nie był problem, dodałem to do mojej konfiguracji Rails.

# de-activate tolken auth 
config.action_controller.allow_forgery_protection = false 

W tym momencie nie jestem pewien, gdzie leży mój problem, z moim Railsowym backendem lub moim klientem z Androidem.

ok więc po szynach metoda w moim kontrolera, że ​​staram się dotrzeć tu

# POST /orders 
    # POST /orders.json 
    def create 
    @order = Order.new(params[:order]) 

    respond_to do |format| 
     if @order.save 
     format.html { redirect_to @order, notice: 'Order was successfully created.' } 
     format.json { render json: @order, status: :created, location: @order } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @order.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

Oto Android kod Java do wysyłania żądania POST. Jest to metoda, przechodząc w danych wejściowych użytkownika Próbuję POST

private void postInformationtoAPI() { 

       showToast("POSTING ORDER"); 
       List<NameValuePair> apiParams = new ArrayList<NameValuePair>(); 
       apiParams.add(new BasicNameValuePair("drinks_id", GlobalDrinkSelected)); 
       apiParams.add(new BasicNameValuePair("name", GlobalEditTextInputName)); 
       apiParams.add(new BasicNameValuePair("paid" , GlobalIsPaid)); 

       bgtPost = new BackGroundTaskPost(MAP_API_URL_POST_ORDER, "POST", apiParams); 
       bgtPost.execute(); 

       goToOrderCompleted(); 

      } 

I to jest klasa, która jest przekazywana do, permorming HTTP POST.

public class BackGroundTaskPost extends AsyncTask<String, String, JSONObject> { 

    List<NameValuePair> postparams = new ArrayList<NameValuePair>(); 
    String URL = null; 
    String method = null; 

    static InputStream is = null; 
    static JSONObject jObj = null; 
    static String json = ""; 

    public BackGroundTaskPost(String url, String method, List<NameValuePair> params) { 
     this.URL = url; 
     this.postparams = params; 
     this.method = method; 

     for (int i = 0; i < postparams.size(); i++){ 
      String test = postparams.get(i).toString(); 
      Log.d("This is in the lisht:", test); 
     } 
    } 

    @Override 
    protected JSONObject doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     // Making HTTP request 
     try { 
     // Making HTTP request 
     // check for request method 

     if (method.equals("POST")) { 
     // request method is POST 
     // defaultHttpClient 

      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(URL); 
      httpPost.setEntity(new UrlEncodedFormEntity(postparams, HTTP.UTF_8)); 
      Log.i("postparams : ", postparams.toString()); 
      httpPost.setHeader("Content-Type", "application/json"); 
      httpPost.setHeader("Accept", "application/json"); 

      HttpResponse httpResponse = httpClient.execute(httpPost); 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      is = httpEntity.getContent(); 

     } else if (method == "GET") { 
     // request method is GET 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     String paramString = URLEncodedUtils 
      .format(postparams, "utf-8"); 
     URL += "?" + paramString; 
     HttpGet httpGet = new HttpGet(URL); 

     HttpResponse httpResponse = httpClient.execute(httpGet); 
     HttpEntity httpEntity = httpResponse.getEntity(); 
     is = httpEntity.getContent(); 
     } 

     } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 

     try { 
      Log.i("Logging out *is* before beffered reader", is.toString()); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
     is, "utf-8"), 8); 
     Log.i("Logging out *is* after beffered reader", is.toString()); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
     sb.append(line + "\n"); 
     } 
     is.close(); 
     json = sb.toString(); 
     Log.i("json: ",json); 
     } catch (Exception e) { 
     Log.e("Buffer Error", "Error converting result " + e.toString()); 
     } 

     // try parse the string to a JSON object 
     try { 
     jObj = new JSONObject(json); 
     } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data TEST " + e.toString()); 
     } 

     // return JSON String 
     return jObj; 

    } 
    } 

Jest na zewnątrz, który raport za postparams w powyższej klasie, więc wiem, że dane są faktycznie przesyłane

04-03 21:36:23.994: I/postparams :(690): [drinks_id=41, name=Dave, paid=True] 

to co Log Cat pokazuje jako odpowiedź serwera

04-03 20:56:08.247: I/json:(690): {"created_at":"2013-04-03T20:56:06Z","drinks_id":null,"id":1351,"name":null,"paid":null,"served":null,"updated_at":"2013-04-03T20:56:06Z"} 

Naprawdę staram się zrozumieć, gdzie leży problem i utknąłem na nim przez jakiś czas. Każdy wgląd byłby bardzo doceniany. A jeśli potrzebujesz więcej informacji, po prostu krzyknij.

Edit: logi z serwera

jest to udany post od prostego klienta REST

2013-04-03T23:13:31+00:00 app[web.1]: Completed 200 OK in 15ms (Views: 8.7ms | ActiveRecord: 5.2ms) 
2013-04-03T23:13:42+00:00 app[web.1]: Started POST "/orders.json" for 89.101.112.167 at 2013-04-03 23:13:42 +0000 
2013-04-03T23:13:42+00:00 app[web.1]: Processing by OrdersController#create as JSON 
2013-04-03T23:13:42+00:00 app[web.1]: Parameters: {"updated_at"=>nil, "drinks_id"=>51, "id"=>1021, "name"=>"Test", "paid"=>true, "served"=>nil, "created_at"=>nil, "order"=>{"drinks_id"=>51, "name"=>"Test", "paid"=>true, "served"=>nil}} 
2013-04-03T23:13:43+00:00 heroku[router]: at=info method=POST path=/orders.json host=fyp-coffeeshop.herokuapp.com fwd="89.101.112.167" dyno=web.1 connect=1ms service=25ms status=201 bytes=138 
2013-04-03T23:13:43+00:00 app[web.1]: Completed 201 Created in 15ms (Views: 0.6ms | ActiveRecord: 13.2ms) 

To z Android App delegowania

2013-04-03T22:56:45+00:00 app[web.1]: Started POST "/orders.json" for 89.101.112.167 at 2013-04-03 22:56:45 +0000 
2013-04-03T22:56:45+00:00 app[web.1]: Processing by OrdersController#create as JSON 
2013-04-03T22:56:45+00:00 app[web.1]: Completed 201 Created in 23ms (Views: 2.2ms | ActiveRecord: 16.3ms) 
2013-04-03T22:56:45+00:00 heroku[router]: at=info method=POST path=/orders.json host=fyp-coffeeshop.herokuapp.com fwd="89.101.112.167" dyno=web.1 connect=4ms service=37ms status=201 bytes=138 
+0

można napisać krótki skrypt php zrzucić listę parametrów w poście, aby upewnić się, że się tam dostać? Wrzuć tablicę $ _POST do pliku i sprawdź ją. – Dave

+0

Myślałem o tym więcej. Nigdy nie wysłałem listy i powiedziałem, że była to zawartość JSON, zawsze tworzyłem JSONObject, a następnie wysłałem parę nazwa/wartość query = jsonobject, a następnie na moim serwerze podałem wartość zapytania jako ciąg json. – Dave

+0

Po prostu wyloguję prośbę od klienta odpoczynku i mojej aplikacji do porównania, zaktualizuję moje pytanie: – DavedCusack

Odpowiedz

6

Ty ustawiając typ zawartości JSON, ale nie faktycznie wysyłania JSON, wysyłasz standardowe parametry zakodowane w trybie POST.

Trzeba rzeczywiście wysłać obiekt JSON:

JSONObject params = new JSONObject(); 
params.put("drinks_id", GlobalDrinkSelected); 
params.put("name", GlobalEditTextInputName); 
params.put("paid", GlobalIsPaid); 

StringEntity entity = new StringEntity(params.toString()); 
httpPost.setEntity(entity); 
+0

Czy kod w moim pytaniu nie dodaje params w metoda postInformationtoAPI()? Edycja: dzięki za pomoc przy okazji – DavedCusack

+1

Cody bardzo Ci dziękuję, że zaoszczędziłeś mi dużo bólu serca. Przekazując obiekt JSON i dodając go do encji "entity.setContentType (" application/json; charset = UTF-8 ");" Udało mi się wysłać na serwer – DavedCusack

1

Problem polega na tym, że kiedy budujesz POST w Androidzie, nadpisujesz encję (ciało). Najpierw ustawiłeś go, a następnie ustawiasz go ponownie, skutecznie czyszcząc to, co już ustawiłeś.

ta jest poprawna:

httpPost.setEntity(new UrlEncodedFormEntity(postparams)); 

Ale potem kilka linii później nad napisać go z:

httpPost.setEntity(new StringEntity("UTF-8")); 

Więc rowu że 2nd setEntity() połączenia.

Można osiągnąć to, co starasz się zrobić - ustawienie ciała odpowiedzieć w UTF-8 przez szczypanie swój kod jak:

httpPost.setEntity(new UrlEncodedFormEntity(postparams, HTTP.UTF_8)); 
+0

Dziękuję za odpowiedź Cody, rozumiem, co masz na myśli, i spróbuj go teraz wdrożyć. – DavedCusack

+0

Chociaż jestem pewien, że nad prawidłowością istota nie pomagała, parametry wciąż nie docierają do serwer. Muszę też robić coś niewłaściwie również. Zaktualizuję kod w pytaniu, aby odzwierciedlić to, czego nie używam z – DavedCusack

+0

* Zaktualizuję kod w pytaniu, aby odzwierciedlić to, co aktualnie pracuję z – DavedCusack