Netty源碼解析之 java網(wǎng)絡(luò)編程篇(4)

URLConnection

URLConnection類使用

URLConnection實(shí)例類獲取指定首部信息

  public String getContentType()
  public int getContentLength()
  public String getContentEncoding()
  public long getDate()
  public long getExpiration()
  public long getLastModified()
package Ch7;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class AllHeaders {
    public static void main(String[] args) {

        for(int i=0; i<args.length; i++){
            try{
                URL u = new URL(args[i]);
                URLConnection uc = u.openConnection();
                for(int j=1;;j++){
                    //getHeaderField(String name),返回指定類型首部段的值
                    //getHeaderField(int n),返回第n個(gè)首部段的值
                    String header = uc.getHeaderField(j);
                    if(header==null) break;
                    System.out.println(uc.getHeaderFieldKey(j)+":"+header);
                }
            }catch (MalformedURLException ex){
                System.out.println(args[i]+"is not a URL I understand");
            }catch (IOException ex){
                System.err.println(ex);
            }
            System.out.println();
        }
    }
}
/*Server:Apache
Location:https://www.oreilly.com/
Content-Length:232
Content-Type:text/html; charset=iso-8859-1
Cache-Control:max-age=1316
Expires:Wed, 29 Nov 2017 05:37:00 GMT
Date:Wed, 29 Nov 2017 05:15:04 GMT
Connection:keep-alive
*/

獲取任意首部子段

  pubilc String getHeaderField(String name)
  public String getHeaderFieldKey(int n)
  public String getHeaderField(int n)
  public long getHeaderFieldDate(String name, long default)
  public int getHeaderFieldInt(String name , int default)

緩存

一般情況您旁,使用GET通過HTTP訪問的頁面應(yīng)該緩存。使用HTTPS和POST的不緩存包雀。

HTTP控制緩存的首部:

(1) Expires(HTTP 1.0) 緩存直到指定的時(shí)間

(2) Cache-control(HTTP 1.1) 會(huì)覆蓋Expires

  • max-age=[seconds]
  • s-maxage=[seconds] 在共享緩存的時(shí)間
  • public : 可以緩存經(jīng)過認(rèn)證的響應(yīng)
  • private : 單個(gè)用戶緩存可以保存憋他。共享緩存不保存孩饼。
  • no-cache : 仍可以緩存。有附加條件竹挡,用Etag或Last-modified首部重新驗(yàn)證響應(yīng)的狀態(tài)镀娶。
  • no-store : 無論如何,都不緩存揪罕。
package Ch7;

import java.util.Date;
import java.util.Locale;
public class CacheControl {
    private Date maxAge = null;
    private Date sMaxAge = null;
    private boolean mustRevalidate = false;
    private boolean nocache = false;
    private boolean nostore = false;
    private boolean proxyRevalidate = false;
    private boolean publicCache = false;
    private boolean privateCache = false;

    public CacheControl(String s) {
      //沒有cach-control即默認(rèn)策略
        if (s==null||!s.contains(":")){
            return;}
      //取得值
        String value = s.split(":")[1].trim();
        String[] components = value.split(",");
        Date now = new Date();
        for(String component: components){
            try{
                component = component.trim().toLowerCase(Locale.US);
                if(component.startsWith("max-age=")){
                    int secondsInTheFuture = Integer.parseInt(component.substring(8));
                    maxAge = new Date(now.getTime()+1000*secondsInTheFuture);
                }else if(component.startsWith("s-maxage=")){
                    int secondsInTheFuture = Integer.parseInt(component.substring(8));
                    sMaxAge = new Date(now.getTime()+1000*secondsInTheFuture);
                }  else if(component.equals("must-revalidate")){
                    mustRevalidate = true;
                } else if(component.equals("proxy-revalidate")){
                    proxyRevalidate = true;
                } else if(component.equals("no-cache")){
                    nocache = true;
                }else if(component.equals("public")){
                    publicCache= true;
                }else if(component.equals("private")){
                    privateCache= true;
                }
            }catch (RuntimeException ex){
                continue;
            }
        }
    }

    public Date getMaxAge(){
        return maxAge;}
    public Date getSharedMaxAge(){
        return sMaxAge;}
    public boolean mustRevalidate(){
        return mustRevalidate;}
    public boolean ProxyRevalidate(){
        return proxyRevalidate;}
    public boolean noStore(){
        return nostore;}
    public boolean noCache(){
        return nocache;}
    public boolean PublicCache(){
        return publicCache;}
    public boolean PrivateCache(){
        return privateCache;}
}

向服務(wù)器寫入數(shù)據(jù)

//URLConnection方法梯码,獲取輸出流宝泵。
public OutputStream getOutputStream()
//默認(rèn)情況URLConnection不允許輸出,所以先要setDoOutput(true).請(qǐng)求方法將由GET變?yōu)镻OST

package Ch7;
import Ch4.QueryString;

import java.net.*;
import java.io.*;

public class FormPoster {
    private URL url;

    private QueryString query = new QueryString();

    public FormPoster (URL url){
        if(!url.getProtocol().toLowerCase().startsWith("http")){
            throw new IllegalArgumentException("Posting only works for http URLS");
        }
        this.url = url;
    }

    public void add(String name, String value) throws UnsupportedEncodingException{
        query.add(name,value);
    }

    public URL getURL(){
        return this.url;
    }
    //提交表單數(shù)據(jù)
    public InputStream post() throws IOException{
        URLConnection uc = url.openConnection();
        uc.setDoOutput(true);
        try(OutputStreamWriter out = new OutputStreamWriter(uc.getOutputStream(),"UTF-8")){
          //POST行轩娶、Content-type首部和Content-length首部
          //由URLConnection發(fā)送儿奶,
          //我們只需發(fā)送數(shù)據(jù)。
            out.write(query.toString());
            out.write("\r\n");
          //刷新并關(guān)閉流鳄抒,try語句保證關(guān)閉闯捎。沒關(guān)閉不會(huì)發(fā)送任何數(shù)據(jù)。
            out.flush();
        }

        return uc.getInputStream();
    }

    public static void main(String[] args) throws  UnsupportedEncodingException{
        URL url;
        if(args.length>0){
            try{
                url = new URL(args[0]);
            }catch (MalformedURLException ex){
                System.err.println("Usage: java FormPoster url");
                return;
            }
        }else {
            try{
                url = new URL("http://www.cafeaulait.org/books/jnp4/postquery.phtml");
            }catch (MalformedURLException ex){
                System.err.println(ex);
                return;
            }
        }

        FormPoster poster = new FormPoster(url);
        poster.add("name","Elliotte Rusty Harold");
        poster.add("email","elharo@ibiblio.org");

        try(InputStream in = poster.post()){
            Reader r = new InputStreamReader(in);
            int c;
            while((c=r.read())!=-1){
                System.out.print((char)c);
            }
            System.out.println();
        }catch (IOException ex){
            System.err.println("ex");
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末许溅,一起剝皮案震驚了整個(gè)濱河市瓤鼻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贤重,老刑警劉巖茬祷,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異并蝗,居然都是意外死亡祭犯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門借卧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盹憎,“玉大人,你說我怎么就攤上這事铐刘∨忝浚” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵镰吵,是天一觀的道長檩禾。 經(jīng)常有香客問我,道長疤祭,這世上最難降的妖魔是什么盼产? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮勺馆,結(jié)果婚禮上戏售,老公的妹妹穿的比我還像新娘。我一直安慰自己草穆,他們只是感情好灌灾,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悲柱,像睡著了一般锋喜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天嘿般,我揣著相機(jī)與錄音段标,去河邊找鬼。 笑死炉奴,一個(gè)胖子當(dāng)著我的面吹牛逼庞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盆佣,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼往堡,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了共耍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤吨瞎,失蹤者是張志新(化名)和其女友劉穎痹兜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颤诀,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡字旭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了崖叫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遗淳。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖心傀,靈堂內(nèi)的尸體忽然破棺而出屈暗,到底是詐尸還是另有隱情,我是刑警寧澤脂男,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布养叛,位于F島的核電站,受9級(jí)特大地震影響宰翅,放射性物質(zhì)發(fā)生泄漏弃甥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一汁讼、第九天 我趴在偏房一處隱蔽的房頂上張望淆攻。 院中可真熱鬧,春花似錦嘿架、人聲如沸瓶珊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艰毒。三九已至,卻和暖如春搜囱,著一層夾襖步出監(jiān)牢的瞬間丑瞧,已是汗流浹背柑土。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绊汹,地道東北人稽屏。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泪姨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 本文是《圖解HTTP》讀書筆記的第二篇润脸,主要包括此書的第六章內(nèi)容,因?yàn)榈诹碌膬?nèi)容較多焕襟,而且比較重要,所以單獨(dú)寫為...
    lijiankun24閱讀 1,357評(píng)論 0 6
  • 本文內(nèi)容大多參考《圖解HTTP》一書 一. 認(rèn)識(shí)代理服務(wù)器 所以講緩存為什么要先扯代理服務(wù)器?別急庵楷,讓我們看一下一...
    流光號(hào)船長閱讀 1,909評(píng)論 0 10
  • okhhtp緩存篇_上# 注:本文分析的基礎(chǔ)是在大概了解了okhhtp的基礎(chǔ)上分析的如果不了解的話建議看下okhh...
    愿來緣來閱讀 1,072評(píng)論 0 2
  • HTTP 首部 HTTP 報(bào)文首部 HTTP 協(xié)議的請(qǐng)求和響應(yīng)報(bào)文中必定包含 HTTP 首部。首部內(nèi)容為客 戶端和...
    Gu_Ran閱讀 745評(píng)論 0 3
  • 這一個(gè)月看著孩子的成績直線下降楣颠,原來的原則是否要堅(jiān)持尽纽,能看到一些曙光嗎?心里一片茫茫然童漩。漠視他不交作業(yè)嗎弄贿?還是表...
    安靜的大海閱讀 120評(píng)論 0 0