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!

1.png


Jadual perbandingan maklumat pengepala permintaan HTTP Permintaan:

Menentukan mekanisme caching yang permintaan dan respons mengikut Kawalan Cache: tanpa cache menunjukkan sama ada sambungan berterusan diperlukan. (HTTP 1.1 menggunakan sambungan berterusan secara lalai) Sambungan: tutupApabila permintaan HTTP dihantar, ia akan disimpan Semua nilai kuki di bawah nama domain yang diminta dihantar ke pelayan web bersama-sama.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 GMTJika 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 berubah Jika-Tiada-Padanan: "737060cd8c284d8af7ad3082f209582d"Jika entiti tidak berubah, bahagian pelayan akan dihantar pelanggan, sebaliknya menghantar keseluruhan entiti.Parameter juga ialah Etagjika entiti adalah Permintaan berjaya hanya jika ia tidak diubah suai selepas masa yang ditetapkanJika-Tidak Diubah-Sejak: Sab, 29 Okt 2010 19:43:31 GMTHadkan masa maklumat dihantar melalui proksi dan get laluanMax-Forwards: 10Digunakan untuk mengandungi arahan khusus pelaksanaanPragma: tiada cache sambungan Sijil kebenaran kepada proksi Kebenaran Proksi: QWxhZGRpbjpvcGVuIHNlc2FtZQ==Julat<🎜 Maklumat amaran tentang entiti mesejAmaran: 199 Amaran Pelbagai

2. Pengepala respons bagi respons HTTP:

Juga memberikan gambar dalam bahagian sebelumnya: PS: Baris pertama ialah: kod status nombor versi protokol 302 bermakna ia tidak tersedia di sini, tetapi ia tersedia di tempat lain, diubah hala melalui halaman Lokasi

2.png

Jadual perbandingan maklumat pengepala respons Respons HTTP:

PengepalaPenjelasanContoh
TerimaNyatakan jenis kandungan yang pelanggan boleh terimaTerima: teks/biasa, teks /html
Accept-CharsetSet pengekodan aksara yang boleh diterima oleh penyemak imbas. Accept-Charset: iso-8859-5
Terima-PengekodanNyatakan pelayan web yang boleh penyemak imbas sokongan Mengembalikan jenis pengekodan mampatan kandungan. Terima-Pengekodan: mampat, gzip
Terima-BahasaBahasa yang boleh diterima penyemak imbasTerima -Bahasa: en,zh
Julat-TerimaBoleh meminta satu atau lebih medan sub-julat entiti halaman web Julat-Terima: bait
KeizinanSijil kebenaran untuk kebenaran HTTPKeizinan: QWxhZGRpbHQpvc=GV Asas 🎜>
Kawalan Cache
Sambungan
KukiKuki: $Version=1; Skin=new;
Panjang KandunganPanjang kandungan yang diminta Panjang Kandungan: 348
Jenis KandunganMaklumat MIME yang diminta sepadan dengan entiti Kandungan -Jenis: application/x-www-form-urlencoded
TarikhTarikh dan masa permintaan dihantar Tarikh: Sel, 15 Nov 2010 08:12:31 GMT
JangkakanKelakuan pelayan khusus yang diminta Jangkakan : 100-sambung
DariE-mel pengguna yang membuat permintaanDari: user@email.com
HosNyatakan nama domain dan nombor port pelayan yang dimintaHos: www.zcmhi.com< . >
Jika-Diubah-Sejak
Jika-Tiada-Padanan
Julat-JikaJulat-Jika: "737060cd8c284d8af7ad3082f209582d"
Jika-Tidak Diubahsuai-Sejak
Max-Forwards
Pragma
Kebenaran Proksi
>Hanya sebahagian daripada entiti diminta, Nyatakan julatJulat: bait=500-999
PerujukAlamat halaman web sebelumnya, diikuti dengan halaman web semasa yang diminta Selepas itu, cara untuk pergiPerujuk: http://blog.csdn.net/coder_pig
TE Pengekodan pemindahan yang pelanggan sanggup terima dan memberitahu pelayan untuk menerima maklumat pengepala tambah ekorTE: treler,deflate ;q=0.5
Naik tarafTentukan protokol pengangkutan ke pelayan untuk penukaran (jika disokong)Naik taraf: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
User-AgentKandungan User-Agent mengandungi maklumat pengguna yang membuat permintaanEjen Pengguna: Mozilla/5.0 (Linux; X11 )
MelaluiBeritahu alamat gerbang perantaraan atau pelayan proksi, protokol komunikasiMelalui: 1.0 fred, 1.1 nowhere com (Apache/1.1)
Amaran<. 🎜>
< akan dikembalikan Benarkan: GET, HEADBeritahu semua mekanisme caching sama ada ia boleh dicache dan jenis Kawalan Cache: tiada cacheJenis pengekodan mampatan kandungan yang dikembalikan yang disokong oleh pelayan webPengekodan Kandungan: gzipBahasa badan tindak balasBahasa Kandungan: en, zh Panjang badan tindak balasPanjang Kandungan: 348Minta alamat alternatif untuk sumberLokasi Kandungan: /index.htmMengembalikan nilai semakan MD5 sumberKandungan-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==>Kedudukan bait bahagian ini dalam keseluruhan kandungan kembaliJulat-Kandungan: bait 21010-47021/47022Mengembalikan jenis MIME kandunganContent-Type: text/html charset=utf-8Masa apabila mesej pelayan asal dihantarTarikh: Sel, 15 Nov 2010 08:12:31 GMT Nilai semasa teg entiti pembolehubah permintaanETag: "737060cd8c284d8af7ad3082d209>"🎜 Tamat tempohTerakhir DiubahsuaiLokasi
PengepalaPenjelasanContoh
Julat-TerimaMenunjukkan sama ada pelayan menyokong permintaan julat yang ditentukan dan jenis permintaan yang tersegmenTerima - Julat: bait
UmurAnggaran masa dalam saat dari pelayan asal kepada pembentukan cache proksi Umur: 12
BenarkanGelagat permintaan yang sah untuk sumber rangkaian tertentu Jika tidak dibenarkan, 405
Cache-Control
Pengekodan Kandungan
Bahasa-Kandungan
Panjang Kandungan
Lokasi Kandungan
Kandungan-MD5
Julat-Kandungan
Content-Type
Tarikh
ETag
Tarikh dan masa tamat responsTamat: Kha, 01 Dis 2010 16:00:00 GMT
Masa terakhir diubah suai sumber yang dimintaTerakhir 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
PragmaMengandungi arahan khusus pelaksanaan yang boleh digunakan pada mana-mana penerima dalam rantai tindak balasPragma: tanpa cache
Proxy-AuthenticateIa 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:

3.png

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:

4.png

Output konsol:

5.png

Output penyemak imbas:

6.png

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

7.png

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:

8.png


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