Saya bermasalah dengan mengambil respons Json jika server mengembalikan kesalahan. Lihat detailnya di bawah.
Bagaimana saya melakukan permintaan tersebut
Saya menggunakan java.net.HttpURLConnection
. Saya menyiapkan properti permintaan, lalu saya lakukan:
conn = (HttpURLConnection) url.openConnection();
Setelah itu, ketika request berhasil, saya mendapat respon Json:
br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
sb = new StringBuilder();
String output;
while ((output = br.readLine()) != null) {
sb.append(output);
}
return sb.toString();
... dan masalahnya adalah:
Saya tidak dapat mengambil Json yang diterima ketika server mengembalikan beberapa kesalahan seperti 50x atau 40x ,. Baris berikut menampilkan IOException:
br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
// throws java.io.IOException: Server returned HTTP response code: 401 for URL: www.example.com
Server mengirimkan tubuh dengan pasti, saya melihatnya di alat eksternal Burp Suite:
HTTP/1.1 401 Unauthorized
{"type":"AuthApiException","message":"AuthApiException","errors":[{"field":"email","message":"Invalid username and/or password."}]}
Saya bisa mendapatkan pesan tanggapan (yaitu "Kesalahan Server Internal") dan kode (yaitu "500") menggunakan metode berikut:
conn.getResponseMessage();
conn.getResponseCode();
Tetapi saya tidak dapat mengambil isi permintaan ... mungkin ada beberapa metode yang tidak saya perhatikan di perpustakaan?
sumber
Untuk memperjelas semuanya, inilah kode kerja saya:
sumber
HttpURLConnection.getErrorStream()
(sun.net.www.protocol.http
implementasi) kembalinull
kecualiresponseCode >= 400
, jadi pemeriksaan Anda untuk 299 mungkin salah.String responseBody = br.lines().collect(Collectors.joining());
Ini adalah cara mudah untuk mendapatkan respon sukses dari server seperti PHP echo jika tidak pesan kesalahan.
sumber