En savoir plus sur les en-têtes de requête HTTP et les en-têtes de réponse Android


Introduction à cette section :

Dans la section précédente, nous avons découvert la programmation réseau impliquée dans Android, et avons également appris les concepts de base de Http, et dans cette section, nous Ce que vous devez apprendre, ce sont les en-têtes de requête et les en-têtes de réponse de Http. Bien sûr, vous pouvez traiter cette section comme un document et la consulter lorsque vous en avez besoin. C'est ça!


1. En-tête de requête HTTP :

Publiez ici l'image donnée dans la section précédente. En vous basant sur le tableau ci-dessous, vous pouvez la ressentir par vous-même. Jetons un coup d'œil aux fonctions des en-têtes de requête concernés : PS : La première ligne est la ligne de requête : méthode de requête + nom de la ressource + numéro de version du protocole HTTP De plus, l'en-tête de requête n'en est qu'un pour le serveur. C'est juste une information ou une simple information. Quant à la manière de la traiter, c'est au serveur de décider !

1.png


Tableau de comparaison des informations d'en-tête de requête HTTP :

Informations d'avertissement sur les entités de messageAvertissement : 199 Avertissement divers

2. En-tête de réponse de la réponse HTTP :

Donne également l'image de la section précédente : PS : La première ligne est : le code d'état du numéro de version du protocole 302 signifie qu'il n'est pas disponible ici, mais il est disponible à un autre endroit, redirigé via la page Localisation

2.png

Tableau de comparaison des informations d'en-tête de réponse d'en-tête de réponses HTTP :

En-têteExplicationExemple
AccepterPrécisez le type de contenu que le client peut recevoirAccepter : texte/plain, text /html
Accept-CharsetLe jeu d'encodage de caractères que le navigateur peut accepter. Accept-Charset : iso-8859-5
Accept-EncodingSpécifiez le serveur Web que le navigateur peut support Renvoie le type d'encodage de compression du contenu. Accepter-Encodage : compresser, gzip
Accepter-LangueLangue acceptée par le navigateurAccepter-Language : en,zh
Accepter-RangesPeut demander un ou plusieurs champs de sous-plage d'entités de page Web Plages d'acceptation : octets
AutorisationCertificat d'autorisation pour l'autorisation HTTPAutorisation : de base QWxhZGRpbjpvcGVuIHNlc2FtZQ= =
Cache-ControlSpécifie le mécanisme de mise en cache suivi par les requêtes et les réponses Cache-Control : no-cache
Connexion indique si une connexion persistante est requise. (HTTP 1.1 utilise des connexions persistantes par défaut) Connexion : fermer
CookieLorsque la requête HTTP est envoyée, il sera enregistré. Toutes les valeurs des cookies sous le nom de domaine demandé sont envoyées ensemble au serveur Web.Cookie : $Version=1; Skin=new;
Content-LengthLongueur du contenu demandé Content-Length : 348
Content-TypeLes informations MIME demandées correspondant à l'entité Contenu -Type : application/x-www-form-urlencoded
DateLa date et l'heure d'envoi de la demande Date : mar 15 novembre 2010 08:12:31 GMT
Attendez-vousComportement de serveur spécifique demandé Attendez-vous : 100-continuer
DeE-mail de l'utilisateur qui a fait la demandeDe : user@email.com
HôtePrécisez le nom de domaine et le numéro de port du serveur demandéHôte : www.zcmhi.com
If-MatchValable uniquement si le contenu de la demande correspond à l'entitéIf-Match : "737060cd8c284d8af7ad3082f209582d"
If-Modified-SinceSi la partie demandée est modifiée après le délai spécifié, la demande est réussie. Si elle n'est pas modifiée, un. Le code 304 est renvoyéIf-Modified-Since : samedi 29 octobre 2010 19:43:31 GMT
If-None-Match Si le contenu n'est pas Le changement renvoie un code 304. Le paramètre est l'Etag précédemment envoyé par le serveur Comparez-le avec l'Etag répondu par le serveur pour déterminer s'il a changé If-None-Match : "737060cd8c284d8af7ad3082f209582d"
If-RangeSi l'entité n'a pas changé, le serveur envoie la partie manquante de le client, sinon envoie l'entité entière.Le paramètre est également EtagIf-Range: "737060cd8c284d8af7ad3082f209582d"
If-Unmodified-SinceSeulement si le l'entité est La demande n'est réussie que si elle n'a pas été modifiée après l'heure spécifiéeIf-Unmodified-Since : samedi 29 octobre 2010 19:43:31 GMT
Max-Forwards Limiter la durée pendant laquelle les informations sont envoyées via des proxys et des passerellesMax-Forwards : 10
PragmaUtilisé pour contenir des directives spécifiques à l'implémentationPragma : no-cache
Autorisation proxy Certificat d'autorisation de connexion au proxy Proxy-Autorisation : Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Plage Seule une partie de l'entité est demandée, Spécifiez la plagePlage : bytes=500-999
RéférentL'adresse de la page web précédente, suivie de la page web actuellement demandée. Après cela, la marche à suivreRéférent : http://blog.csdn.net/coder_pig
TE Le codage de transfert que le client est prêt à accepter et informe le serveur d'accepter la queue et les informations d'en-têteTE : trailers,deflate ;q=0.5
Mise à niveauSpécifiez un protocole de transport vers le serveur pour la conversion (si pris en charge)Mise à niveau : HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
User-AgentLe contenu de User-Agent contient le informations sur l'utilisateur qui a fait la demandeUser-Agent : Mozilla/5.0 (Linux; X11)
ViaNotifier l'adresse de la passerelle intermédiaire ou du serveur proxy, le protocole de communicationVia : 1.0 fred, 1.1 nulle part com (Apache/1.1)
Attention<. 🎜>
< sera renvoyé 🎜>. Autoriser : GET, HEADDites à tous les mécanismes de mise en cache s'ils peuvent être mis en cache et de quel type Cache-Control : no-cacheLe type d'encodage de compression de contenu renvoyé pris en charge par le serveur WebContent-Encoding : gzipLangue du corps de la réponseContent-Language : en, zh La longueur du corps de la réponseContent-Length : 348Demander une adresse alternative pour la ressourceContent-Location : /index.htmRenvoie la valeur de contrôle MD5 de la ressourceContent-MD5 : Q2hlY2sgSW50ZWdyaXR5IQ==La position en octets de cette partie dans tout le corps de retourContent-Range : octets 21010-47021/47022Renvoie le type MIME du contenuContent-Type : text/html charset=utf-8Heure à laquelle le message original du serveur a été envoyéDate : mar. 15 novembre 2010 08:12:31 GMT La valeur actuelle de la balise d'entité de la variable de requêteETag : "737060cd8c284d8af7ad3082f209582d"La date et l'heure d'expiration de la réponseExpire : jeu. 1 décembre 2010 16:00:00 GMTL'heure de la dernière modification de la ressource demandéeDernière modification : mar. 15 novembre 2010 12 : 45h26 GMT
En-têteExplicationExemple
Accept-RangesIndique si le serveur prend en charge les requêtes de plage spécifiées et quel type de requêtes segmentéesAccepter - Plages : octets
ÂgeDurée estimée en secondes entre le serveur d'origine et la formation du cache proxy Âge : 12
AutoriserUn comportement de requête valide pour une certaine ressource réseau S'il n'est pas autorisé, 405
Cache-Control
Content-Encoding
Content-Language
Content-Length
Content-Location
Content-MD5
Content-Range
Content-Type
Date
ETag
Expire
Dernière modification
LocalisationUtilisé pour rediriger le destinataire vers l'emplacement de l'URL non demandée pour compléter la demande ou identifier une nouvelle ressource Emplacement : http://blog.csdn.net/coder_pig
PragmaContient des instructions spécifiques à l'implémentation qui peuvent être appliquées à n'importe quel récepteur dans la chaîne de réponsePragma : sans cache
Proxy-AuthenticateIl indique le schéma d'authentification et les paramètres sur cette URL qui peuvent être appliqués au proxy Authentification par proxy : de base

3. Le rôle de l'en-tête de réponse de vérification du code :

D'accord, après avoir lu tant de concepts, comment puis-je le faire sans le faire ? Bon, alors écrivons un code simple pour vérifier certains Jetons un coup d'œil aux fonctions des en-têtes de réponse couramment utilisés afin d'approfondir notre compréhension. Ici, le serveur utilisera le servlet le plus simple pour l'implémenter. Les amis Web Java n'ont qu'à copier le code, configurer web.xml et ajouter le nom de la classe Servlet, tel que :

FirstServletcom.jay.server.FirstServletFirstServlet/FirstServlet

au nom de la classe correspondante !


1) Implémenter la redirection de page via l'emplacement

Code d'implémentation :

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);
	}
}

Résultat d'exécution :

Lorsque nous visitons : http://localhost:8080/HttpTest/ServletOne, nous constaterons que la page passe à Baidu, Ensuite, nous utilisons les outils de développement de FireFox : vous pouvez voir le contenu du HTTP que nous avons envoyé :

3.png

2) Indiquez au navigateur le format de compression des données via Content-Encoding

Code d'implémentation :

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);
	};
}

Résultat d'exécution :

4.png

Sortie de la console :

5.png

Sortie du navigateur :

6.png

Cette chaîne compressée gzip n'est pas efficace pour une simple compression de chaîne. Par exemple, Xiaozhu à l'origine. a écrit une série de poèmes sur une nuit tranquille. Plus tard, j'ai découvert que la taille compressée était encore plus grande que celle d'origine =-=...


3) Définissez le type de données renvoyé via content-type

Ce que le serveur renvoie peut parfois être un texte/html, parfois une image/jpeg, ou encore une vidéo/avi. Le navigateur peut afficher les données de différentes manières selon le type de données correspondant ! D'accord, nous obtenons ici une lecture PDF

code d'implémentation  :

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);
	};
}

Résultats en cours d'exécution :

Entrez sur le navigateur : http://localhost:8080/HttpTest/ServletThree

D'accord, vous pouvez lire le PDF. D'ailleurs, j'ai déjà perdu ce PDF dans le répertoire de fichiers de la racine Web, sinon il signalera. un pointeur nul~:

Bien sûr, vous pouvez aussi essayer de lire un morceau de musique ou une vidéo, il suffit de modifier le paramètre content-type

Au fait, voici le contenu HTTP- Tableau de comparaison des types : Tableau de comparaison des types de contenu HTTP

7.png

4) Utilisez l'en-tête de réponse d'actualisation pour laisser le navigateur passer à une autre page après quelques secondes

Eh bien, en général, nous pouvons avoir un tel besoin, par exemple Actualiser toutes les quelques secondes la page toutes les secondes, ou quelques secondes après le chargement d'une page Passer à une autre page, puis l'actualisation peut répondre à vos besoins ~

Code d'implémentation :

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);
	};
}

Exécuter le résultat :

Si
  • 1 rafraîchit la page toutes les 2 secondes, on voit que le nombre affiché augmente, et la méthode doGet est également appelée tout le temps. La page de description est vraiment rafraîchie !
  • 2 : 5 secondes après avoir accédé à la page, vous accéderez à Baidu~

5) Laissez le navigateur télécharger le fichier via la réponse de disposition de contenu header

C'est très simple. Il suffit de supprimer la ligne qui définit Content-type dans ③, puis d'ajouter : resp.setHeader("content-disposition", "attachment; filename=Android .pdf");

Code d'implémentation :

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);
	}
}

Résultat d'exécution :

8.png


Résumé de cette section :

Cette section vous présente les en-têtes de requête et les en-têtes de réponse dans HTTP, et écrit également quelques conseils sur l'ajustement des navigateurs. avec en-têtes de réponse Quelques exemples, Je pense qu'après ce chapitre, tout le monde comprendra mieux le protocole HTTP. Dans la section suivante, nous découvrirons le protocole HTTP fourni par Android. Méthode de requête : HttpURLConnection ! D'accord, c'est tout pour cette section, merci ~ Au fait, téléchargez la démo de cette section : Télécharger HttpTest.zip