Saya mencoba mengirim permintaan posting ke url menggunakan HttpURLConnection (untuk menggunakan cUrl di java). Isi permintaannya adalah xml dan pada titik akhir, aplikasi memproses xml dan menyimpan record ke database dan kemudian mengirimkan kembali respon dalam bentuk string xml. Aplikasi dihosting di apache-tomcat secara lokal.
Ketika saya menjalankan kode ini dari terminal, baris akan ditambahkan ke db seperti yang diharapkan. Tapi pengecualian dilemparkan sebagai berikut saat mendapatkan InputStream dari koneksi
java.io.FileNotFoundException: http://localhost:8080/myapp/service/generate
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1401)
at org.kodeplay.helloworld.HttpCurl.main(HttpCurl.java:30)
Ini kodenya
public class HttpCurl {
public static void main(String [] args) {
HttpURLConnection con;
try {
con = (HttpURLConnection) new URL("http://localhost:8080/myapp/service/generate").openConnection();
con.setRequestMethod("POST");
con.setDoOutput(true);
con.setDoInput(true);
File xmlFile = new File("test.xml");
String xml = ReadWriteTextFile.getContents(xmlFile);
con.getOutputStream().write(xml.getBytes("UTF-8"));
InputStream response = con.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(response));
for (String line ; (line = reader.readLine()) != null;) {
System.out.println(line);
}
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Ini membingungkan karena pengecualian dilacak ke baris InputStream response = con.getInputStream();
dan sepertinya tidak ada file yang terlibat untuk FileNotFoundException.
Saat saya mencoba membuka koneksi ke file xml secara langsung, pengecualian ini tidak muncul.
Aplikasi layanan menggunakan framework spring dan Jaxb2Marshaller untuk membuat xml respons.
Kelas ReadWriteTextFile diambil dari sini
Terima kasih.
Sunting: Ini menyimpan data dalam DB dan mengirimkan kembali kode status respons 404 pada saat yang sama.
Saya juga mencoba melakukan curl menggunakan php dan mencetak CURLINFO_HTTP_CODE
yang ternyata 200.
Ada ide tentang bagaimana cara men-debug ini? Baik layanan dan klien berada di server lokal.
Terselesaikan: Saya bisa menyelesaikan masalah setelah mengacu pada jawaban di SO itu sendiri.
Tampaknya HttpURLConnection selalu mengembalikan respons 404 saat menyambungkan ke url dengan port non standar.
Menambahkan garis-garis ini menyelesaikannya
con.setRequestProperty("User-Agent","Mozilla/5.0 ( compatible ) ");
con.setRequestProperty("Accept","*/*");
Jawaban:
Saya tidak tahu tentang kombinasi Spring / JAXB Anda, tetapi rata-rata webservice REST tidak akan mengembalikan tubuh respons pada POST / PUT, hanya status respons . Anda ingin menentukannya, bukan tubuhnya.
Menggantikan
oleh
Semua kode status yang tersedia dan artinya tersedia dalam spesifikasi HTTP, seperti yang ditautkan sebelumnya. Layanan web itu sendiri juga harus disertai dengan beberapa dokumentasi yang meninjau semua kode status yang didukung oleh layanan web dan arti khususnya, jika ada.
Jika status dimulai dengan
4nn
atau5nn
, Anda ingin menggunakangetErrorStream()
untuk membaca isi respons yang mungkin berisi detail kesalahan.sumber
getErrorStream()
seperti yang disarankan. Ini akan memunculkan NullPointerExceptionnew InputStreamReader(con.getErrorStream())
.URLConnection
menjadi masalah. Saya bertanya-tanya mengapa orang-orang Java tidak hanya menerapkangetInputStream()
diHttpUrlConnection
sepanjang barisreturn responseCode == 200 ? super.getInputStream() : this.getErrorStream()
. Tapi bagaimanapun; jawaban informatif, +1.FileNotFound
hanyalah pengecualian yang tidak menguntungkan yang digunakan untuk menunjukkan bahwa server web mengembalikan 404.sumber
getResponseCode()
sebelum menelepongetInputStream()
.Bagi siapa pun yang memiliki masalah ini di masa mendatang, alasannya adalah karena kode statusnya adalah 404 (atau dalam kasus saya adalah 500). Tampaknya
InpuStream
fungsi tersebut akan menampilkan kesalahan saat kode status bukan 200.Dalam kasus saya, saya mengontrol server saya sendiri dan mengembalikan kode status 500 untuk menunjukkan kesalahan terjadi. Meskipun saya juga mengirim tubuh dengan pesan string yang merinci kesalahan, itu
inputstream
melemparkan kesalahan terlepas dari tubuh itu benar-benar dapat dibaca.Jika Anda mengontrol server Anda, saya kira ini dapat ditangani dengan mengirimkan kode status 200 kepada diri Anda sendiri dan kemudian menangani apa pun respons kesalahan string itu.
sumber
Untuk orang lain yang tersandung ini, hal yang sama terjadi pada saya ketika mencoba mengirim header permintaan SOAP ke layanan SOAP. Masalahnya adalah urutan kode yang salah, saya meminta aliran input terlebih dahulu sebelum mengirim badan XML. Dalam kode yang dipotong di bawah ini, baris
InputStream in = conn.getInputStream();
muncul segera setelahByteArrayOutputStream out = new ByteArrayOutputStream();
itu adalah urutan yang salah.FileNotFound
dalam hal ini adalah cara yang tidak menguntungkan untuk menyandikan kode respons HTTP 400.sumber
new ByteArrayOutputStream()
tidak ada hubungannya sama sekali. Masalahnya adalah urutan antaragetInputStream()
dangetResponseCode()
.FileNotFound dalam hal ini berarti Anda mendapat 404 dari server Anda - mungkinkah server tidak menyukai permintaan "POST"?
sumber
Solusinya:
ganti saja localhost untuk IP PC anda
jika ingin mengetahui ini: Windows + r> cmd> ipconfig
contoh: http: // 192.168.0.107 /directory/service/program.php?action=sendSesuatu yang
baru ganti 192.168 .0.107 untuk IP Anda sendiri (jangan coba 127.0.0.1 karena sama dengan localhost )
sumber
Tolong ganti
Untuk
sumber