ANDROID - Problem z wystreamowaniem tablicy byte do servletu

ANDROID - Problem z wystreamowaniem tablicy byte do servletu
  • Rejestracja: dni
  • Ostatnio: dni
0

Nie dochodzi stream do servletu. Gdy jest podpiety debugiem i iteruje linia po linia to działa, natomiast przy normalnym urchomieniu nie.

Kod Servletu:

Kopiuj
protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String jsonString = null;
        InputStream inputStream = request.getInputStream();
        BufferedReader bufferReader = new BufferedReader(new InputStreamReader(inputStream));
        jsonString = bufferReader.readLine();
System.out.println(jsonString);
}

Kod aplikacji android wysyłającej do servletu:

Kopiuj
HttpsURLConnection outConnection = null;
        try {
            URL url = new URL(HttpRequestUtils.getUrlForNewPlaceSaving());
            outConnection = (HttpsURLConnection) url.openConnection();
            outConnection.setRequestProperty(HttpHeaders.AUTHORIZATION, HttpRequestUtils.getAuthorizationHeader());
            outConnection.setRequestMethod("POST");
            outConnection.setDoInput(true);
            outConnection.setDoOutput(true);
            outConnection.setUseCaches(false);
            outConnection.setDefaultUseCaches(false);
            outConnection.setReadTimeout(HttpRequestUtils.RESPONSE_TIMEOUT);
            outConnection.connect();

            OutputStream outputStream = outConnection.getOutputStream();
            outputStream.write(jsonString.getBytes());
            outputStream.flush();
           // outputStream.close();

            int responseCode = outConnection.getResponseCode();
            listener.onResponse(responseCode);
        } catch (Exception ex) {
            System.out.println("ERROR:  " + ex);
            listener.onResponse(500);
        } finally {
            outConnection.disconnect();
        }
xxx_xx_x
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 365
0

po metodzie flush dodaj outputStream.close() przed pobraniem response code.
Dodatkowo ustawiasz doInput oraz doOutput na true, wiec oba strumienie powinieneś otworzyć i zamknąć.

sprawdź jeszcze czy nie leci ci wyjątek ponieważ to uruchomi metodę disconnect, jeżeli dane nie zdążą zostać wysłane to nigdy nie dotrą do servletu.

Upewnij się czy dostajesz response code == 200, jeżeli nie to jaki?

  • Rejestracja: dni
  • Ostatnio: dni
0

Zrobiłem tak jak piszesz ten sam efekt, jak lece debugiem to działa a jak normalnie to nie wygląa jakby zamykał połączenie przed wysłaniem albo coś bo teoretycznie wchodzi do serwletu ale nie zdąży on nic odebrać zawartość streama jest pusta i zwrotka do aplikacji jest kod 500.

LP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 366
0

Za https://stackoverflow.com/questions/9767952/how-to-add-parameters-to-httpurlconnection-using-post-using-namevaluepair# . Na pierwszy rzut oka brakuje

Kopiuj
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));

Dodatkowo w jsonString.getBytes() nie wiem czy tutaj nie możesz mieć błędu z charsetem.

Takie operacje które próbujesz zrobić można w bardzo prosty sposób zrealizować przy pomocy Retrofita + Gson / Moshi: http://square.github.io/retrofit/ sekcja REQUEST BODY.

  • Rejestracja: dni
  • Ostatnio: dni
0

po przerobce dalej to samo, i na debugu znowu działą a gdy puszcze normalnie nie działa

LP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 366
0

Co dostajesz w logach z System.out.println("ERROR: " + ex); ?

  • Rejestracja: dni
  • Ostatnio: dni
0

nie wchodzi do catch, ale na getResponseCode zwraca 500 z tego co pologowałem dodatkowo to outpustream zwraca null przy czytaniu

xxx_xx_x
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 365
0

Jeżeli masz kod 500 to oznacza że masz odpowiedź od serwera. Odczytaj co zwraca outConnection.getErrorStream

  • Rejestracja: dni
  • Ostatnio: dni
0

zawartość getErrorStrem:

Kopiuj
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/>
<title>Error 500 </title>
</head>
<body>
<h2>HTTP ERROR: 500</h2>
<p>Problem accessing /servlets/uploadImage. Reason:
<pre>    java.io.IOException</pre></p>
<hr /><i><small>Powered by Jetty://</small></i>
</body>
</html>
  • Rejestracja: dni
  • Ostatnio: dni
0

dodam że wysyłany json ma około 15kb i w przyszłości będzie miał więcej bo zawiera tablice byte obrazków plus stringi opisujące obraz

  • Rejestracja: dni
  • Ostatnio: dni
0

miało być 150kb

  • Rejestracja: dni
  • Ostatnio: dni
0

dodałem Thread.sleep(500) przed odczytem ze streamu i wtedy działa. Wygląda jakby servlet byłby wołany przed napłynięciem danych. Jakiś patent na to jest? bo mega słabo robić sleep który pewnie przy większych danych mógłby być za mały...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.