zoukankan      html  css  js  c++  java
  • Post with HttpClient4

    转载:http://www.cnblogs.com/luxiaoxun/p/6165237.html

    作者:阿凡卢

    HttpClient是Java中经常使用的Http Client,总结下HttpClient4中经常使用的post请求用法。

    1 Basic Post

    使用2个参数进行post请求:

    复制代码
    @Test
    public void whenPostRequestUsingHttpClient_thenCorrect() 
      throws ClientProtocolException, IOException {
        CloseableHttpClient client = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost("http://www.example.com");
     
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("username", "John"));
        params.add(new BasicNameValuePair("password", "pass"));
        httpPost.setEntity(new UrlEncodedFormEntity(params));
     
        CloseableHttpResponse response = client.execute(httpPost);
        assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
        client.close();
    }
    复制代码

    2 POST with Authorization

    使用Post进行Basic Authentication credentials验证:

    复制代码
    @Test
    public void whenPostRequestWithAuthorizationUsingHttpClient_thenCorrect()
      throws ClientProtocolException, IOException, AuthenticationException {
        CloseableHttpClient client = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost("http://www.example.com");
     
        httpPost.setEntity(new StringEntity("test post"));
        UsernamePasswordCredentials creds = 
          new UsernamePasswordCredentials("John", "pass");
        httpPost.addHeader(new BasicScheme().authenticate(creds, httpPost, null));
     
        CloseableHttpResponse response = client.execute(httpPost);
        assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
        client.close();
    }
    复制代码

    3 Post with JSON

    使用JSON body进行post请求:

    复制代码
    @Test
    public void whenPostJsonUsingHttpClient_thenCorrect() 
      throws ClientProtocolException, IOException {
        CloseableHttpClient client = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost("http://www.example.com");
     
        String json = "{"id":1,"name":"John"}";
        StringEntity entity = new StringEntity(json);
        httpPost.setEntity(entity);
        httpPost.setHeader("Accept", "application/json");
        httpPost.setHeader("Content-type", "application/json");
     
        CloseableHttpResponse response = client.execute(httpPost);
        assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
        client.close();
    }
    复制代码

    4 Post with HttpClient Fluent API

    使用Request进行post请求:

    复制代码
    @Test
    public void whenPostFormUsingHttpClientFluentAPI_thenCorrect() 
      throws ClientProtocolException, IOException {
        HttpResponse response = 
          Request.Post("http://www.example.com").bodyForm(
            Form.form().add("username", "John").add("password", "pass").build())
            .execute().returnResponse();
     
        assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
    }
    复制代码

    5 Post Multipart Request

    Post一个Multipart Request:

    复制代码
    @Test
    public void whenSendMultipartRequestUsingHttpClient_thenCorrect() 
      throws ClientProtocolException, IOException {
        CloseableHttpClient client = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost("http://www.example.com");
     
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.addTextBody("username", "John");
        builder.addTextBody("password", "pass");
        builder.addBinaryBody("file", new File("test.txt"),
          ContentType.APPLICATION_OCTET_STREAM, "file.ext");
     
        HttpEntity multipart = builder.build();
        httpPost.setEntity(multipart);
     
        CloseableHttpResponse response = client.execute(httpPost);
        assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
        client.close();
    }
    复制代码

    6 Upload a File using HttpClient

    使用一个Post请求上传一个文件:

    复制代码
    @Test
    public void whenUploadFileUsingHttpClient_thenCorrect() 
      throws ClientProtocolException, IOException {
        CloseableHttpClient client = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost("http://www.example.com");
     
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.addBinaryBody("file", new File("test.txt"),
          ContentType.APPLICATION_OCTET_STREAM, "file.ext");
        HttpEntity multipart = builder.build();
     
        httpPost.setEntity(multipart);
     
        CloseableHttpResponse response = client.execute(httpPost);
        assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
        client.close();
    }
    复制代码

    7 Get File Upload Progress

    使用HttpClient获取文件上传的进度。扩展HttpEntityWrapper 获取进度。

    上传代码:

    复制代码
    @Test
    public void whenGetUploadFileProgressUsingHttpClient_thenCorrect()
      throws ClientProtocolException, IOException {
        CloseableHttpClient client = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost("http://www.example.com");
     
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.addBinaryBody("file", new File("test.txt"), 
          ContentType.APPLICATION_OCTET_STREAM, "file.ext");
        HttpEntity multipart = builder.build();
     
        ProgressEntityWrapper.ProgressListener pListener = 
         new ProgressEntityWrapper.ProgressListener() {
            @Override
            public void progress(float percentage) {
                assertFalse(Float.compare(percentage, 100) > 0);
            }
        };
     
        httpPost.setEntity(new ProgressEntityWrapper(multipart, pListener));
     
        CloseableHttpResponse response = client.execute(httpPost);
        assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
        client.close();
    }
    复制代码

    观察上传进度接口:

    public static interface ProgressListener {
        void progress(float percentage);
    }

    扩展了HttpEntityWrapperProgressEntityWrapper:

    复制代码
    public class ProgressEntityWrapper extends HttpEntityWrapper {
        private ProgressListener listener;
     
        public ProgressEntityWrapper(HttpEntity entity, 
          ProgressListener listener) {
            super(entity);
            this.listener = listener;
        }
     
        @Override
        public void writeTo(OutputStream outstream) throws IOException {
            super.writeTo(new CountingOutputStream(outstream, 
              listener, getContentLength()));
        }
    }
    复制代码

    扩展了FilterOutputStreamCountingOutputStream:

    复制代码
    public static class CountingOutputStream extends FilterOutputStream {
        private ProgressListener listener;
        private long transferred;
        private long totalBytes;
     
        public CountingOutputStream(
          OutputStream out, ProgressListener listener, long totalBytes) {
            super(out);
            this.listener = listener;
            transferred = 0;
            this.totalBytes = totalBytes;
        }
     
        @Override
        public void write(byte[] b, int off, int len) throws IOException {
            out.write(b, off, len);
            transferred += len;
            listener.progress(getCurrentProgress());
        }
     
        @Override
        public void write(int b) throws IOException {
            out.write(b);
            transferred++;
            listener.progress(getCurrentProgress());
        }
     
        private float getCurrentProgress() {
            return ((float) transferred / totalBytes) * 100;
        }
    }
    复制代码

    总结

    简单举例说明如何使用Apache HttpClient 4进行各种post请求。做个笔记。

  • 相关阅读:
    网络适配器、网卡和网卡驱动
    PostgreSQL
    vsftp安装
    Ubuntu里面软件的安装与卸载
    ubuntu下查找某个文件的路径
    TCP的几个状态
    C++产生随机数
    ERROR Cannot determine the location of the VS Common Tools Folder
    小波变换C++实现(一)----单层小波变换
    离散卷积的计算
  • 原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/6898230.html
Copyright © 2011-2022 走看看