使用java程序或者服务器后端程序访问某个url时,可以使用java.net.URL类,也可以使用apache的HttpClient包。
为了验证功能,在本地程序中可简单使用URL类,代码如下:
public static String accessUrl(String urlString) throws IOException {
URL url = new URL(urlString);
HttpURLConnection urlcon = (HttpURLConnection) url.openConnection();
urlcon.connect();
InputStream is = urlcon.getInputStream();
BufferedReader buffer = new BufferedReader(new InputStreamReader(is));
StringBuffer bs = new StringBuffer();
String l = null;
while ((l = buffer.readLine()) != null) {
bs.append(l);
}
String result = bs.toString();
return result;
}
但是放到tomcat服务器上运行时,却发现读取中文结果出现乱码。比如在调用QQ的api接口获取用户信息时,发现在java程序读取的"北京"和"男",却变成了"鍖椾含"和"鐢?。
尝试用new String(apiResult.getBytes("GBK"),"UTF-8");进行编码转发,发现双字的"北京"可以转换正确,单字的"男"或三字等字符串的最后一个字却不能正确转换。
猜测是使用URL的InputStream和Reader读取字节时使用的字节和本地环境有关:单个程序使用的是java的UTF-8,和服务器返回编码一致,不出现问题;在本地tomcat上运行时可能依赖于操作系统,使用GBK进行解码,导致出现乱码;又因为对服务器UTF8编码字节做GBK解码时导致数据丢失,再怎么编解码转不回来。
解决方案如下:
1.指定Reader的字符集
使用InputStream构建Reader时指定字符集与服务器一致,为UTF-8即可
BufferedReader buffer = new BufferedReader(new InputStreamReader(is,
"UTF-8"));
2.使用HttpClient
public static String accessUrl(String urlString)
throws ClientProtocolException, IOException {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(urlString);
HttpResponse response = httpClient.execute(httpGet);
String message = EntityUtils.toString(response.getEntity());
// System.out.println(message);
return message;
}
HttpClient会优先使用响应Entity的ContentType的字符集,如果读取不到则使用指定的默认字符集,如果未指定则使用HttpClient的默认字符集(ISO-8859-1),源码如下:
public static String toString(HttpEntity entity, Charset defaultCharset)
throws IOException, ParseException
{
......
Charset charset = null;
try
{
ContentType contentType = ContentType.get(entity);
if(contentType != null)
charset = contentType.getCharset();
}
catch(UnsupportedCharsetException ex)
{
throw new UnsupportedEncodingException(ex.getMessage());
}
if(charset == null)
charset = defaultCharset;
if(charset == null)
charset = HTTP.DEF_CONTENT_CHARSET;
Reader reader = new InputStreamReader(instream, charset);
......
所以如果服务器返回的响应里面没有ContentType且返回信息有中文,使用HttpClient也需要指定字符集
String message = EntityUtils.toString(response.getEntity(),"UTF-8");
建议使用HttpClient可以用到连接池等特性,https时也不用重复加载证书库。
分享到:
相关推荐
此外,Java的`java.net.URLDecoder`和`java.net.URLEncoder`类也提供了URL编码和解码的功能。 文件的编码方式有时会在文件的头部或通过其他方式指定,如XML文件的`<?xml version="1.0" encoding="UTF-8"?>`声明。在...
工具可能包含对URL编码和解码的支持,例如将空格转换为`%20`,或者将 `%xx` 转回对应的字符。 4. **参数处理**:URL查询参数是URL中以问号`?`分隔的部分,工具可以解析这些参数,提取键值对,并支持添加、删除或...
在Java中,我们可以使用`java.net.URL`和`java.net.HttpURLConnection`类来实现。以下是一个简单的示例: ```java URL url = new URL("http://example.com"); HttpURLConnection connection = (HttpURLConnection) ...
2. **解码后的URL无法解析**:如果URL编码不当,可能会导致解码后的URL无法被正确解析,进而影响到资源的定位和访问。 3. **解码后无法重新编码成相同形式**:有些编码方式可能导致解码后再编码与原始URL不一致,这...
UrlEncodeUrlDecodeUrl解码Url编码工具正是为了解决这一问题而设计的。它是一个实用的小工具,能够帮助用户对URL进行编码和解码,确保数据在通过网络传递时保持完整性和可读性。 URL(统一资源定位符)是互联网上的...
不过,基础的URL访问和输入流读取是所有网络编程的基础,理解这些概念对于后续的学习至关重要。 总结一下,Java获取HTML源文件的关键步骤包括: 1. 创建`URL`对象表示目标网页。 2. 打开与URL的连接,获取`...
1. **长网址编码**:首先,需要将长网址进行编码,如使用Base64或URL编码,确保数据安全无误地存储。 2. **哈希计算**:然后,使用哈希函数(如MD5)对编码后的长网址生成哈希值。尽管MD5不可逆,但可以用作索引。 ...
在Java编程语言中,获取URL是一项基础且重要的任务,它涉及到网络编程和数据抓取领域。本示例的"GetURL.java"文件提供了一个简单的Java程序,用于抓取网页上的URL地址,为构建网络爬虫提供了基本框架。下面将详细...
最后,Java端通过HTTP请求获取Base64编码的图片数据,解码并保存为jpg文件: ```java String base64Image = fetchBase64ImageFromNodeServer(url); // 调用Node.js服务获取Base64数据 byte[] imageBytes = Base64....
文档旨在规范URL的语法、语义以及资源访问的方式,以促进互联网上资源的定位和交互。 **1.URL的概述** URL是用于标识互联网上资源的字符串,它提供了资源的位置信息,允许用户或应用程序通过特定的协议访问这些...
在LoadRunner的脚本编写过程中,我们经常需要处理字符串,尤其是将普通字符串转换为URL编码格式,以确保数据正确无误地发送到服务器。本文将详细介绍如何在LoadRunner中进行URL编码,以及提供的C代码和转换工具。 ...
在Java编程中,访问HTTPS(安全超文本传输协议)接口通常涉及到处理数字证书,这是为了确保数据传输的安全性。HTTPS通过使用SSL/TLS协议来加密通信,而证书是该协议的一部分,用于验证服务器的身份。本篇文章将深入...
Java 通过 URL 下载文件并输出的方法 Java 通过 URL 下载文件并输出的方法是指在 Java 语言中使用 URL 连接来下载文件并将其输出到客户端的方法。本文将深入探讨这种方法的实现细节,并为开发者提供一个详细的参考...
Java的`java.net.URLEncoder`类可以帮助我们编码参数值,确保它们符合URL规范。 在提供的压缩包中,`截图网页图片`可能是实现这一功能的代码文件或者示例截图。如果需要具体实现,还需要查看代码文件内容或进行...
使用目标URL创建一个`HttpPost`实例,并设置请求实体为`UrlEncodedFormEntity`,确保参数被正确编码。 6. **执行请求**: 使用`HttpClient`的`execute()`方法执行POST请求,并获取`HttpResponse`。 7. **处理...
5)、支持获取流的访问数,可设置自动关闭0访问数的推流以节约系统资源。 6)、linux系统支持推流前系统资源限制。 7)、完整的日志输出,便于查看项目运行状况。 5、ffmpeg需要下载linux版本程序,并将路径添加...
标题中的“访问URL生成Mht文件”指的是将一个网页(通过其URL)转换为MHT(MHTML,即单个文件网页)格式的过程。MHT文件是一种存储网页内容的单一文件,包括HTML代码、图像和其他资源,使得网页可以在离线状态下查看...
// 创建URL对象,指定要访问的文件或网页地址 URL url = new URL("http://example.com/path/to/file.txt"); // 打开与URL的连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); ...
在Java编程中,URL(统一资源定位符)是访问网络资源的重要工具,但同时也常常伴随着一些常见的问题。本文主要讨论了两个关键问题及其解决方案。 首先,Java中的`URLEncoder`类是一个常见的误区。尽管其名称暗示它...