Java实现的URL编码和解码技术

简介:

Java 实现的 URL 编码和解码技术


当编写 “ 网络爬虫” 或下载器时,在 Java 中实现 URL 编码和解码是一个很常见的要求。本文的重点是创建用于对所传递的 URL 进行编码和解码的模块。

Main 方法


 
 
  1. public static void main(String[] args) {   
  2.  
  3.           // TODO Auto-generated method stub   
  4.  
  5.           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";   
  6.  
  7.           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";   
  8.  
  9.           String decodeURL = decode(url);   
  10.  
  11.           System.out.println("Decoded URL: "+decodeURL);   
  12.  
  13.           String encodeURL = encode(url2);   
  14.  
  15.           System.out.println("Encoded URL2: "+encodeURL);   
  16.  
  17.      } 

它是如何工作的?

  • url 是一个变量,保存着我们希望解码的已被编码的 URL
  • url2 是保存着我们希望编码的 url 的变量
  • 调用 decode 方法,该方法解码和打印 URL
  • 调用 encode 方法,该方法编码和打印 url2

Encode 方法


 
 
  1. public static String encode(String url)   
  2.  
  3. {   
  4.  
  5.           try {   
  6.  
  7.                String encodeURL=URLEncoder.encode( url, "UTF-8" );   
  8.  
  9.                return encodeURL;   
  10.  
  11.           } catch (UnsupportedEncodingException e) {   
  12.  
  13.                return "Issue while encoding" +e.getMessage();   
  14.  
  15.           }   
  16.  

它是如何工作的

  • 使用名为 URLEncoder 的预定义 Java 类的 encode 方法
  • URLEncoder 类的 encode 方法需要两个参数:

第一个参数定义的是待编码的 URL

第二个参数定义的是使用的编码方案

  • 编码之后,将返回编码后的 URL 结果

 
 
  1. public static String decode(String url)   
  2.  
  3. {   
  4.  
  5.           try {   
  6.  
  7.                String prevURL="";   
  8.  
  9.                String decodeURL=url;   
  10.  
  11.                while(!prevURL.equals(decodeURL))   
  12.  
  13.                {   
  14.  
  15.                     prevURL=decodeURL;   
  16.  
  17.                     decodeURL=URLDecoder.decode( decodeURL, "UTF-8" );   
  18.  
  19.                }   
  20.  
  21.                return decodeURL;   
  22.  
  23.           } catch (UnsupportedEncodingException e) {   
  24.  
  25.                return "Issue while decoding" +e.getMessage();   
  26.  
  27.           }   
  28.  

Decode 方法


 
 
  1. public static String decode(String url){ 
  2.     try { 
  3.         String prevURL="";   
  4.         String decodeURL=url;   
  5.         while(!prevURL.equals(decodeURL)) 
  6.         { 
  7.             prevURL=decodeURL;   
  8.             decodeURL=URLDecoder.decode( decodeURL, "UTF-8" );   
  9.         }   
  10.         return decodeURL;   
  11.     } catch (UnsupportedEncodingException e) { 
  12.         return "Issue while decoding" +e.getMessage();   
  13.     }   

它是如何工作的

  • 因为相同的 URL 可以被多次编码,所以我们需要一直对它进行解码直到不能再解码为止。举个例子,"video%252Fmp4" 是两次编码的结果。第一次解码后,我们得到 "video%2Fmp4"。要得到正确的结果 "video/mp4",我们需要再解码一次。
  • 使用名为 URLEncoder 的预定义 Java 类的 decode 方法来解码
  • URLDecoder 类的 decode 方法需要两个参数:

第一个参数定义需要解码的 URL

第二个参数定义使用的解码方案

  • 解码后,返回已解码的 URL.
  • 创建两个变量:prevURL 为空串,decodeURL 包含待解码的 URL

 
 
  1. Variable State:   
  2.  
  3. prevURL = ""   
  4.  
  5. decodeURL ="somethingvideo%252Fmp4" 
  • 创建一个重复执行的步骤,直到 prevURL 与 decodeURL 的值相等
  • 将 decodeURL 的值赋值给 prevURL,将传递的 URL 解码后的值赋给 decodeURL

 
 
  1. Variable State: 
  2.  
  3. prevURL = "somethingvideo%252Fmp4" 
  4.  
  5. decodeURL ="somethingvideo%2Fmp4" 
  • 如你所见,prevURL 的值不等于 decodeURL 的值,我们再次执行

 
 
  1. Variable State: 
  2.  
  3. prevURL = "somethingvideo%2Fmp4" 
  4.  
  5. decodeURL ="somethingvideo/mp4" 
  • 再一次

 
 
  1. Variable State: 
  2.  
  3. prevURL = "somethingvideo/mp4" 
  4.  
  5. decodeURL ="somethingvideo/mp4" 
  • 现在,prevURL 的值等于 decodeURL 的值了,得到了正确的解码结果。

输出


 
 
  1. 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   
  2.  
  3.  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 

完整的程序


 
 
  1. package com.cooltrickshome;  import java.io.UnsupportedEncodingException;  import java.net.URLDecoder;  import java.net.URLEncoder;  public class URLEncodeDecode {     
  2.    public static void main(String[] args) {   
  3.           // 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";   
  4.           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";   
  5.           String decodeURL = decode(url);   
  6.           System.out.println("Decoded URL: "+decodeURL);   
  7.           String encodeURL = encode(url2);   
  8.           System.out.println("Encoded URL2: "+encodeURL);   
  9.      }   
  10.      public static String decode(String url)   
  11.      {   
  12.                try {   
  13.                     String prevURL="";   
  14.                     String decodeURL=url;   
  15.                     while(!prevURL.equals(decodeURL))   
  16.                     {   
  17.                          prevURL=decodeURL;   
  18.                          decodeURL=URLDecoder.decode( decodeURL, "UTF-8" );   
  19.                     }   
  20.                     return decodeURL;   
  21.                } catch (UnsupportedEncodingException e) {   
  22.                     return "Issue while decoding" +e.getMessage();   
  23.                }   
  24.      }   
  25.      public static String encode(String url)   
  26.      {   
  27.                try {   
  28.                     String encodeURL=URLEncoder.encode( url, "UTF-8" );   
  29.                     return encodeURL;   
  30.                } catch (UnsupportedEncodingException e) {   
  31.                     return "Issue while encoding" +e.getMessage();   
  32.                }   
  33.      }   



作者:OSC-协作翻译

来源:51CTO

相关文章
|
23天前
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
48 9
|
23天前
|
人工智能 Java 物联网
JAVA网络编程的未来:URL与URLConnection的无限可能,你准备好了吗?
随着技术的发展和互联网的普及,JAVA网络编程迎来新的机遇。本文通过案例分析,探讨URL与URLConnection在智能API调用和实时数据流处理中的关键作用,展望其未来趋势和潜力。
42 7
|
23天前
|
Java 开发者
JAVA高手必备:URL与URLConnection,解锁网络资源的终极秘籍!
在Java网络编程中,URL和URLConnection是两大关键技术,能够帮助开发者轻松处理网络资源。本文通过两个案例,深入解析了如何使用URL和URLConnection从网站抓取数据和发送POST请求上传数据,助力你成为真正的JAVA高手。
42 11
|
15天前
|
JSON 前端开发 JavaScript
java-ajax技术详解!!!
本文介绍了Ajax技术及其工作原理,包括其核心XMLHttpRequest对象的属性和方法。Ajax通过异步通信技术,实现在不重新加载整个页面的情况下更新部分网页内容。文章还详细描述了使用原生JavaScript实现Ajax的基本步骤,以及利用jQuery简化Ajax操作的方法。最后,介绍了JSON作为轻量级数据交换格式在Ajax应用中的使用,包括Java中JSON与对象的相互转换。
31 1
|
23天前
|
JSON 安全 算法
JAVA网络编程中的URL与URLConnection:那些你不知道的秘密!
在Java网络编程中,URL与URLConnection是连接网络资源的两大基石。本文通过问题解答形式,揭示了它们的深层秘密,包括特殊字符处理、请求头设置、响应体读取、支持的HTTP方法及性能优化技巧,帮助你掌握高效、安全的网络编程技能。
45 9
|
21天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
34 3
|
23天前
|
JSON Java API
JAVA网络编程新纪元:URL与URLConnection的神级运用,你真的会了吗?
本文深入探讨了Java网络编程中URL和URLConnection的高级应用,通过示例代码展示了如何解析URL、发送GET请求并读取响应内容。文章挑战了传统认知,帮助读者更好地理解和运用这两个基础组件,提升网络编程能力。
41 5
|
21天前
|
SQL 监控 Java
Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面
本文探讨了Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,以实现高效稳定的数据库访问。示例代码展示了如何使用HikariCP连接池。
12 2
|
23天前
|
Java 数据库连接 数据库
优化之路:Java连接池技术助力数据库性能飞跃
在Java应用开发中,数据库操作常成为性能瓶颈。频繁的数据库连接建立和断开增加了系统开销,导致性能下降。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接,显著减少连接开销,提升系统性能。文章详细介绍了连接池的优势、选择标准、使用方法及优化策略,帮助开发者实现数据库性能的飞跃。
27 4
|
20天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
22 1
下一篇
无影云桌面