ANDROID - Problem z wystreamowaniem tablicy byte do servletu

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:

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:

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();
        }
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?

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.

0

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

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.

0

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

0

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

0

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

0

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

0

zawartość getErrorStrem:

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

0

miało być 150kb

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...

1 użytkowników online, w tym zalogowanych: 0, gości: 1