远程接口调用

1.1          第二部分:远程接口调用方式HttpClient

问题:现在我们已经开发好了接口了,那该如何调用这个接口呢?

答:使用Httpclient客户端。

 

1.1.1         Httpclient简介

1.1.1.1     什么是httpclient

HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)

下载地址:http://hc.apache.org/

 

1.1.1.2     httpclient作用

在java代码中,发送Http请求。通常用来实现远程接口调用。

1.1.2         HttpClient测试

说明:在ego-base中测试

在ego-base工程中添加httpclient的pom依赖。

<dependency>

       <groupId>org.apache.httpcomponents</groupId>

       <artifactId>httpclient</artifactId>

</dependency>

 

1.1.2.1     执行GET请求

public static void doGet(){

        // 创建Httpclient对象

        CloseableHttpClient httpclient = HttpClients.createDefault();

 

        // 创建http GET请求

        HttpGet httpGet = new HttpGet("http://www.oschina.net/");

 

        CloseableHttpResponse response = null;

        try {

            // 执行请求

            response = httpclient.execute(httpGet);

            System.out.println(response.getStatusLine());

            // 判断返回状态是否为200

            if (response.getStatusLine().getStatusCode() == 200) {

                String content = EntityUtils.toString(response.getEntity(), "UTF-8");

                System.out.println("内容长度:" + content.length());

            }

        }catch(Exception e){

            e.printStackTrace();

           

        } finally {

            if (response != null) {

                try {

                  response.close();

              } catch (IOException e) {

                  e.printStackTrace();

              }

            }

            try {

              httpclient.close();

           } catch (IOException e) {

              e.printStackTrace();

           }

        }

 

1.1.2.2     执行GET带参数

public static void doGetParam(){

        // 创建Httpclient对象

       CloseableHttpClient httpclient = HttpClients.createDefault();

       CloseableHttpResponse response = null;

       try {

 

        // 定义请求的参数

        URI uri = new URIBuilder("http://www.baidu.com/s").setParameter("wd", "数据库").build();

 

        System.out.println(uri);

 

        // 创建http GET请求

        HttpGet httpGet = new HttpGet(uri);

 

            // 执行请求

            response = httpclient.execute(httpGet);

            // 判断返回状态是否为200

            if (response.getStatusLine().getStatusCode() == 200) {

                String content = EntityUtils.toString(response.getEntity(), "UTF-8");

                System.out.println(content);

            }

        }catch(Exception e){

            e.printStackTrace();

           

        }finally {

            if (response != null) {

                try {

                  response.close();

              } catch (IOException e) {

                  // TODO Auto-generated catch block

                  e.printStackTrace();

              }

            }

            try {

              httpclient.close();

           } catch (IOException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

        }

    }

 

1.1.2.3     执行post请求

public static void doPost(){

        // 创建Httpclient对象

        CloseableHttpClient httpclient = HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build();

 

        // 创建http POST请求

        HttpPost httpPost = new HttpPost("http://www.oschina.net/");

 

        CloseableHttpResponse response = null;

        try {

            // 执行请求

            response = httpclient.execute(httpPost);

            System.out.println(response.getStatusLine());

            // 判断返回状态是否为200

            if (response.getStatusLine().getStatusCode() == 200) {

                String content = EntityUtils.toString(response.getEntity(), "UTF-8");

                System.out.println(content);

            }

        }catch(Exception e){

            e.printStackTrace();

           

        }finally {

            if (response != null) {

                try {

                  response.close();

              } catch (IOException e) {

                  // TODO Auto-generated catch block

                  e.printStackTrace();

              }

            }

            try {

              httpclient.close();

           } catch (IOException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

        }

    }

 

1.1.2.4     执行post带参数

public static void doPostParam() throws Exception{

        // 创建Httpclient对象

        CloseableHttpClient httpclient = HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build();

 

        // 创建http POST请求

        HttpPost httpPost = new HttpPost("http://www.oschina.net/search");

      

        // 设置2个post参数,一个是scope、一个是q

        List<NameValuePair> parameters = new ArrayList<NameValuePair>();

        parameters.add(new BasicNameValuePair("scope", "project"));

        parameters.add(new BasicNameValuePair("q", "java"));

        // 构造一个form表单式的实体

        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters);

        // 将请求实体设置到httpPost对象中

        httpPost.setEntity(formEntity);

 

        CloseableHttpResponse response = null;

        try {

            // 执行请求

            response = httpclient.execute(httpPost);

            System.out.println(response.getStatusLine());

            // 判断返回状态是否为200

            if (response.getStatusLine().getStatusCode() == 200) {

                String content = EntityUtils.toString(response.getEntity(), "UTF-8");

                System.out.println(content);

            }

        } finally {

            if (response != null) {

                response.close();

            }

            httpclient.close();

        }

    }

 

1.1.3         httpclient常见问题及解决方案

1.1.3.1     请求参数乱码

设置请求的编码格式:

obj.addHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");

 

1.1.3.2     响应HTTP/1.1 403 Forbidden

原因:网站设置了反爬虫机制,禁止非法访问。

解决方案:伪装浏览器。

obj.addHeader("User-Agent"," Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537. 36 (KHTML, like Gecko) Chrome/31.0.1650.63")

 

posted @ 2019-07-27 20:48  于陆  阅读(2754)  评论(0编辑  收藏  举报