从4.2版本开始,HttpClient附带了一个基于流畅接口概念的易于使用的Facade API。Fluent Facade API仅公开HttpClient的最基本功能,适用于不需要HttpClient完全灵活性的简单用例。例如,流畅的Facade API使用户不必处理连接管理和资源释放。本文主要介绍通过HC Fluent API执行的HTTP请求方法及示例代码。

1、使用fluent API执行GET和POST请求

1) 执行GET请求

//使用超时设置执行GET,并将响应内容作为String返回。
Request.Get("http://somehost/")
        .connectTimeout(1000)
        .socketTimeout(1000)
        .execute().returnContent().asString();

2) 执行POST请求

//使用HTTP / 1.1通过“期望-继续”握手执行POST,
//包含一个请求主体作为String,并返回响应内容作为字节数组。
Request.Post("http://somehost/do-stuff")
        .useExpectContinue()
        .version(HttpVersion.HTTP_1_1)
        .bodyString("Important stuff", ContentType.DEFAULT_TEXT)
        .execute().returnContent().asBytes();
//通过包含请求主体的代理使用自定义标头执行POST
//作为HTML表单,并将结果保存到文件中
Request.Post("http://somehost/some-form")
        .addHeader("X-Custom-header", "stuff")
        .viaProxy(new HttpHost("myproxy", 8080))
        .bodyForm(Form.form().add("username", "vip").add("password", "secret").build())
        .execute().saveContent(new File("result.dump"));

3) 使用Executor执行请求

Executor为了在特定的安全上下文中执行请求,还可以直接使用,从而将身份验证详细信息缓存并重新用于后续请求。

Executor executor = Executor.newInstance()
        .auth(new HttpHost("somehost"), "username", "password")
        .auth(new HttpHost("myproxy", 8080), "username", "password")
        .authPreemptive(new HttpHost("myproxy", 8080));
executor.execute(Request.Get("http://somehost/"))
        .returnContent().asString();
executor.execute(Request.Post("http://somehost/do-stuff")
        .useExpectContinue()
        .bodyString("Important stuff", ContentType.DEFAULT_TEXT))
        .returnContent().asString();

2、响应(Response)处理

流利的Facade API通常使用户不必处理连接管理和资源重新分配。但是,在大多数情况下,这是以必须在内存中缓冲响应消息的内容为代价的。强烈建议将其ResponseHandler用于HTTP响应处理,以避免必须在内存中缓冲内容。

Document result = Request.Get("http://somehost/content")
        .execute().handleResponse(new ResponseHandler<Document>() {
    public Document handleResponse(final HttpResponse response) throws IOException {
        StatusLine statusLine = response.getStatusLine();
        HttpEntity entity = response.getEntity();
        if (statusLine.getStatusCode() >= 300) {
            throw new HttpResponseException(
                    statusLine.getStatusCode(),
                    statusLine.getReasonPhrase());
        }
        if (entity == null) {
            throw new ClientProtocolException("Response contains no content");
        }
        DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
            ContentType contentType = ContentType.getOrDefault(entity);
            if (!contentType.equals(ContentType.APPLICATION_XML)) {
                throw new ClientProtocolException("Unexpected content type:" +
                    contentType);
            }
            String charset = contentType.getCharset();
            if (charset == null) {
                charset = HTTP.DEFAULT_CONTENT_CHARSET;
            }
            return docBuilder.parse(entity.getContent(), charset);
        } catch (ParserConfigurationException ex) {
            throw new IllegalStateException(ex);
        } catch (SAXException ex) {
            throw new ClientProtocolException("Malformed XML document", ex);
        }
    }
    });

相关文档http://hc.apache.org/httpcomponents-client-ga/tutorial/html/fluent.html



推荐文档