LZ在发送HTTP请求中遇到505返回码,经查阅HTTP 505错误是HTTP状态码的一种,表示“HTTP版本不受支持”
URL url = new URL(urlstr);
代码后面加入
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());//把URL中的URI特殊字符转为正常的
url = uri.toURL();
后一切正常了
好了,下面就记录下URL与URI区别:
目前HTTP规范已经不使用URL,而是使用URI。
URL:统一资源定位符
URI:统一资源标识符
我先解释下上面代码中的URL与URI ,例如 http://localhost:8080/login?name=zhangsan&password=123456
根据源码可以看出上面uri指的是/login?name=zhangsan&password=123456
下面这是LZ认为描述较为清楚的解释:https://www.zhihu.com/question/21950864/answer/66779836
URI—Uniform Resource Identifier通用资源标志符
Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的
URI一般由三部组成
①访问资源的命名机制
②存放资源的主机名
③资源自身的名称,由路径表示,着重强调于资源。
URL—Uniform Resource Location统一资源定位符
URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。
采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。
URL一般由三部组成
①协议(或称为服务方式)
②存有该资源的主机IP地址(有时也包括端口号)
③主机资源的具体地址。如目录和文件名等
应用:
一 、 URI
比如在JDK中sun公司提供的简易HttpServer实现中
public void handle(final HttpExchange exchange)throws Exception
方法中,根据exchange对象可以拿到访问Http请求的URI对象,
ps:
http://127.0.0.1:8080/cmd_helloworld/?name=guowuxin
此时URI uri = exchange.getRequestURI();
通过uri可以拿到连接的各部分内容:
uri.getPath() --------------------> /cmd_helloworld 注意有斜杠
uri.getQuery()----------------------> name=guowuxin
当然如果是post请求,请求内容在请求body当中
二、 URL
上面说了,URL 是一个结构化字符串,它支持解析的语法运算以及查找主机和打开到指定资源的连接之类的网络 I/O 操作。
重要的,URL不仅仅可以进行语法解析运算,还可以查找主机,并且打开指定资源的连接进行网络IO操作。
介绍URL类的两个重要方法
openStream()
打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。
openConnection()
返回一个 URLConnection 对象,它表示到 URL
所引用的远程对象的连接。
URL url = new URL("http://www.baidu.com");
InputStream in = url.openStream();
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = in.read(buffer)) != -1)
{
output.write(buffer, 0, len);
}
System.err.println(new String(output.toByteArray()));
上面的程序通过openStream()方法获取访问URL获取的输入流,从而读取响应内容,ps响应内容是过滤掉响应头了的。
openConnection()方法就可以getOutputStream()以及 getInputStream()
可以更灵活的进行request和response