- 浏览: 3052856 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
前两天一段调用HTTP服务的脚本出了问题,仔细一看,发现是提供的HTTP服务在响应头里写了:
响应的头中声明了Content-Type,其中指定了charset=utf-8;但实际上响应中的文本却是GBK编码的。这使得原本我写的请求脚本出了问题。
依赖的Apache HttpClient如下:
pom.xml:
原本的脚本使用DefaultHttpClient去发起请求,并通过EntityUtils自己实现一个与BasicResponseHandler相似的ResponseHandler,类似这样的:
原本要调用的那个HTTP服务返回的响应的头里面没有Content-Type,所以这样去使用EntityUtils.toString(entity, defaultCharset)就已经可以达到指定解析响应内容时使用的字符编码的目的了。
问题是那个HTTP服务现在带上了错误的Content-Type,而EntityUtils.toString(entity, defaultCharset)认为Content-Type中的charset比defaultCharset更优先,此时上面的脚本就达不到强制指定字符编码的目的了。
咋办呢?最直观的当然是自己把响应的内容的byte数组拿到手,然后自己想怎么处理就怎么处理:
不知道还有没有啥更好的办法呢?我对HttpClient还是太不熟悉了。
本来最好自然是提供HTTP服务的那边把响应头的信息修正,但这又要经过各种繁琐的流程,我在跟进的某工具却等不及了,只好hack一下 =_=
与其说像make,还不如说像…呃,这跟RubyGems也可以算像吧。至少普通的make是不帮忙抓依赖的,而POM会帮忙抓。
抓依赖美~ 以前经常因为依赖太多而又要手动配置心烦……
看到GROOVY语言的时候,水水真希望类C系列也有这么一套东西=x=!
兼容C++,又支持新特性……不知道有没有,以后有没有,C++0X还没看过……
与其说像make,还不如说像…呃,这跟RubyGems也可以算像吧。至少普通的make是不帮忙抓依赖的,而POM会帮忙抓。
这年头跟Java程序员说依赖的包是什么,用Maven的POM格式来说也算是流行的做法吧 = =
真不好意思,呵呵,下次知道这个做什么用了^-^||
似乎比较类似make工具~
这年头跟Java程序员说依赖的包是什么,用Maven的POM格式来说也算是流行的做法吧 = =
1) 那两段XML片段是Maven的POM配置文件的依赖声明
2) 是用curl -D来抓取的
3) 唔,BAT我一直不够熟悉,回答不了…
HTTP/1.1 200 OK Server: xxxxxxxxxx Content-Type: text/html; charset=utf-8 Connection: close Content-Length:2014
响应的头中声明了Content-Type,其中指定了charset=utf-8;但实际上响应中的文本却是GBK编码的。这使得原本我写的请求脚本出了问题。
依赖的Apache HttpClient如下:
pom.xml:
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcomponents-client</artifactId> <version>4.0</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcomponents-core</artifactId> <version>4.0.1</version> </dependency>
原本的脚本使用DefaultHttpClient去发起请求,并通过EntityUtils自己实现一个与BasicResponseHandler相似的ResponseHandler,类似这样的:
import org.apache.http.client.HttpResponseException; import org.apache.http.client.ResponseHandler; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; def httpClient = new DefaultHttpClient(); def makeResponseHandler(charset) { { response -> def statusLine = response.statusLine; if (statusLine.statusCode >= 300) { throw new HttpResponseException(statusLine.statusCode, statusLine.reasonPhrase); } def entity = response.entity; entity ? EntityUtils.toString(entity, charset) : null; } as ResponseHandler } def httpGet = new HttpGet(requestUrl); def responseBody = httpClient.execute(httpGet, makeResponseHandler('GBK'));
原本要调用的那个HTTP服务返回的响应的头里面没有Content-Type,所以这样去使用EntityUtils.toString(entity, defaultCharset)就已经可以达到指定解析响应内容时使用的字符编码的目的了。
问题是那个HTTP服务现在带上了错误的Content-Type,而EntityUtils.toString(entity, defaultCharset)认为Content-Type中的charset比defaultCharset更优先,此时上面的脚本就达不到强制指定字符编码的目的了。
咋办呢?最直观的当然是自己把响应的内容的byte数组拿到手,然后自己想怎么处理就怎么处理:
import org.apache.http.client.HttpResponseException; import org.apache.http.client.ResponseHandler; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; def httpClient = new DefaultHttpClient(); def makeResponseHandler(charset) { { response -> def statusLine = response.statusLine; if (statusLine.statusCode >= 300) { throw new HttpResponseException(statusLine.statusCode, statusLine.reasonPhrase); } def entity = response.entity; def bytes = entity ? EntityUtils.toByteArray(entity) : null; bytes ? new String(bytes, charset) : null; } as ResponseHandler } def httpGet = new HttpGet(requestUrl); def responseBody = httpClient.execute(httpGet, makeResponseHandler('GBK'));
不知道还有没有啥更好的办法呢?我对HttpClient还是太不熟悉了。
本来最好自然是提供HTTP服务的那边把响应头的信息修正,但这又要经过各种繁琐的流程,我在跟进的某工具却等不及了,只好hack一下 =_=
评论
8 楼
sandssss
2011-01-18
听说了这个坑爹的案例~~
7 楼
lwwin
2011-01-17
RednaxelaFX 写道
lwwin 写道
真不好意思,呵呵,下次知道这个做什么用了^-^||
似乎比较类似make工具~
似乎比较类似make工具~
与其说像make,还不如说像…呃,这跟RubyGems也可以算像吧。至少普通的make是不帮忙抓依赖的,而POM会帮忙抓。
抓依赖美~ 以前经常因为依赖太多而又要手动配置心烦……
看到GROOVY语言的时候,水水真希望类C系列也有这么一套东西=x=!
兼容C++,又支持新特性……不知道有没有,以后有没有,C++0X还没看过……
6 楼
RednaxelaFX
2011-01-17
lwwin 写道
真不好意思,呵呵,下次知道这个做什么用了^-^||
似乎比较类似make工具~
似乎比较类似make工具~
与其说像make,还不如说像…呃,这跟RubyGems也可以算像吧。至少普通的make是不帮忙抓依赖的,而POM会帮忙抓。
5 楼
lwwin
2011-01-17
RednaxelaFX 写道
lwwin 写道
FX大似乎是主力=v=+ 开发工具什么的?
好像例子里面没有那个POM也可以跑的嘛,关于Maven似乎需要了解一下先~
好像例子里面没有那个POM也可以跑的嘛,关于Maven似乎需要了解一下先~
这年头跟Java程序员说依赖的包是什么,用Maven的POM格式来说也算是流行的做法吧 = =
真不好意思,呵呵,下次知道这个做什么用了^-^||
似乎比较类似make工具~
4 楼
RednaxelaFX
2011-01-17
lwwin 写道
FX大似乎是主力=v=+ 开发工具什么的?
好像例子里面没有那个POM也可以跑的嘛,关于Maven似乎需要了解一下先~
好像例子里面没有那个POM也可以跑的嘛,关于Maven似乎需要了解一下先~
这年头跟Java程序员说依赖的包是什么,用Maven的POM格式来说也算是流行的做法吧 = =
3 楼
lwwin
2011-01-17
FX大似乎是主力=v=+ 开发工具什么的?
好像例子里面没有那个POM也可以跑的嘛,关于Maven似乎需要了解一下先~
好像例子里面没有那个POM也可以跑的嘛,关于Maven似乎需要了解一下先~
2 楼
RednaxelaFX
2011-01-16
lwwin 写道
花了一整天,总算拼凑了个服务器然后跑出你那个问题- -
不过还有一些细节问问:
1) 所谓的“依赖的Apache HttpClient”是在客户端用的XML文件吗?
2) HTTP response 那段是在Groovy的程序里面打印显示的么?(不用抓包)
3) 不知道为啥bat在离开以后,里面设置的环境变量会被撤销……
在这里面打印echo是OK的,但是离开这个BAT以后似乎GROOVYPATH被重置了……
不过还有一些细节问问:
1) 所谓的“依赖的Apache HttpClient”是在客户端用的XML文件吗?
2) HTTP response 那段是在Groovy的程序里面打印显示的么?(不用抓包)
3) 不知道为啥bat在离开以后,里面设置的环境变量会被撤销……
@SETLOCAL ENABLEEXTENSIONS @SETLOCAL ENABLEDELAYEDEXPANSION @set "GROOVYPATH=." @call path\add_classpath.bat E:\jLIBs\ApacheClient\httpcomponents-core-4.1\lib @call path\add_classpath.bat E:\jLIBs\ApacheClient\httpcomponents-client-4.0.3\lib ::@echo current path : %GROOVYPATH%
在这里面打印echo是OK的,但是离开这个BAT以后似乎GROOVYPATH被重置了……
1) 那两段XML片段是Maven的POM配置文件的依赖声明
2) 是用curl -D来抓取的
3) 唔,BAT我一直不够熟悉,回答不了…
1 楼
lwwin
2011-01-16
花了一整天,总算拼凑了个服务器然后跑出你那个问题- -
不过还有一些细节问问:
1) 所谓的“依赖的Apache HttpClient”是在客户端用的XML文件吗?
2) HTTP response 那段是在Groovy的程序里面打印显示的么?(不用抓包)
3) 不知道为啥bat在离开以后,里面设置的环境变量会被撤销……
在这里面打印echo是OK的,但是离开这个BAT以后似乎GROOVYPATH被重置了……
不过还有一些细节问问:
1) 所谓的“依赖的Apache HttpClient”是在客户端用的XML文件吗?
2) HTTP response 那段是在Groovy的程序里面打印显示的么?(不用抓包)
3) 不知道为啥bat在离开以后,里面设置的环境变量会被撤销……
@SETLOCAL ENABLEEXTENSIONS @SETLOCAL ENABLEDELAYEDEXPANSION @set "GROOVYPATH=." @call path\add_classpath.bat E:\jLIBs\ApacheClient\httpcomponents-core-4.1\lib @call path\add_classpath.bat E:\jLIBs\ApacheClient\httpcomponents-client-4.0.3\lib ::@echo current path : %GROOVYPATH%
在这里面打印echo是OK的,但是离开这个BAT以后似乎GROOVYPATH被重置了……
发表评论
-
The Prehistory of Java, HotSpot and Train
2014-06-02 08:18 0http://cs.gmu.edu/cne/itcore/vi ... -
MSJVM and Sun 1.0.x/1.1.x
2014-05-20 18:50 0当年的survey paper: http://www.sym ... -
Sun JDK1.4.2_28有TieredCompilation
2014-05-12 08:48 0原来以前Sun的JDK 1.4.2 update 28就已经有 ... -
IBM JVM notes (2014 ver)
2014-05-11 07:16 0Sovereign JIT http://publib.bou ... -
class data sharing by Apple
2014-03-28 05:17 0class data sharing is implement ... -
Java 8与静态工具类
2014-03-19 08:43 16293以前要在Java里实现所谓“静态工具类”(static uti ... -
Java 8的default method与method resolution
2014-03-19 02:23 10465先看看下面这个代码例子, interface IFoo { ... -
HotSpot Server VM与Server Class Machine
2014-02-18 13:21 0HotSpot VM历来有Client VM与Server V ... -
Java 8的lambda表达式在OpenJDK8中的实现
2014-02-04 12:08 0三月份JDK8就要发布首发了,现在JDK8 release c ... -
GC stack map与deopt stack map的异同
2014-01-08 09:56 0两者之间不并存在包含关系。它们有交集,但也各自有特别的地方。 ... -
HotSpot Server Compiler与data-flow analysis
2014-01-07 17:41 0http://en.wikipedia.org/wiki/Da ... -
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22408(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
对C语义的for循环的基本代码生成模式
2013-10-19 23:12 21885之前有同学在做龙书(第二版)题目,做到8.4的练习,跟我对答案 ... -
Java的instanceof是如何实现的
2013-09-22 16:57 0Java语言规范,Java SE 7版 http://docs ... -
oop、klass、handle的关系
2013-07-30 17:34 0oopDesc及其子类的实例 oop : oopDesc* ... -
Nashorn各种笔记
2013-07-15 17:03 0http://bits.netbeans.org/netbea ... -
《深入理解Java虚拟机(第二版)》书评
2013-07-08 19:19 0值得推荐的中文Java虚拟机入门书 感谢作者赠与的样书,以下 ... -
豆列:从表到里学习JVM实现
2013-06-13 14:13 48397刚写了个学习JVM用的豆列跟大家分享。 豆列地址:http: ...
相关推荐
在本篇文章中,我们将深入探讨HttpClient 4.0的核心特性,以及如何在实际开发中使用它。 首先,HttpClient 4.0的核心功能在于支持HTTP/1.1协议,包括GET、POST、PUT、DELETE等常见HTTP方法。它还支持HTTPS,确保...
HttpClient 4.0 引入了异步操作模型,允许在请求执行时解耦等待响应的过程。通过 `Future<HttpResponse>` 对象,开发者可以在其他线程中处理响应,提高程序的并发性能。 六、HttpClient 4.0 在实际项目中的应用 ...
本篇文章将详细介绍HTTPClient 4.0的使用方法,包括其核心概念、基本操作和示例代码。 一、核心概念 1. HttpClient实例:HttpClient对象是执行HTTP请求的核心,负责建立连接、发送请求和接收响应。通过`...
1.含有官方HttpClient4.0的jar包 2.有之前HttpClient3.0的jar包,就是import importorg.apache.commons.*; 3.包含jsoup,解析HTML的jar包 4.包含jcookie.jar及jtidy-r938.jar的jar包.
《HttpClient 4.0源码解析》 HttpClient是一款由Apache软件基金会开发的开源HTTP客户端库,主要用于处理HTTP请求和响应。HttpClient 4.0版本是其一个重要里程碑,它提供了更加强大、灵活和稳定的网络通信功能。在这...
在学习HttpClient源码时,你可以深入理解HTTP协议的工作方式,了解如何使用Java进行网络编程,以及如何设计可扩展和高效的库。源码中的注释和设计模式也会帮助你提升Java编程技巧。 总的来说,Apache HttpClient ...
httpclient-4.0.jar, httpclient-4.0.jar, httpclient-4.0.jar
在探讨HttpClient 4.0的`post()`方法中四个关键“头信息”的设置之前,我们首先需要理解HttpClient是什么以及它在Java开发中的作用。 ### HttpClient简介 HttpClient是Apache的一个开源项目,它为Java应用程序提供...
Apache HttpClient是一款广泛使用的Java库,专门用于执行HTTP请求。它属于Apache HttpComponents项目的一部分,旨在提供一个高效、灵活且可扩展的HTTP客户端API。在Java应用程序中,如果你需要与Web服务器进行交互,...
HttpClient是Apache基金会开发的一个HTTP客户端库,主要用于处理HTTP请求和响应。HttpClient 4.0版本引入了许多改进和新特性,使其成为一个强大且灵活的HTTP通信工具。本篇将深入探讨HttpClient 4.0的主要功能、核心...
使用HttpClient组件解析HTML并解决字符编码问题 在网络信息采集中,经常需要解析HTML页面以获取有用的信息。使用HttpClient组件可以轻松地实现这一任务。但是,在实际使用中,经常会遇到字符集编码乱码问题。本文将...
《HttpClient 4.0 使用详解:访问开心网组件实例》 HttpClient 是 Apache 开源基金会提供的一个 HTTP 客户端库,被广泛应用于 Java 开发中,用于执行 HTTP 请求。HttpClient 4.0 版本引入了许多改进和新特性,使得...
【作品名称】:基于Java + HTTPClient 4.0,采用MySQL存储爬取数据,支持多进程并发执行的新浪微博爬虫 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训...
- **确保低级别资源释放**: 在使用HttpClient时,开发者需要注意释放资源,避免内存泄漏等问题。例如,关闭HttpResponse对象是非常重要的。 - **消耗实体内容**: 当收到响应时,必须显式地消耗实体内容,否则可能...
Android升级后旧版本的httpclient4.0 apache-mime4j-0.6 commons-codec-1.4 commons-logging-1.1.1 httpclient-4.0.1 httpcore-4.0.1 httpmime-4.0.1
httpclient-4.0-beta1.jar
包括了httpclient的所有包,commons-httpclient3.0.jar,httpclient4.0.jar,commons-logging1.1.1.jar,commons-codec-1.3.jar等
这些文件对理解项目的许可条件、使用限制和最新更新至关重要,开发者在使用HttpClient时应仔细阅读。 总的来说,Apache HttpClient是Java开发者进行HTTP通信的强大工具,它的灵活性和可扩展性使得它在各种项目中都...