Mempelajari tentang pengepala permintaan Android Http dan pengepala respons
Pengenalan kepada bahagian ini:
Dalam bahagian sebelumnya kami mempelajari tentang pengaturcaraan rangkaian yang terlibat dalam Android, dan juga mempelajari konsep asas Http, dan dalam bahagian ini kami Apa yang anda perlu pelajari ialah pengepala permintaan dan pengepala respons Http Sudah tentu, anda boleh menganggap bahagian ini sebagai dokumen dan menyemaknya apabila anda memerlukannya. Itu sahaja!
1. Tajuk permintaan HTTP:
Siarkan gambar yang diberikan di bahagian sebelumnya di sini Berdasarkan jadual yang diberikan di bawah, anda boleh merasainya sendiri Mari kita lihat fungsi pengepala permintaan yang berkaitan: PS: Baris pertama ialah baris permintaan: kaedah permintaan + nama sumber + nombor versi protokol HTTP Selain itu, pengepala permintaan hanya satu untuk pelayan. Ia hanya maklumat atau yang mudah Mengenai cara memprosesnya, terpulang kepada pelayan untuk membuat keputusan!
Jadual perbandingan maklumat pengepala permintaan HTTP Permintaan:
Pengepala | Penjelasan | Contoh |
---|---|---|
Terima | Nyatakan jenis kandungan yang pelanggan boleh terima | Terima: teks/biasa, teks /html |
Accept-Charset | Set pengekodan aksara yang boleh diterima oleh penyemak imbas. | Accept-Charset: iso-8859-5 |
Terima-Pengekodan | Nyatakan pelayan web yang boleh penyemak imbas sokongan Mengembalikan jenis pengekodan mampatan kandungan. | Terima-Pengekodan: mampat, gzip |
Terima-Bahasa | Bahasa yang boleh diterima penyemak imbas | Terima -Bahasa: en,zh |
Julat-Terima | Boleh meminta satu atau lebih medan sub-julat entiti halaman web | Julat-Terima: bait |
Keizinan | Sijil kebenaran untuk kebenaran HTTP | Keizinan: QWxhZGRpbHQpvc=GV Asas 🎜> |
Kawalan Cache | Menentukan mekanisme caching yang permintaan dan respons mengikutKawalan Cache: tanpa cache | |
Sambungan | menunjukkan sama ada sambungan berterusan diperlukan. (HTTP 1.1 menggunakan sambungan berterusan secara lalai)Sambungan: tutup | |
Kuki | Apabila permintaan HTTP dihantar, ia akan disimpan Semua nilai kuki di bawah nama domain yang diminta dihantar ke pelayan web bersama-sama.Kuki: $Version=1; Skin=new; | |
Panjang Kandungan | Panjang kandungan yang diminta | Panjang Kandungan: 348 |
Jenis Kandungan | Maklumat MIME yang diminta sepadan dengan entiti | Kandungan -Jenis: application/x-www-form-urlencoded |
Tarikh | Tarikh dan masa permintaan dihantar | Tarikh: Sel, 15 Nov 2010 08:12:31 GMT |
Jangkakan | Kelakuan pelayan khusus yang diminta | Jangkakan : 100-sambung |
Dari | E-mel pengguna yang membuat permintaan | Dari: user@email.com |
Hos | Nyatakan nama domain dan nombor port pelayan yang diminta | Hos: www.zcmhi.com< . > |
Jika-Diubah-Sejak | Jika bahagian yang diminta diubah selepas masa yang ditetapkan, permintaan itu berjaya Jika ia tidak diubah, a Kod 304 dikembalikanIf-Modified-Sejak: Sab, 29 Okt 2010 19:43:31 GMT | |
Jika-Tiada-Padanan | Jika kandungan bukan Perubahan mengembalikan kod 304 Parameter ialah Etag yang dihantar oleh pelayan sebelum ini dengan Etag yang dijawab oleh pelayan untuk menentukan sama ada ia telah berubahJika-Tiada-Padanan: "737060cd8c284d8af7ad3082f209582d" | |
Julat-Jika | Jika entiti tidak berubah, bahagian pelayan akan dihantar pelanggan, sebaliknya menghantar keseluruhan entiti.Parameter juga ialah EtagJulat-Jika: "737060cd8c284d8af7ad3082f209582d" | |
Jika-Tidak Diubahsuai-Sejak | jikaentiti adalah Permintaan berjaya hanya jika ia tidak diubah suai selepas masa yang ditetapkan | Jika-Tidak Diubah-Sejak: Sab, 29 Okt 2010 19:43:31 GMT |
Max-Forwards | Hadkan masa maklumat dihantar melalui proksi dan get laluan | Max-Forwards: 10 |
Pragma | Digunakan untuk mengandungi arahan khusus pelaksanaan | Pragma: tiada cache |
Kebenaran Proksi | sambungan Sijil kebenaran kepada proksi | Kebenaran Proksi: QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
> | Julat<🎜Hanya sebahagian daripada entiti diminta, Nyatakan julat | Julat: bait=500-999 |
Perujuk | Alamat halaman web sebelumnya, diikuti dengan halaman web semasa yang diminta Selepas itu, cara untuk pergi | Perujuk: http://blog.csdn.net/coder_pig |
TE | Pengekodan pemindahan yang pelanggan sanggup terima dan memberitahu pelayan untuk menerima maklumat pengepala tambah ekor | TE: treler,deflate ;q=0.5 |
Naik taraf | Tentukan protokol pengangkutan ke pelayan untuk penukaran (jika disokong) | Naik taraf: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
User-Agent | Kandungan User-Agent mengandungi maklumat pengguna yang membuat permintaan | Ejen Pengguna: Mozilla/5.0 (Linux; X11 ) |
Melalui | Beritahu alamat gerbang perantaraan atau pelayan proksi, protokol komunikasi | Melalui: 1.0 fred, 1.1 nowhere com (Apache/1.1) |
Amaran<. 🎜> | Maklumat amaran tentang entiti mesejAmaran: 199 Amaran Pelbagai |
Pengepala | Penjelasan | Contoh |
---|---|---|
Julat-Terima | Menunjukkan sama ada pelayan menyokong permintaan julat yang ditentukan dan jenis permintaan yang tersegmen | Terima - Julat: bait |
Umur | Anggaran masa dalam saat dari pelayan asal kepada pembentukan cache proksi | Umur: 12 |
Benarkan | Gelagat permintaan yang sah untuk sumber rangkaian tertentu Jika tidak dibenarkan, 405 | < akan dikembalikan Benarkan: GET, HEAD|
Cache-Control | Beritahu semua mekanisme caching sama ada ia boleh dicache dan jenisKawalan Cache: tiada cache | |
Pengekodan Kandungan | Jenis pengekodan mampatan kandungan yang dikembalikan yang disokong oleh pelayan webPengekodan Kandungan: gzip | |
Bahasa-Kandungan | Bahasa badan tindak balasBahasa Kandungan: en, zh | |
Panjang Kandungan | Panjang badan tindak balasPanjang Kandungan: 348 | |
Lokasi Kandungan | Minta alamat alternatif untuk sumberLokasi Kandungan: /index.htm | |
Kandungan-MD5 | Mengembalikan nilai semakan MD5 sumberKandungan-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== | > |
Julat-Kandungan | Kedudukan bait bahagian ini dalam keseluruhan kandungan kembaliJulat-Kandungan: bait 21010-47021/47022 | |
Content-Type | Mengembalikan jenis MIME kandunganContent-Type: text/html charset=utf-8 | |
Tarikh | Masa apabila mesej pelayan asal dihantarTarikh: Sel, 15 Nov 2010 08:12:31 GMT | |
ETag | Nilai semasa teg entiti pembolehubah permintaanETag: "737060cd8c284d8af7ad3082d209>"🎜 | |
Tarikh dan masa tamat respons | Tamat: Kha, 01 Dis 2010 16:00:00 GMT | |
Masa terakhir diubah suai sumber yang diminta | Terakhir Diubah Suai: Sel, 15 Nov 2010 12:45: 26 GMT | |
Digunakan untuk mengubah hala penerima ke lokasi URL yang tidak diminta untuk melengkapkan permintaan atau mengenal pasti sumber baharu | Lokasi: http://blog.csdn.net/coder_pig | |
Pragma | Mengandungi arahan khusus pelaksanaan yang boleh digunakan pada mana-mana penerima dalam rantai tindak balas | Pragma: tanpa cache |
Proxy-Authenticate | Ia menunjukkan skema pengesahan dan parameter pada URL tersebut yang boleh digunakan pada proksi | Pengesahan Proksi: Asas |
3. Peranan pengepala respons pengesahan kod:
Baiklah, selepas membaca banyak konsep, bagaimana saya boleh melakukannya tanpa melakukannya? Betul, kemudian mari kita tulis beberapa kod mudah untuk mengesahkan beberapa Mari kita lihat fungsi pengepala respons yang biasa digunakan untuk memperdalam pemahaman kita Di sini, pelayan akan menggunakan Servlet yang paling mudah untuk melaksanakannya Rakan Web Java hanya perlu menyalin kod, mengkonfigurasi web.xml dan menambah nama kelas Servlet, seperti:
FirstServletcom.jay.server.FirstServletFirstServlet/FirstServlet
kepada nama kelas yang sepadan!
1) Laksanakan pengalihan halaman melalui Lokasi
Kod pelaksanaan:
package com.jay.http.test; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletOne extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //告诉浏览器响应码,以及重定向页面 resp.setStatus(302); resp.setHeader("Location", "http://www.baidu.com"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
Hasil berjalan:
Apabila kami melawati: http://localhost:8080/HttpTest/ServletOne, kami akan mendapati halaman tersebut melompat ke Baidu, Kemudian kami menggunakan alat pembangun FireFox: anda boleh melihat kandungan HTTP yang kami hantar:
2) Beritahu penyemak imbas format pemampatan data melalui Pengekodan Kandungan
Kod pelaksanaan:
package com.jay.http.test; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.zip.GZIPOutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletTwo extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String data = "Fresh air and sunshine can have an amazing effect on our feelings. " + "Sometimes when we are feeling down, all that we need to do is simply to go " + "outside and breathe. Movement and exercise is also a fantastic way to feel better. " + "Positive emotions can be generated by motion. So if we start to feel down," + " take some deep breathes, go outside, feel the fresh air, " + "let the sun hit our face, go for a hike, a walk, a bike ride, " + "a swim, a run, whatever. We will feel better if we do this."; System.out.println("原始数据长度:" + data.getBytes().length); // 对数据进行压缩: ByteArrayOutputStream bout = new ByteArrayOutputStream(); GZIPOutputStream gout = new GZIPOutputStream(bout); gout.write(data.getBytes()); gout.close(); // 得到压缩后的数据 byte gdata[] = bout.toByteArray(); resp.setHeader("Content-Encoding", "gzip"); resp.setHeader("Content-Length", gdata.length + ""); resp.getOutputStream().write(gdata); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); }; }
Hasil berjalan:
Output konsol:
Output penyemak imbas:
Rentetan termampat gzip ini tidak cekap untuk pemampatan rentetan ringkas Contohnya, Xiaozhu pada asalnya menulis serangkai pantun tentang malam yang hening. Kemudian, saya mendapati bahawa saiz mampat lebih besar daripada yang asal =-=...
3) Tetapkan jenis data yang dikembalikan melalui jenis kandungan
Perkara yang dikembalikan oleh pelayan kadangkala boleh berupa teks/html, kadangkala ia mungkin imej/jpeg, atau ia mungkin video/avi Pelayar boleh memaparkan data dalam cara yang berbeza mengikut jenis data yang sepadan! Okey, di sini kita mendapat bacaan PDF
kod pelaksanaan :
package com.jay.http.test; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletThree extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setHeader("content-type", "application/pdf"); InputStream in = this.getServletContext().getResourceAsStream("/file/android编码规范.pdf"); byte buffer[] = new byte[1024]; int len = 0; OutputStream out = resp.getOutputStream(); while((len = in.read(buffer)) > 0) { out.write(buffer,0,len); } } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException ,IOException { doGet(req, resp); }; }
Hasil yang sedang dijalankan:
Masukkan pada penyemak imbas: http://localhost:8080/HttpTest/ServletThree
Baiklah, anda boleh membaca PDF ini, saya telah kehilangan PDF ini dalam direktori fail webroot, jika tidak, ia akan Laporan penunjuk nol~:
Sudah tentu, anda juga boleh cuba memainkan sekeping muzik atau video, cuma ubah suai parameter jenis kandungan
Sebenarnya, inilah Kandungan HTTP- Jadual perbandingan jenis: Jadual perbandingan jenis kandungan HTTP
4) Gunakan pengepala respons muat semula untuk membenarkan penyemak imbas melompat ke halaman lain selepas beberapa saat
Nah, secara amnya kita mungkin mempunyai keperluan sedemikian, seperti setiap beberapa saat Refresh halaman setiap saat, atau beberapa saat selepas memuatkan halaman Lompat ke halaman lain, kemudian muat semula boleh memenuhi keperluan anda~
Kod pelaksanaan:
package com.jay.http.test; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletFour extends HttpServlet { public int second = 0; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.浏览器每隔2秒定时刷新页面 // resp.setHeader("refresh", "2"); // resp.getWriter().write(++second + ""); // System.out.println("doGet方法被调用~"); //2.进入页面5s后,然页跳到百度~ resp.setHeader("refresh", "5;url='http://www.baidu.com'"); resp.getWriter().write("HE HE DA~"); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException ,IOException { doGet(req, resp); }; }
Jalankan hasil:
Jika
- 1 menyegarkan halaman setiap 2 saat, kita dapat melihat bahawa nombor yang dipaparkan semakin meningkat, dan kaedah doGet juga dipanggil sepanjang masa. Halaman penerangan benar-benar disegarkan!
- 2: 5 saat selepas memasuki halaman, anda akan melompat ke Baidu~
5) Biarkan penyemak imbas memuat turun fail melalui respons pelupusan kandungan pengepala
Ini sangat mudah Kita hanya perlu mengalih keluar baris yang menetapkan Content-type dalam ③, dan kemudian menambah: resp.setHeader("content-disposition", "attachment; filename=Android .pdf");
Kod pelaksanaan:
package com.jay.http.test; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletFive extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setHeader("content-disposition", "attachment;filename=Android.pdf"); InputStream in = this.getServletContext().getResourceAsStream("/file/android编码规范.pdf"); byte buffer[] = new byte[1024]; int len = 0; OutputStream out = resp.getOutputStream(); while((len = in.read(buffer)) > 0) { out.write(buffer,0,len); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
Hasil berjalan:
Ringkasan bahagian ini:
Bahagian ini memperkenalkan anda kepada pengepala permintaan dan pengepala respons dalam Http, dan juga menulis beberapa petua tentang melaraskan penyemak imbas dengan tajuk respons Beberapa contoh, Saya percaya bahawa selepas bab ini, semua orang mempunyai pemahaman yang lebih baik tentang protokol Http Dalam bahagian seterusnya, kita akan mempelajari tentang Http yang disediakan oleh Android. Kaedah permintaan: HttpURLConnection! Okay, itu sahaja untuk bahagian ini, terima kasih~ By the way, muat turun demo bahagian ini: Muat turun HttpTest.zip