使用POST与Ruby Rails服务器通信Android客户端时出错406

时间:2016-01-26 15:12:49

标签: android ruby-on-rails http post

这是我的第一个问题。我和我的朋友在Android手机和rails服务器上的ruby之间的通信有问题。我有两个类进行通信,一个只是向服务器发送数据,一个正常工作,但是第二个发送和接收数据的例子是错误406的例外。一切都在LAN网络上工作。如果我在日志中删除错误406的异常,我可以找到java.io.FileNotFoundException:http://192.168.0.104:3000/moments/send_status

下面是类的代码:

 private class WebServiceOdbierz extends  AsyncTask<String, Void, String>{
    // okienko dialogowe, które każe użytkownikowi czekać
    private ProgressDialog dialog = new ProgressDialog(MainActivity.this);

    // metoda wykonywana jest zaraz przed główną operacją (doInBackground())
    // mamy w niej dostęp do elementów UI
    @Override
    protected void onPreExecute() {
        // wyświetlamy okienko dialogowe każące czekać
        dialog.setMessage("Czekaj...");
        dialog.show();

    }

    // główna operacja, która wykona się w osobnym wątku
    // nie ma w niej dostępu do elementów UI
    @Override
    protected String doInBackground(String... urls) {

        try {
            // zakładamy, że jest tylko jeden URL
            URL url = new URL(urls[0]);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            // timeout w ms
            connection.setReadTimeout(3000);
            connection.setConnectTimeout(4000);
            // zezwolenie na wysyłanie danych
            connection.setDoOutput(true);
            // ustawienie typu wysyłanych danych
            connection.setRequestProperty("Content-Type", "application/json;");
            //ustawienie metody
            connection.setRequestMethod("POST");
            // stworzenie obiektu do wysłania
            JSONObject data = new JSONObject();
            data.put("zrodlo",zrodlo);
            data.put("wartosc", "wszystko");
            data.put("moment", "100");

            //if(tryb == "true") {

            // wysłanie obiektu
            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(connection.getOutputStream(),
                            "UTF-8"));
            writer.write(data.toString());
            writer.close();

            // }

            //////////////////////////////////////////
            // na tym etapie obiekt został wysłany
            // i dostaliśmy odpowiedź serwera
            //////////////////////////////////////////
            if (connection.getResponseCode() == 406) {
                throw new Exception("blad 406");
            }

            // sprawdzenie kodu odpowiedzi, 200 = OK


            // pobranie danych do InputStream
            InputStream in = new BufferedInputStream(
                    connection.getInputStream());

            // konwersja InputStream na String
            // wynik będzie przekazany do metody onPostExecute()
            return streamToString(in);

        } catch (Exception e) {
            // obsłuż wyjątek
            Log.d(MainActivity.class.getName(), e.toString());
            return null;
        }

    }

    // metoda wykonuje się po zakończeniu metody głównej,
    // której wynik będzie przekazany;
    // w tej metodzie mamy dostęp do UI
    @Override
    protected void onPostExecute(String result) {

        // chowamy okno dialogowe
        dialog.dismiss();
        //////////////////////////////////////////// ODBIOR DANYCH
        try {


            // reprezentacja obiektu JSON w Javie
            JSONObject json = new JSONObject(result);

            //trybRec = json.optString("tryb");
            Temperatura = json.optString("Temperatura");
            CO2 = json.optString("CO2");
            Swiatlo = json.optString("Swiatlo");
            Wilgotnosc = json.optString("Wilgotnosc");
            Lampy = json.optString("Lampy");
            Ogrzewanie = json.optString("Grzejniki");
            Pompa = json.optString("Pompa");
            Rolety = json.optString("Rolety");
            zaworCO2 = json.optString("ZaworCO2");
            // Jak będzie komunikacja działać
            updateLedsAndText();

        } catch (Exception e) {
            // obsłuż wyjątek
            Log.d(MainActivity.class.getName(), e.toString());
        }
    }

}

我尝试将POST更改为GET但没有效果 在工作代码下面:

    private class WebServiceWyslij extends AsyncTask<String, Void, String> {

    // okienko dialogowe, które każe użytkownikowi czekać
    private ProgressDialog dialog = new ProgressDialog(MainActivity.this);

    // metoda wykonywana jest zaraz przed główną operacją (doInBackground())
    // mamy w niej dostęp do elementów UI
    @Override
    protected void onPreExecute() {
        // wyświetlamy okienko dialogowe każące czekać
        dialog.setMessage("Czekaj...");
        dialog.show();

    }

    // główna operacja, która wykona się w osobnym wątku
    // nie ma w niej dostępu do elementów UI
    @Override
    protected String doInBackground(String... urls) {

        try {
            // zakładamy, że jest tylko jeden URL
            URL url = new URL(urls[0]);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            // timeout w ms

            connection.setReadTimeout(5000);
            connection.setConnectTimeout(8000);
            // zezwolenie na wysyłanie danych
            connection.setDoOutput(true);
            // ustawienie typu wysyłanych danych
            connection.setRequestProperty("Content-Type", "application/json;");
            //ustawienie metody
            connection.setRequestMethod("POST");
            // stworzenie obiektu do wysłania
            JSONObject data = new JSONObject();
            data.put("zrodlo",zrodlo);

            data.put("tryb",tryb);
            /*
            data.put("Temperatura", Temperatura);
            data.put("CO2", CO2);
            data.put("Światło", Swiatlo);
            data.put("Wilgotność", Wilgotnosc);
            */

            data.put("moment","2016-01-01 12:00:00");
            data.put("Lampy", Lampy);
            data.put("Rolety", Rolety);
            data.put("Grzejniki", Ogrzewanie);
            data.put("Pompa", Pompa);
            data.put("ZaworCO2", zaworCO2);


                // wysłanie obiektu
                BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(connection.getOutputStream(),
                                "UTF-8"));


                writer.write(data.toString());
                writer.close();



            //////////////////////////////////////////
            // na tym etapie obiekt został wysłany
            // i dostaliśmy odpowiedź serwera
            //////////////////////////////////////////

            // sprawdzenie kodu odpowiedzi, 200 = OK
            if (connection.getResponseCode() != 200) {
                throw new Exception("Bad Request");
            }



            // pobranie danych do InputStream
            InputStream in = new BufferedInputStream(
                    connection.getInputStream());

            // konwersja InputStream na String
            // wynik będzie przekazany do metody onPostExecute()
            if(!(streamToString(in).length()>0)){
                throw new Exception("odebrales pustego stringa");
            }
            return streamToString(in);

        } catch (Exception e) {
            // obsłuż wyjątek
            Log.d(MainActivity.class.getSimpleName(), e.toString());
            return null;
        }

    }

    // metoda wykonuje się po zakończeniu metody głównej,
    // której wynik będzie przekazany;
    // w tej metodzie mamy dostęp do UI
    @Override
    protected void onPostExecute(String result) {

        // chowamy okno dialogowe
        dialog.dismiss();
        //////////////////////////////////////////// ODBIOR DANYCH
        try {
            // reprezentacja obiektu JSON w Javie
            JSONObject json = new JSONObject(result);


        } catch (Exception e) {
            // obsłuż wyjątek
            Log.d(MainActivity.class.getSimpleName(), e.toString());
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您是否尝试添加

connection.setRequestProperty("Accept", "application/json");
设置Content-Type

到你的POST?