首页 > 代码库 > Posting with HttpClient

Posting with HttpClient

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

1 Basic Post

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

@Testpublic 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验证:

@Testpublic 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请求:

@Testpublic 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请求:

@Testpublic 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:

@Testpublic 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请求上传一个文件:

@Testpublic 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 获取进度。

上传代码:

@Testpublic 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请求。做个笔记。

 

Posting with HttpClient