koneksi http antara applet Java dan server Django untuk permintaan posting

Saya mencoba mengirim data logging dari applet pemindaian dokumen ke server web yang didukung Django.

Saya sedang menguji menggunakan server web Django sendiri. Saya telah membuat permintaan POST sederhana dengan Java, tetapi server Django menimbulkan kesalahan 500. Saya tidak dapat memperoleh informasi apa pun mengenai kesalahan tersebut. Sepertinya saya tidak bisa menggunakan pydevd untuk memecahkan kode dalam tampilan Django saya (url saya disetel dengan benar - saya dapat menelusuri kode jika saya membuka url dengan browser). Saya tidak memiliki pengaturan debugging pada applet saya, tetapi saya memiliki banyak informasi yang masuk ke konsol. Saya tahu bahwa Django mengirimkan banyak info html bersama dengan kesalahan 500, tetapi applet Java saya melemparkan pengecualian (sebagai respons terhadap kesalahan 500), sebelum ia dapat membaca pesannya.

Ini kode di applet saya -

private boolean log(String scanURL) {

    try {
        String data = "log=" + buffer.toString();
        URL url = new URL(scanURL);
        URLConnection conn = url.openConnection();
        conn.setDoOutput(true);
        OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
        writer.write(data);
        writer.flush();

        // Handle the response
        int responseCode = ((HttpURLConnection) conn).getResponseCode();
        addItem("Http response code " + new Integer(responseCode).toString());
        addItem("creating BufferedReader");
        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String line;
        addItem("reading response");
        while ((line = reader.readLine()) != null) {
            addItem(line);
        }
        addItem("Closing Writer");
        writer.close();
        addItem("Closing Reader");
        reader.close();

        if (responseCode == 200) {
            return true;
            }
        else {
            return false;
        }

    } catch (Exception e) {
        addItem("Error - writing to log failed. " + e);
        return false;
    }

}

Dan tampilan Django saya saat ini -

from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
from cache.shortcuts import permission_required

@login_required
@permission_required('documents.add_documentindex', raise_exception=True)
def save_log(request):
    import pydevd;pydevd.settrace()
    log_text = request.POST['log']
    with open("scanning.log", "a") as f:
        f.write(log_text)
    return HttpResponse('ok')

Saya kira saya perlu melakukan beberapa pekerjaan pada header http, tetapi tanpa sedikit info lebih lanjut dari Django, pengetahuan saya tentang http adalah cacat besar.

Saran apa pun agar ini berfungsi, atau bahkan mendapatkan lebih banyak informasi tentang kesalahan 500 server Django akan sangat dihargai!

UPDATE Stacktrace dari pengecualian Java adalah sebagai berikut

java.io.IOException: Server returned HTTP response code: 500 for URL: http://10.0.0.68:8000/scanning_log
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at co.altcom.cache.scanner.CacheScan.log(CacheScan.java:408)
    at co.altcom.cache.scanner.CacheScan.createLog(CacheScan.java:385)
    at co.altcom.cache.scanner.CacheScan.destroy(CacheScan.java:70)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: Server returned HTTP response code: 500 for URL: http://10.0.0.68:8000/scanning_log
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at java.net.HttpURLConnection.getResponseCode(Unknown Source)
    at co.altcom.cache.scanner.CacheScan.log(CacheScan.java:405)
    ... 4 more

person Aidan Ewen    schedule 29.08.2012    source sumber
comment
"Error - writing to log failed." + e Uh-huh?.. Berpura-puralah kami tidak melihat komputer Anda dan pertimbangkan untuk menambahkan e.printStackTrace(); dan salin/tempel hasilnya.   -  person Andrew Thompson    schedule 29.08.2012
comment
Terima kasih Andrew. Saya telah menambahkan jejak tumpukan. Mungkin hal-hal dari server yang lebih saya minati - sepertinya pengecualian itu selalu diberikan sebagai respons terhadap kesalahan 500. Saya perlu tahu mengapa kesalahan 500 terjadi. Mungkin saya memerlukan alternatif untuk getInputStream, yang akan tetap melihat aliran input tanpa memberikan pengecualian pada respons 500.   -  person Aidan Ewen    schedule 29.08.2012
comment
conn.getInputStream() gagal, tetapi conn.getErrorStream() mengembalikan output yang saya inginkan dari server. (Terima kasih kepada stackoverflow.com/questions/3432263/)   -  person Aidan Ewen    schedule 29.08.2012
comment
Semua hal ini seperti creating BufferedReader - di manakah tepatnya hal itu muncul? Yang manakah baris 405 dari CacheScan.java?   -  person Andrew Thompson    schedule 29.08.2012
comment
Gagal pada BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); Khususnya gagal pada conn.getInputStream(). Saya sekarang telah memperbarui kode sehingga tidak gagal lagi (lihat komentar di atas). Namun konsol Java mogok dengan pesan tentang 'Thread death' atau semacamnya (dan menghilang sebelum saya dapat memperoleh info lebih lanjut - server saya mogok dalam prosesnya!). Saya akan memperbarui ketika saya mendapatkan info lebih lanjut.   -  person Aidan Ewen    schedule 29.08.2012
comment
Kerusakan server saya memberikan jejak tumpukan yang sama dengan bug python terbuka - bugs.python.org/issue14574. (Masih belum mendapatkan info di sisi Java). Mulai bertanya-tanya seberapa dalam lubang kelinci - saya pikir saya harus pergi dan membaca sedikit tentang http dan pemrograman soket.   -  person Aidan Ewen    schedule 29.08.2012
comment
Sepertinya server crash disebabkan oleh menjalankan kode koneksi http dalam metode penghentian atau penghancuran applet. Saya pikir koneksi terputus dan itulah yang menyebabkan server python mogok. menjalankan koneksi di luar metode hentikan atau hancurkan memperbaiki masalah.   -  person Aidan Ewen    schedule 30.08.2012


Jawaban (1)


Pertanyaan awal saya meminta saran untuk mendapatkan informasi lebih lanjut dari server Django. Saya kira jawaban yang saya butuhkan ditemukan di java.io.IOException: Server mengembalikan kode respons HTTP: 500.

Metode getInputStream Java pada objek URLConnection memunculkan pengecualian ketika server mengembalikan kode kesalahan (seperti 500). Solusinya adalah dengan menggunakan getErrorStream sebagai gantinya. Ini mengijinkan saya untuk mengakses informasi kesalahan html yang dihasilkan oleh server Django.

Kode kerja terakhir untuk metode logging applet saya adalah -

public boolean log(String logURL) {

    String charset = "UTF-8";
    String logData = logBuffer.toString();
    OutputStream output = null;
    HttpURLConnection conn = null;
    BufferedReader reader = null;
    InputStream in = null;

    try {
        String query = String.format("log=%s", URLEncoder.encode(logData, charset));
        conn = (HttpURLConnection) new URL(logURL).openConnection();
        conn.setDoOutput(true);
        conn.setRequestProperty("Accept-Charset", charset);
        conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded;charset=" + charset);
        output = conn.getOutputStream();
        output.write(query.getBytes(charset));

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        return false;
    } catch (MalformedURLException e) {
        e.printStackTrace();
        return false;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    } finally {
         if (output != null) try { output.close(); } catch (IOException e) {e.printStackTrace();}
    }

    // Handle the response
    try {
        int responseCode = conn.getResponseCode();
        if (responseCode == 200) {
            in = conn.getInputStream();
        } else {
            in = conn.getErrorStream();
        }
        reader = new BufferedReader(new InputStreamReader(in));
        String line;
        logNote("reading response");
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        reader.close();         
        if (responseCode == 200) {
            return true;
            }
        else {
            return false;
        }

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        return false;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    } finally {
        if (reader != null) try { reader.close(); } catch (IOException e) {e.printStackTrace();}
    }   
}

Menggunakan java.net.URLConnection untuk mengaktifkan dan menangani permintaan HTTP sangat informatif.

Semoga ini bermanfaat bagi orang lain.

person Aidan Ewen    schedule 29.08.2012