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 !
Tableau de comparaison des informations d'en-tête de requête HTTP :
En-tête | Explication | Exemple |
---|---|---|
Accepter | Précisez le type de contenu que le client peut recevoir | Accepter : texte/plain, text /html |
Accept-Charset | Le jeu d'encodage de caractères que le navigateur peut accepter. | Accept-Charset : iso-8859-5 |
Accept-Encoding | Spécifiez le serveur Web que le navigateur peut support Renvoie le type d'encodage de compression du contenu. | Accepter-Encodage : compresser, gzip |
Accepter-Langue | Langue acceptée par le navigateur | Accepter-Language : en,zh |
Accepter-Ranges | Peut demander un ou plusieurs champs de sous-plage d'entités de page Web | Plages d'acceptation : octets |
Autorisation | Certificat d'autorisation pour l'autorisation HTTP | Autorisation : de base QWxhZGRpbjpvcGVuIHNlc2FtZQ= = |
Cache-Control | Spé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 |
Cookie | Lorsque 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-Length | Longueur du contenu demandé | Content-Length : 348 |
Content-Type | Les informations MIME demandées correspondant à l'entité | Contenu -Type : application/x-www-form-urlencoded |
Date | La date et l'heure d'envoi de la demande | Date : mar 15 novembre 2010 08:12:31 GMT |
Attendez-vous | Comportement de serveur spécifique demandé | Attendez-vous : 100-continuer |
De | E-mail de l'utilisateur qui a fait la demande | De : user@email.com |
Hôte | Précisez le nom de domaine et le numéro de port du serveur demandé | Hôte : www.zcmhi.com |
If-Match | Valable uniquement si le contenu de la demande correspond à l'entité | If-Match : "737060cd8c284d8af7ad3082f209582d" |
If-Modified-Since | Si 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-Range | Si 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 Etag | If-Range: "737060cd8c284d8af7ad3082f209582d" |
If-Unmodified-Since | Seulement 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ée | If-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 passerelles | Max-Forwards : 10 |
Pragma | Utilisé pour contenir des directives spécifiques à l'implémentation | Pragma : 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 plage | Plage : bytes=500-999 |
Référent | L'adresse de la page web précédente, suivie de la page web actuellement demandée. Après cela, la marche à suivre | Ré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ête | TE : trailers,deflate ;q=0.5 |
Mise à niveau | Spé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-Agent | Le contenu de User-Agent contient le informations sur l'utilisateur qui a fait la demande | User-Agent : Mozilla/5.0 (Linux; X11) |
Via | Notifier l'adresse de la passerelle intermédiaire ou du serveur proxy, le protocole de communication | Via : 1.0 fred, 1.1 nulle part com (Apache/1.1) |
Attention<. 🎜> | Informations d'avertissement sur les entités de messageAvertissement : 199 Avertissement divers |
En-tête | Explication | Exemple |
---|---|---|
Accept-Ranges | Indique si le serveur prend en charge les requêtes de plage spécifiées et quel type de requêtes segmentées | Accepter - Plages : octets |
Âge | Durée estimée en secondes entre le serveur d'origine et la formation du cache proxy | Âge : 12 |
Autoriser | Un comportement de requête valide pour une certaine ressource réseau S'il n'est pas autorisé, 405 | < sera renvoyé 🎜>. Autoriser : GET, HEAD|
Cache-Control | Dites à tous les mécanismes de mise en cache s'ils peuvent être mis en cache et de quel typeCache-Control : no-cache | |
Content-Encoding | Le type d'encodage de compression de contenu renvoyé pris en charge par le serveur WebContent-Encoding : gzip | |
Content-Language | Langue du corps de la réponseContent-Language : en, zh | |
Content-Length | La longueur du corps de la réponseContent-Length : 348 | |
Content-Location | Demander une adresse alternative pour la ressourceContent-Location : /index.htm | |
Content-MD5 | Renvoie la valeur de contrôle MD5 de la ressourceContent-MD5 : Q2hlY2sgSW50ZWdyaXR5IQ== | |
Content-Range | La position en octets de cette partie dans tout le corps de retourContent-Range : octets 21010-47021/47022 | |
Content-Type | Renvoie le type MIME du contenuContent-Type : text/html charset=utf-8 | |
Date | Heure à laquelle le message original du serveur a été envoyéDate : mar. 15 novembre 2010 08:12:31 GMT | |
ETag | La valeur actuelle de la balise d'entité de la variable de requêteETag : "737060cd8c284d8af7ad3082f209582d" | |
Expire | La date et l'heure d'expiration de la réponseExpire : jeu. 1 décembre 2010 16:00:00 GMT | |
Dernière modification | L'heure de la dernière modification de la ressource demandéeDernière modification : mar. 15 novembre 2010 12 : 45h26 GMT | |
Localisation | Utilisé 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 |
Pragma | Contient des instructions spécifiques à l'implémentation qui peuvent être appliquées à n'importe quel récepteur dans la chaîne de réponse | Pragma : sans cache |
Proxy-Authenticate | Il 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é :
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 :
Sortie de la console :
Sortie du navigateur :
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
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 :
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