Java實現的URL編碼和解碼技術

laolang 7年前發布 | 13K 次閱讀 URL Java Java開發

當編寫 “ 網絡爬蟲” 或下載器時,在 Java 中實現 URL 編碼和解碼是一個很常見的要求。本文的重點是創建用于對所傳遞的 URL 進行編碼和解碼的模塊。

Main 方法

public static void main(String[] args) {   
 
          // TODO Auto-generated method stub   
 
          String url="https%3A%2F%2Fr1---sn-ci5gup-cags.googlevideo.com%2Fvideoplayback%3Fpcm2cms%3Dyes%26mime%3Dvideo%252Fmp4%26pl%3D21%26itag%3D22%26\u0026itag=43\u0026type=video%2Fwebm%3B+codecs%3D%22vp8.0%2C+vorbis%22\u0026quality=medium";   
 
          String url2="https://r1---sn-ci5gup-cags.googlevideo.com/videoplayback?pcm2cms=yes&mime=video/mp4&pl=21&itag=22&&itag=43&type=video/webm; codecs=\"vp8.0, vorbis\"&quality=medium";   
 
          String decodeURL = decode(url);   
 
          System.out.println("Decoded URL: "+decodeURL);   
 
          String encodeURL = encode(url2);   
 
          System.out.println("Encoded URL2: "+encodeURL);   
 
     } 

它是如何工作的?

  • url 是一個變量,保存著我們希望解碼的已被編碼的 URL
  • url2 是保存著我們希望編碼的 url 的變量
  • 調用 decode 方法,該方法解碼和打印 URL
  • 調用 encode 方法,該方法編碼和打印 url2

Encode 方法

public static String encode(String url)   
 
{   
 
          try {   
 
               String encodeURL=URLEncoder.encode( url, "UTF-8" );   
 
               return encodeURL;   
 
          } catch (UnsupportedEncodingException e) {   
 
               return "Issue while encoding" +e.getMessage();   
 
          }   
 
} 

它是如何工作的

  • 使用名為 URLEncoder 的預定義 Java 類的 encode 方法
  • URLEncoder 類的 encode 方法需要兩個參數:

第一個參數定義的是待編碼的 URL

第二個參數定義的是使用的編碼方案

  • 編碼之后,將返回編碼后的 URL 結果
public static String decode(String url)   
 
{   
 
          try {   
 
               String prevURL="";   
 
               String decodeURL=url;   
 
               while(!prevURL.equals(decodeURL))   
 
               {   
 
                    prevURL=decodeURL;   
 
                    decodeURL=URLDecoder.decode( decodeURL, "UTF-8" );   
 
               }   
 
               return decodeURL;   
 
          } catch (UnsupportedEncodingException e) {   
 
               return "Issue while decoding" +e.getMessage();   
 
          }   
 
} 

Decode 方法

public static String decode(String url){ 
    try { 
        String prevURL="";   
        String decodeURL=url;   
        while(!prevURL.equals(decodeURL)) 
        { 
            prevURL=decodeURL;   
            decodeURL=URLDecoder.decode( decodeURL, "UTF-8" );   
        }   
        return decodeURL;   
    } catch (UnsupportedEncodingException e) { 
        return "Issue while decoding" +e.getMessage();   
    }   
} 

它是如何工作的

  • 因為相同的 URL 可以被多次編碼,所以我們需要一直對它進行解碼直到不能再解碼為止。舉個例子,"video%252Fmp4" 是兩次編碼的結果。第一次解碼后,我們得到 "video%2Fmp4"。要得到正確的結果 "video/mp4",我們需要再解碼一次。
  • 使用名為 URLEncoder 的預定義 Java 類的 decode 方法來解碼
  • URLDecoder 類的 decode 方法需要兩個參數:

第一個參數定義需要解碼的 URL

第二個參數定義使用的解碼方案

  • 解碼后,返回已解碼的 URL.
  • 創建兩個變量:prevURL 為空串,decodeURL 包含待解碼的 URL
Variable State:   
 
prevURL = ""   
 
decodeURL ="somethingvideo%252Fmp4" 
  • 創建一個重復執行的步驟,直到 prevURL 與 decodeURL 的值相等
  • 將 decodeURL 的值賦值給 prevURL,將傳遞的 URL 解碼后的值賦給 decodeURL
Variable State: 
 
prevURL = "somethingvideo%252Fmp4" 
 
decodeURL ="somethingvideo%2Fmp4" 
  • 如你所見,prevURL 的值不等于 decodeURL 的值,我們再次執行
Variable State: 
 
prevURL = "somethingvideo%2Fmp4" 
 
decodeURL ="somethingvideo/mp4" 
  • 再一次
Variable State: 
 
prevURL = "somethingvideo/mp4" 
 
decodeURL ="somethingvideo/mp4" 
  • 現在,prevURL 的值等于 decodeURL 的值了,得到了正確的解碼結果。

輸出

Decoded URL: https://r1---sn-ci5gup-cags.googlevideo.com/videoplayback?pcm2cms=yes&mime=video/mp4&pl=21&itag=22&&itag=43&type=video/webm; codecs="vp8.0, vorbis"&quality=medium   
 
 Encoded URL2: https%3A%2F%2Fr1---sn-ci5gup-cags.googlevideo.com%2Fvideoplayback%3Fpcm2cms%3Dyes%26mime%3Dvideo%2Fmp4%26pl%3D21%26itag%3D22%26%26itag%3D43%26type%3Dvideo%2Fwebm%3B+codecs%3D%22vp8.0%2C+vorbis%22%26quality%3Dmedium 

完整的程序

package com.cooltrickshome;  import java.io.UnsupportedEncodingException;  import java.net.URLDecoder;  import java.net.URLEncoder;  public class URLEncodeDecode {     
   public static void main(String[] args) {   
          // TODO Auto-generated method stub            String url="https%3A%2F%2Fr1---sn-ci5gup-cags.googlevideo.com%2Fvideoplayback%3Fpcm2cms%3Dyes%26mime%3Dvideo%252Fmp4%26pl%3D21%26itag%3D22%26\u0026itag=43\u0026type=video%2Fwebm%3B+codecs%3D%22vp8.0%2C+vorbis%22\u0026quality=medium";   
          String url2="https://r1---sn-ci5gup-cags.googlevideo.com/videoplayback?pcm2cms=yes&mime=video/mp4&pl=21&itag=22&&itag=43&type=video/webm; codecs=\"vp8.0, vorbis\"&quality=medium";   
          String decodeURL = decode(url);   
          System.out.println("Decoded URL: "+decodeURL);   
          String encodeURL = encode(url2);   
          System.out.println("Encoded URL2: "+encodeURL);   
     }   
     public static String decode(String url)   
     {   
               try {   
                    String prevURL="";   
                    String decodeURL=url;   
                    while(!prevURL.equals(decodeURL))   
                    {   
                         prevURL=decodeURL;   
                         decodeURL=URLDecoder.decode( decodeURL, "UTF-8" );   
                    }   
                    return decodeURL;   
               } catch (UnsupportedEncodingException e) {   
                    return "Issue while decoding" +e.getMessage();   
               }   
     }   
     public static String encode(String url)   
     {   
               try {   
                    String encodeURL=URLEncoder.encode( url, "UTF-8" );   
                    return encodeURL;   
               } catch (UnsupportedEncodingException e) {   
                    return "Issue while encoding" +e.getMessage();   
               }   
     }   
} 

 

來自:http://developer.51cto.com/art/201704/536354.htm

 

 本文由用戶 laolang 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!