HttpClient4.3 教程 第五章 快速API

来源:互联网 发布:人为什么追求卓越 知乎 编辑:程序博客网 时间:2024/05/22 15:18

5.1.Easy to use facade API

HttpClient从4.2开始支持快速api。快速api仅仅实现了HttpClient的基本功能,它只要用于一些不需要灵活性的简单场景。例如,快速api不需要用户处理连接管理和资源释放。

下面是几个使用快速api的例子:

    // 执行一个get方法,设置超时时间,并且将结果变成字符串    Request.Get("http://www.itnose.net/")            .connectTimeout(1000)            .socketTimeout(1000)            .execute().returnContent().asString();    // 使用HTTP/1.1,通过'expect-continue' handshake来执行post方法    // 内容包含一个字符串,并且将结果转化成byte数组    Request.Post("http://www.yeetrack.com/do-stuff")        .useExpectContinue()        .version(HttpVersion.HTTP_1_1)        .bodyString("Important stuff", ContentType.DEFAULT_TEXT)        .execute().returnContent().asBytes();    // 通过代理服务器来执行一个带有特殊header的post请求,post请求中带有form表单,并且将返回结果写入文件    Request.Post("http://www.yeetrack.com/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"));

如果需要在指定的安全上下文中执行某些请求,我们也可以直接使用Exector,这时候用户的认证信息就会被缓存起来,以便后续的请求使用。

    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();

5.1.1.响应处理

一般情况下,HttpClient的快速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);            }        }        });
0 0