httpClient请求案例

package com.client.example;

import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CookieStore;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.LaxRedirectStrategy;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;


public class httpClient {
    public static CloseableHttpClient httpClient = null;

    @BeforeClass
    public static void setUpBeforeClass() {
        httpClient = HttpClients.createDefault();
    }

    @AfterClass
    public static void tearDownAfterClass() throws IOException {
        httpClient.close();
    }


    /**
     * 发送get请求
     *
     * @throws ClientProtocolException
     * @throws IOException
     */
    @Test
    public void Get() throws ClientProtocolException, IOException {
        String userName = "method=loginMobile&loginname=test1&loginpass=test1";
        userName = URLEncoder.encode( userName,"utf-8" );
        String url = "http://118.24.13.38:8080/goods/UserServlet?"+ userName ;
        System.out.println( "请求地址:" + url );
        HttpGet get = new HttpGet( url );
        CloseableHttpResponse res = httpClient.execute( get );
        try {
            int statusCode = res.getStatusLine().getStatusCode(); // 获得状态行的状态码的信息
            System.out.println( statusCode );
            String resBody = EntityUtils.toString( res.getEntity() );// 获得响应的http
            System.out.println( resBody );
        } finally {
            res.close();
        }
    }

    /**
     * 发送post请求
     *
     * @throws ClientProtocolException
     * @throws IOException
     */
    @Test
    public void Post() throws ClientProtocolException, IOException {
        HttpPost post = new HttpPost( "http://118.24.13.38:8080/goods/UserServlet?" );
        // UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters,"utf-8");
        List<NameValuePair> list = new ArrayList<>(); // 将请求数据加入到此list中
        list.add( new BasicNameValuePair( "method", "loginMobile" ) );
        list.add( new BasicNameValuePair( "loginname", "test1" ) );
        list.add( new BasicNameValuePair( "loginpass", "test1" ) );
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity( list, Charset.forName( "utf-8" ) ); // 根据数据构造请求body部分
        post.setEntity( entity );

        CloseableHttpResponse res = httpClient.execute( post );// 发送请求
        try {
            int statusCode = res.getStatusLine().getStatusCode();
            // 得到响应的状态码
            System.out.println( statusCode );
            // 得到响应的内容
            String resBody = EntityUtils.toString( res.getEntity() );
            System.out.println( resBody );
        } finally {
            res.close();
        }
    }

    /**
     * get与重定向
     *
     * @throws ClientProtocolException
     * @throws IOException
     */
    @Test
    public void getAndRedirect() throws ClientProtocolException, IOException {
        String username = "test&f=an";
        username = URLEncoder.encode( username, "utf-8" );
        String url = "http://101.200.167.51:8080/http/method?redirect=true&username=" + username
                + "&pwd=testfan111&cars=volvo";
        System.out.println( url );
        HttpGet httpGet = new HttpGet( url );
        CloseableHttpResponse res = httpClient.execute( httpGet );
        try {
            int statusCode = res.getStatusLine().getStatusCode();// 获得状态行的状态码的信息
            System.out.println( statusCode );
            String resBody = EntityUtils.toString( res.getEntity() );// 获得响应的http
            // body部分
            System.out.println( "=====" + resBody );
        } finally {
            res.close();
        }
    }


    /**
     * 手动实现跟随重定向
     *
     * @throws ClientProtocolException
     * @throws IOException
     */
    @Test
    public void postAndRedirect() throws ClientProtocolException, IOException {
        httpClient = HttpClients.createDefault();// 通过这个方法创建的httpclient,只能手工模拟重定向过程:即先发起post请求,然后发起get请求
        HttpPost post = new HttpPost( "http://101.200.167.51:8080/http/method?redirect=true" );
        // UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters,
        // "utf-8");
        List<NameValuePair> paramList = new ArrayList<>();// 将请求数据加入到此list中
        paramList.add( new BasicNameValuePair( "username", "ykp" ) );
        paramList.add( new BasicNameValuePair( "pwd", "123456" ) );
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity( paramList, Charset.forName( "utf-8" ) );// 根据数据构造请求body部分
        post.setEntity( entity );
        CloseableHttpResponse res = httpClient.execute( post );// 发送请求
        String location = null;
        try {
            int statusCode = res.getStatusLine().getStatusCode();
            System.out.println( statusCode );
            location = res.getFirstHeader( "Location" ).getValue();
        } finally {
            res.close();
        }
        HttpGet httpGet = new HttpGet( location );
        CloseableHttpResponse redictRes = httpClient.execute( httpGet );
        try {
            int statusCode = redictRes.getStatusLine().getStatusCode();// 获得状态行的状态码的信息
            System.out.println( statusCode );
            String resBody = EntityUtils.toString( redictRes.getEntity() );// 获得响应的http
            // body部分
            System.out.println( resBody );
        } finally {
            res.close();
        }
    }


    /**
     * 跟随重定向
     *
     * @throws ClientProtocolException
     * @throws IOException
     */
    @Test
    public void postAndAutoRedirect() throws ClientProtocolException, IOException {
        httpClient = HttpClients.custom().setRedirectStrategy( new LaxRedirectStrategy() ).build();// 通过这个方法创建的httpclient,设置自动跟随重定向
        HttpPost post = new HttpPost( "http://101.200.167.51:8080/http/method?redirect=true" );
        // UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters,
        // "utf-8");
        List<NameValuePair> paramList = new ArrayList<>();// 将请求数据加入到此list中
        paramList.add( new BasicNameValuePair( "username", "ykp" ) );
        paramList.add( new BasicNameValuePair( "pwd", "123456" ) );
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity( paramList, Charset.forName( "utf-8" ) );// 根据数据构造请求body部分
        post.setEntity( entity );
        CloseableHttpResponse res = httpClient.execute( post );// 发送请求
        try {
            int statusCode = res.getStatusLine().getStatusCode();
            System.out.println( statusCode );
            String resBody = EntityUtils.toString( res.getEntity() );// 获得响应的http
            // body部分
            System.out.println( resBody );
        } finally {
            res.close();
        }
    }

    /**
     * 如何向服务器发送json格式的数据
     *
     * @throws ClientProtocolException
     * @throws IOException
     */
    @Test
    public void postJson() throws ClientProtocolException, IOException {
        HttpPost post = new HttpPost( "http://101.200.167.51:8080/http/method1" );
        String requestContent = "{'id':1,'name':'Yan Kunpeng','email':'testst@sina.com','birthday':{'birthday':'19850101'},'regDate':'2015-07-07 11:35:08'}";
        StringEntity entity = new StringEntity( requestContent, "utf-8" );// 如果是xml或json请求数据,那么通过StringEntity构造请求数据,同时设置字符集
        entity.setContentType( "application/json" );// 告诉服务器请求内容的类型
        post.setEntity( entity );
        CloseableHttpResponse res = httpClient.execute( post );// 发送请求
        try {
            int statusCode = res.getStatusLine().getStatusCode();
            System.out.println( statusCode );
            String resBody = EntityUtils.toString( res.getEntity() );
            System.out.println( resBody );
        } finally {
            res.close();
        }
    }

    /**
     * 如何向服务器发送xml格式的数据
     *
     * @throws ClientProtocolException
     * @throws IOException
     */
    @Test
    public void postXml() throws ClientProtocolException, IOException {
        HttpPost post = new HttpPost( "http://101.200.167.51:8080/http/method1" );
        String requestContent =
                "<?xml version='1.0' encoding='ISO-8859-1'?><note><to>George</to><from>John</from><heading>Reminder</heading><body>Don't forget the meeting!</body></note>";
        StringEntity entity = new StringEntity( requestContent, "utf-8" );// 如果是xml或json请求数据,那么通过StringEntity构造请求数据,同时设置字符集
        entity.setContentType( "application/xml" );// 告诉服务器请求内容的类型
        post.setEntity( entity );
        CloseableHttpResponse res = httpClient.execute( post );// 发送请求
        try {
            int statusCode = res.getStatusLine().getStatusCode();
            System.out.println( statusCode );
            String resBody = EntityUtils.toString( res.getEntity() );
            System.out.println( resBody );
        } finally {
            res.close();
        }
    }


    /**
     * 带有token验证信息的表单:如何提取表单中token,获得token后才能在提交表单时带上token
     *
     * @throws ClientProtocolException
     * @throws IOException
     */
    @Test
    public void postFormWithToken() throws ClientProtocolException, IOException {
        HttpClientContext context = HttpClientContext.create();
        CookieStore cookieStore = new BasicCookieStore();// 创建cookie存储器,存储cookie信息
        context.setCookieStore( cookieStore );// context目的是保存各种配置信息,包括cookiestore
        HttpGet httpGet = new HttpGet( "http://101.200.167.51:8080/http/tokenForm" );
        CloseableHttpResponse res = httpClient.execute( httpGet, context );// 执行请求的时候,会通过context中的cookiestore进行cookie保存。
        String token = null;
        try {
            String resBody = EntityUtils.toString( res.getEntity() );// 获得响应的http
            // body部分
            System.out.println( resBody );
            // <input type="hidden" name="_token"
            // value="6c45hpvfbpt2clcdfrw6j5okv4ocearo">
            int t1 = resBody.indexOf( "_token" ) + 15;// 找到value="的双引号的位置
            int t2 = resBody.indexOf( """, t1 ); // 找到token后面的双引号的位置
            token = resBody.substring( t1, t2 );// 截取token
            System.out.println( token );
        } finally {
            res.close();
        }
        HttpPost post = new HttpPost( "http://101.200.167.51:8080/http/tokenForm" );
        List<NameValuePair> paramList = new ArrayList<>();// 将请求数据加入到此list中
        paramList.add( new BasicNameValuePair( "_token", token ) );//
        paramList.add( new BasicNameValuePair( "username", "ykp" ) );
        paramList.add( new BasicNameValuePair( "pwd", "123456" ) );
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity( paramList, Charset.forName( "utf-8" ) );// 根据数据构造请求body部分
        post.setEntity( entity );
        CloseableHttpResponse postres = httpClient.execute( post, context );// 发送请求,帶上cookie信息
        try {
            int statusCode = postres.getStatusLine().getStatusCode();
            System.out.println( statusCode );
            String resBody = EntityUtils.toString( postres.getEntity() );
            System.out.println( resBody );
        } finally {
            postres.close();
        }
    }
}

  

  

  

  

  

原文地址:https://www.cnblogs.com/Alexr/p/9360753.html