Java调用第三方http接口的常用方式总结

177 篇文章 6 订阅

这篇文章主要介绍了Java调用第三方http接口的常用方式总结,具有很好的参考价值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

目录

1.概述

在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适。很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信、天气等)。

在Java项目中调用第三方接口的常用方式有

  • ①通过JDK网络类Java.net.HttpURLConnection;
  • ②通过Apache common封装好的HttpClient;
  • ③通过Apache封装好的CloseableHttpClient;
  • ④通过OkHttp;
  • ⑤通过Spring的RestTemplate;
  • ⑥通过hutool的HttpUtil。

2.Java调用第三方http接口的方式

2.1 通过JDK网络类Java.net.HttpURLConnection

简介:java.net包下的原生java api提供的http请求。 

使用步骤:

1、通过统一资源定位器(java.net.URL)获取连接器(java.net.URLConnection)。

2、设置请求的参数。

3、发送请求。

4、以输入流的形式获取返回内容。

5、关闭输入流。

比较原始的一种调用做法,这里把get请求和post请求都统一放在一个方法里面,直接上代码: 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

import com.alibaba.fastjson.JSON;

import java.io.*;

import java.net.HttpURLConnection;

import java.net.URL;

  

/**

 * @ClassName : HttpUrlConnectionToInterface

 * @Description : jdk类HttpURLConnection调用第三方http接口

 * @Author : THQ

 * @Date: 2021-09-02 14:09

 * @Version V1.0

 */

public class HttpUrlConnectionToInterface {

  

    /**

     * 以post方式调用对方接口方法

     * @param pathUrl

     */

    public static void doPost(String pathUrl, String data){

        OutputStreamWriter out = null;

        BufferedReader br = null;

        String result = "";

        try {

            URL url = new URL(pathUrl);

  

            //打开和url之间的连接

            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

  

            //设定请求的方法为"POST",默认是GET

            //post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。

            conn.setRequestMethod("POST");

  

            //设置30秒连接超时

            conn.setConnectTimeout(30000);

            //设置30秒读取超时

            conn.setReadTimeout(30000);

  

            // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在http正文内,因此需要设为true, 默认情况下是false;

            conn.setDoOutput(true);

            // 设置是否从httpUrlConnection读入,默认情况下是true;

            conn.setDoInput(true);

  

            // Post请求不能使用缓存

            conn.setUseCaches(false);

  

            //设置通用的请求属性

            conn.setRequestProperty("accept", "*/*");

            conn.setRequestProperty("connection", "Keep-Alive");  //维持长链接

            conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");

  

            //连接,从上述url.openConnection()至此的配置必须要在connect之前完成,

            conn.connect();

  

            /**

             * 下面的三句代码,就是调用第三方http接口

             */

            //获取URLConnection对象对应的输出流

            //此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法,所以在开发中不调用上述的connect()也可以)。

            out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");

            //发送请求参数即数据

            out.write(data);

            //flush输出流的缓冲

            out.flush();

  

            /**

             * 下面的代码相当于,获取调用第三方http接口后返回的结果

             */

            //获取URLConnection对象对应的输入流

            InputStream is = conn.getInputStream();

            //构造一个字符流缓存

            br = new BufferedReader(new InputStreamReader(is));

            String str = "";

            while ((str = br.readLine()) != null){

                result += str;

            }

            System.out.println(result);

            //关闭流

            is.close();

            //断开连接,disconnect是在底层tcp socket链接空闲时才切断,如果正在被其他线程使用就不切断。

            conn.disconnect();

  

        } catch (Exception e) {

            e.printStackTrace();

        }finally {

            try {

                if (out != null){

                    out.close();

                }

                if (br != null){

                    br.close();

                }

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }

  

    /**

     * 以get方式调用对方接口方法

     * @param pathUrl

     */

    public static void doGet(String pathUrl){

        BufferedReader br = null;

        String result = "";

        try {

            URL url = new URL(pathUrl);

  

            //打开和url之间的连接

            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

  

            //设定请求的方法为"GET",默认是GET

            //post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。

            conn.setRequestMethod("GET");

  

            //设置30秒连接超时

            conn.setConnectTimeout(30000);

            //设置30秒读取超时

            conn.setReadTimeout(30000);

  

            // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在http正文内,因此需要设为true, 默认情况下是false;

            conn.setDoOutput(true);

            // 设置是否从httpUrlConnection读入,默认情况下是true;

            conn.setDoInput(true);

  

            // Post请求不能使用缓存(get可以不使用)

            conn.setUseCaches(false);

  

            //设置通用的请求属性

            conn.setRequestProperty("accept", "*/*");

            conn.setRequestProperty("connection", "Keep-Alive");  //维持长链接

            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");

  

            //连接,从上述url.openConnection()至此的配置必须要在connect之前完成,

            conn.connect();

  

            /**

             * 下面的代码相当于,获取调用第三方http接口后返回的结果

             */

            //获取URLConnection对象对应的输入流

            InputStream is = conn.getInputStream();

            //构造一个字符流缓存

            br = new BufferedReader(new InputStreamReader(is, "UTF-8"));

            String str = "";

            while ((str = br.readLine()) != null){

                result += str;

            }

            System.out.println(result);

            //关闭流

            is.close();

            //断开连接,disconnect是在底层tcp socket链接空闲时才切断,如果正在被其他线程使用就不切断。

            conn.disconnect();

        } catch (Exception e) {

            e.printStackTrace();

        }finally {

            try {

                if (br != null){

                    br.close();

                }

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }

  

    public static void main(String[] args) {

        //post请求一般都是把实体对象转为Json字符串

        LocationPrintDTO locationPrintDTO = new LocationPrintDTO();

        String s = JSON.toJSONString(locationPrintDTO);

        doPost("http://127.0.0.1:9090/ZebraPrinter/locationPrint", s);

        doGet("https://weather.cma.cn/api/climate?stationid=57516");

    }

}

2.2 通过apache common封装好的HttpClient

简介:http client到目前为止最新是5.1版,官网地址:http://hc.apache.org/ 。Http client专为推展而设计,同时为基本http协议提供强大支持,尽管java.net包提供了通过http访问的基本功能,但是未提供许多应用程序所需要功能。

使用步骤:

  • 生成一个HttpClient对象并设置相应的参数;
  • 生成一个GetMethod对象或PostMethod并设置响应的参数;
  • 用HttpClient生成的对象来执行GetMethod生成的Get方法;
  • 处理响应状态码;
  • 若响应正常,处理HTTP响应内容;
  • 释放连接。无论执行方法是否成功,都必须释放连接。

导入如下jar包:

1

2

3

4

5

6

<!--HttpClient-->

<dependency>

    <groupId>commons-httpclient</groupId>

    <artifactId>commons-httpclient</artifactId>

    <version>3.1</version>

</dependency>

代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

import com.alibaba.fastjson.JSONObject;

import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;

import org.apache.commons.httpclient.Header;

import org.apache.commons.httpclient.HttpClient;

import org.apache.commons.httpclient.HttpException;

import org.apache.commons.httpclient.methods.GetMethod;

import org.apache.commons.httpclient.methods.PostMethod;

import org.apache.commons.httpclient.params.HttpMethodParams;

  

import java.io.IOException;

  

/**

 * @ClassName : HttpClientToInterface

 * @Description : HttpClient模拟get、post请求并发送请求参数(json等)

 * @Author : THQ

 * @Date: 2021-09-02 16:50

 * @Version V1.0

 */

public class HttpClientToInterface {

  

    /**

     * httpClient的get请求方式

     * 使用GetMethod来访问一个URL对应的网页实现步骤:

     * 1.生成一个HttpClient对象并设置相应的参数;

     * 2.生成一个GetMethod对象并设置响应的参数;

     * 3.用HttpClient生成的对象来执行GetMethod生成的Get方法;

     * 4.处理响应状态码;

     * 5.若响应正常,处理HTTP响应内容;

     * 6.释放连接。

     * @param url

     * @param charset

     * @return

     */

    public static String doGet(String url, String charset){

        /**

         * 1.生成HttpClient对象并设置参数

         */

        HttpClient httpClient = new HttpClient();

        //设置Http连接超时为5秒

        httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);

  

        /**

         * 2.生成GetMethod对象并设置参数

         */

        GetMethod getMethod = new GetMethod(url);

        //设置get请求超时为5秒

        getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000);

        //设置请求重试处理,用的是默认的重试处理:请求三次

        getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());

  

        String response = "";

  

        /**

         * 3.执行HTTP GET 请求

         */

        try {

            int statusCode = httpClient.executeMethod(getMethod);

  

            /**

             * 4.判断访问的状态码

             */

            if (statusCode != HttpStatus.SC_OK){

                System.err.println("请求出错:" + getMethod.getStatusLine());

            }

  

            /**

             * 5.处理HTTP响应内容

             */

            //HTTP响应头部信息,这里简单打印

            Header[] headers = getMethod.getResponseHeaders();

            for (Header h: headers){

                System.out.println(h.getName() + "---------------" + h.getValue());

            }

            //读取HTTP响应内容,这里简单打印网页内容

            //读取为字节数组

            byte[] responseBody = getMethod.getResponseBody();

            response = new String(responseBody, charset);

            System.out.println("-----------response:" + response);

            //读取为InputStream,在网页内容数据量大时候推荐使用

            //InputStream response = getMethod.getResponseBodyAsStream();

  

        } catch (HttpException e) {

            //发生致命的异常,可能是协议不对或者返回的内容有问题

            System.out.println("请检查输入的URL!");

            e.printStackTrace();

        } catch (IOException e){

            //发生网络异常

            System.out.println("发生网络异常!");

        }finally {

            /**

             * 6.释放连接

             */

            getMethod.releaseConnection();

        }

        return response;

    }

  

    /**

     * post请求

     * @param url

     * @param json

     * @return

     */

    public static String doPost(String url, JSONObject json){

        HttpClient httpClient = new HttpClient();

        PostMethod postMethod = new PostMethod(url);

  

        postMethod.addRequestHeader("accept", "*/*");

        postMethod.addRequestHeader("connection", "Keep-Alive");

        //设置json格式传送

        postMethod.addRequestHeader("Content-Type", "application/json;charset=utf-8");

        //必须设置下面这个Header

        postMethod.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");

        //添加请求参数

        postMethod.addParameter("commentId", json.getString("commentId"));

  

        String res = "";

        try {

            int code = httpClient.executeMethod(postMethod);

            if (code == 200){

                res = postMethod.getResponseBodyAsString();

                System.out.println(res);

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

        return res;

    }

  

    public static void main(String[] args) {

        doGet("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071", "UTF-8");

        System.out.println("-----------分割线------------");

        System.out.println("-----------分割线------------");

        System.out.println("-----------分割线------------");

  

        JSONObject jsonObject = new JSONObject();

        jsonObject.put("commentId", "13026194071");

        doPost("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm", jsonObject);

    }

}

2.3 通过Apache封装好的CloseableHttpClient

CloseableHttpClient是在HttpClient的基础上修改更新而来的,这里还涉及到请求头token的设置(请求验证),利用fastjson转换请求或返回结果字符串为json格式,当然上面两种方式也是可以设置请求头token、json的,这里只在下面说明。

导入如下jar包:

1

2

3

4

5

6

7

8

9

10

11

<!--CloseableHttpClient-->

<dependency>

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

    <artifactId>httpclient</artifactId>

    <version>4.5.2</version>

</dependency>

<dependency>

    <groupId>com.alibaba</groupId>

    <artifactId>fastjson</artifactId>

    <version>1.2.28</version>

</dependency>

代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

import com.alibaba.fastjson.JSONObject;

import org.apache.http.HttpResponse;

import org.apache.http.HttpStatus;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.entity.StringEntity;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClientBuilder;

import org.apache.http.util.EntityUtils;

  

import java.io.IOException;

  

/**

 * @ClassName : CloseableHttpClientToInterface

 * @Description : Apache封装好的CloseableHttpClient

 * @Author : THQ

 * @Date: 2021-09-02 17:16

 * @Version V1.0

 */

public class CloseableHttpClientToInterface {

    private static String tokenString = "";

    private static String AUTH_TOKEN_EXPIRED = "AUTH_TOKEN_EXPIRED";

    private static CloseableHttpClient httpClient = null;

  

    /**

     * 以get方式调用第三方接口

     * @param url

     * @return

     */

    public static String doGet(String url, String token){

        //创建HttpClient对象

        CloseableHttpClient httpClient = HttpClientBuilder.create().build();

        HttpGet get = new HttpGet(url);

  

        try {

            if (tokenString != null && !tokenString.equals("")){

                tokenString = getToken();

            }

            //api_gateway_auth_token自定义header头,用于token验证使用

            get.addHeader("api_gateway_auth_token", tokenString);

            get.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");

            HttpResponse response = httpClient.execute(get);

            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){

                //返回json格式

                String res = EntityUtils.toString(response.getEntity());

                return res;

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

        return null;

    }

  

    /**

     * 以post方式调用第三方接口

     * @param url

     * @param json

     * @return

     */

    public static String doPost(String url, JSONObject json){

  

        try {

            if (httpClient == null){

                httpClient = HttpClientBuilder.create().build();

            }

  

            HttpPost post = new HttpPost(url);

  

            if (tokenString != null && !tokenString.equals("")){

                tokenString = getToken();

            }

  

            //api_gateway_auth_token自定义header头,用于token验证使用

            post.addHeader("api_gateway_auth_token", tokenString);

            post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");

  

            StringEntity s = new StringEntity(json.toString());

            s.setContentEncoding("UTF-8");

            //发送json数据需要设置contentType

            s.setContentType("application/x-www-form-urlencoded");

            //设置请求参数

            post.setEntity(s);

            HttpResponse response = httpClient.execute(post);

  

            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){

                //返回json格式

                String res = EntityUtils.toString(response.getEntity());

                return res;

            }

        } catch (Exception e) {

            e.printStackTrace();

        }finally {

            if (httpClient != null){

                try {

                    httpClient.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

        }

        return null;

    }

  

    /**

     * 获取第三方接口的token

     */

    public static String getToken(){

  

        String token = "";

  

        JSONObject object = new JSONObject();

        object.put("appid", "appid");

        object.put("secretkey", "secretkey");

  

        try {

            if (httpClient == null){

                httpClient = HttpClientBuilder.create().build();

            }

            HttpPost post = new HttpPost("http://localhost/login");

  

            post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");

  

            StringEntity s = new StringEntity(object.toString());

            s.setContentEncoding("UTF-8");

            //发送json数据需要设置contentType

            s.setContentType("application/x-www-form-urlencoded");

            //设置请求参数

            post.setEntity(s);

            HttpResponse response = httpClient.execute(post);

  

            //这里可以把返回的结果按照自定义的返回数据结果,把string转换成自定义类

            //ResultTokenBO result = JSONObject.parseObject(response, ResultTokenBO.class);

  

            //把response转为jsonObject

            JSONObject result = JSONObject.parseObject(String.valueOf(response));

            if (result.containsKey("token")){

                token = result.getString("token");

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

        return token;

    }

  

    /**

     * 测试

     */

    public static void test(String telephone){

  

        JSONObject object = new JSONObject();

        object.put("telephone", telephone);

  

        try {

            //首先获取token

            tokenString = getToken();

            String response = doPost("http://localhost/searchUrl", object);

  

            //如果返回的结果是list形式的,需要使用JSONObject.parseArray转换

            //List<Result> list = JSONObject.parseArray(response, Result.class);

  

            System.out.println(response);

  

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

  

    public static void main(String[] args) {

        test("12345678910");

    }

2.4 通过OkHttp

简介:OkHttp是一个默认有效的HTTP客户端,有效地执行HTTP可以加快您的负载并节省带宽,如果您的服务有多个IP地址,如果第一次连接失败,OkHttp将尝试备用地址。这对于IPv4 + IPv6和冗余数据中心中托管的服务是必需的。OkHttp启动具有现代TLS功能(SNI,ALPN)的新连接,并在握手失败时回退到TLS 1.0,OkHttp支持Android 2.3及更高版本。对于Java,最低要求是1.7。

操作步骤:

1、创建OkhttpClient。

2、mClient执行newCall将Request转化成一个Call。

3、最后call执行excute同步执行,enqueue异步执行。

4、Request主要通过Request.Builder来构建。

5、缓存。

6、取消请求。

导入如下jar包:

1

2

3

4

5

6

<!--okhttp3-->

<dependency>

    <groupId>com.squareup.okhttp3</groupId>

    <artifactId>okhttp</artifactId>

    <version>4.9.1</version>

</dependency>

代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

import okhttp3.*;

  

import java.io.IOException;

  

/**

 * @ClassName : OkHttpToInterface

 * @Description :

 * @Author : THQ

 * @Date: 2021-09-02 17:36

 * @Version V1.0

 */

public class OkHttpToInterface {

  

    public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");

  

    /**

     * 以get方式调用第三方接口

     * @param url

     */

    public static void doGet(String url) {

        OkHttpClient okHttpClient = new OkHttpClient();

        final Request request = new Request.Builder()

                .url(url)

                .get()//默认就是GET请求,可以不写

                .build();

        Call call = okHttpClient.newCall(request);

        call.enqueue(new Callback() {

            @Override

            public void onFailure(Call call, IOException e) {

                System.out.println( "onFailure: ");

            }

  

            @Override

            public void onResponse(Call call, Response response) throws IOException {

                System.out.println("onResponse: " + response.body().string());

            }

        });

    }

  

    /**

     * post请求

     * @param url

     * @param json

     */

    public static void doPost(String url, String json){

        MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");

        String requestBody = json;

        Request request = new Request.Builder()

                .url(url)

                .post(RequestBody.create(mediaType, requestBody))

                .build();

        OkHttpClient okHttpClient = new OkHttpClient();

        okHttpClient.newCall(request).enqueue(new Callback() {

            @Override

            public void onFailure(Call call, IOException e) {

                System.out.println("onFailure: " + e.getMessage());

            }

  

            @Override

            public void onResponse(Call call, Response response) throws IOException {

                System.out.println(response.protocol() + " " +response.code() + " " + response.message());

                Headers headers = response.headers();

                for (int i = 0; i < headers.size(); i++) {

                    System.out.println(headers.name(i) + ":" + headers.value(i));

                }

                System.out.println("onResponse: " + response.body().string());

            }

        });

    }

  

    public static void main(String[] args) {

        doGet("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071");

        doPost("https://api.github.com/markdown/raw","I am Jdqm.");

    }

}

2.5 通过Spring的RestTemplate

RestTemple是前三种方式的集大成者,代码编写更加简单,目前可以采用的调用第三方接口有:

  • delete() 在特定的URL上对资源执行HTTP DELETE操作
  • exchange() 在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中映射得到的
  • execute() 在URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象
  • getForEntity() 发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象
  • getForObject() 发送一个HTTP GET请求,返回的请求体将映射为一个对象
  • postForEntity()POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得到的
  • postForObject() POST 数据到一个URL,返回根据响应体匹配形成的对象
  • headForHeaders() 发送HTTP HEAD请求,返回包含特定资源URL的HTTP头
  • optionsForAllow() 发送HTTP OPTIONS请求,返回对特定URL的Allow头信息
  • postForLocation() POST 数据到一个URL,返回新创建资源的URL
  • put() PUT 资源到特定的URL

注意:目前标红的为常用的

操作步骤:

1、使用默认构造方法new一个实例new RestTemplate()。

2、RestTemplate 内部通过调用 doExecute 方法,首先就是获取 ClientHttpRequest。

3、RestTemplate 实现了抽象类 HttpAccessor ,所以可以调用父类的 createRequest。

4、SimpleClientHttpRequestFactory 实现了 ClientHttpRequest,同时实现方法。

5、执行 requestCallback.doWithRequest(request)。

6、执行 response = request.execute()。

7、最后解析response。

首先导入springboot的web包

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<parent>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>2.1.4.RELEASE</version>

</parent>

<dependencies>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-web</artifactId>

    </dependency>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-test</artifactId>

        <scope>test</scope>

    </dependency>

</dependencies>

在启动类同包下创建RestTemplateConfig.java类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.http.client.ClientHttpRequestFactory;

import org.springframework.http.client.SimpleClientHttpRequestFactory;

import org.springframework.web.client.RestTemplate;

  

/**

 * @ClassName : RestTemplateConfig

 * @Description :

 * @Author : THQ

 * @Date: 2021-09-02 20:00

 * @Version V1.0

 */

@Configuration

public class RestTemplateConfig {

  

    @Bean

    public RestTemplate restTemplate(ClientHttpRequestFactory factory){

        return new RestTemplate(factory);

    }

  

    @Bean

    public ClientHttpRequestFactory simpleClientHttpRequestFactory(){

        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();

        factory.setConnectTimeout(15000);

        factory.setReadTimeout(5000);

        return factory;

    }

}

然后在Service类(RestTemplateToInterface )中注入使用

具体代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

import com.alibaba.fastjson.JSONObject;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.http.*;

import org.springframework.web.client.RestTemplate;

  

/**

 * @ClassName : RestTemplateToInterface

 * @Description :

 * @Author : THQ

 * @Date: 2021-09-02 20:03

 * @Version V1.0

 */

public class RestTemplateToInterface {

  

    @Autowired

    private RestTemplate restTemplate;

  

    /**

     * 以get方式请求第三方http接口 getForEntity

     * @param url

     * @return

     */

    public User doGetWith1(String url){

        ResponseEntity<User> responseEntity = restTemplate.getForEntity(url, User.class);

        User user = responseEntity.getBody();

        return user;

    }

  

    /**

     * 以get方式请求第三方http接口 getForObject

     * 返回值返回的是响应体,省去了我们再去getBody()

     * @param url

     * @return

     */

    public User doGetWith2(String url){

        User user  = restTemplate.getForObject(url, User.class);

        return user;

    }

  

    /**

     * 以post方式请求第三方http接口 postForEntity

     * @param url

     * @return

     */

    public String doPostWith1(String url){

        User user = new User("小白", 20);

        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, user, String.class);

        String body = responseEntity.getBody();

        return body;

    }

  

    /**

     * 以post方式请求第三方http接口 postForEntity

     * @param url

     * @return

     */

    public String doPostWith2(String url){

        User user = new User("小白", 20);

        String body = restTemplate.postForObject(url, user, String.class);

        return body;

    }

  

    /**

     * exchange

     * @return

     */

    public String doExchange(String url, Integer age, String name){

        //header参数

        HttpHeaders headers = new HttpHeaders();

        String token = "asdfaf2322";

        headers.add("authorization", token);

        headers.setContentType(MediaType.APPLICATION_JSON);

  

        //放入body中的json参数

        JSONObject obj = new JSONObject();

        obj.put("age", age);

        obj.put("name", name);

  

        //组装

        HttpEntity<JSONObject> request = new HttpEntity<>(obj, headers);

        ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, request, String.class);

        String body = responseEntity.getBody();

        return body;

    }

  

}

2.6通过hutool的HttpUtil

 简介:关于Hutool工具类之HttpUtil如何使用可以参考官方文档Hutool之HttpUtil

导入如下jar包:

1

2

3

4

5

<dependency>

    <groupId>cn.hutool</groupId>

    <artifactId>hutool-all</artifactId>

    <version>5.7.1</version>

</dependency>

代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

import cn.hutool.core.io.FileUtil;

import cn.hutool.core.util.CharsetUtil;

import cn.hutool.http.HttpUtil;

  

import java.util.HashMap;

  

/**

 * @ClassName : HttpUtilToInterface

 * @Description :

 * @Author : THQ

 * @Date: 2021-09-02 20:15

 * @Version V1.0

 */

public class HttpUtilToInterface {

  

    /**

     * get请求示例

     */

    public static void doGet() {

        // 最简单的HTTP请求,可以自动通过header等信息判断编码,不区分HTTP和HTTPS

        String result1 = HttpUtil.get("https://www.baidu.com");

  

        // 当无法识别页面编码的时候,可以自定义请求页面的编码

        String result2 = HttpUtil.get("https://www.baidu.com", CharsetUtil.CHARSET_UTF_8);

  

        //可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中

        HashMap<String, Object> paramMap = new HashMap<>();

        paramMap.put("city", "北京");

        String result3 = HttpUtil.get("https://www.baidu.com", paramMap);

    }

  

    /**

     * post请求示例

     */

    public static void doPost() {

        //post普通请求示例

        HashMap<String, Object> paramMap = new HashMap<>();

        paramMap.put("city", "北京");

        String result= HttpUtil.post("https://www.baidu.com", paramMap);

  

        //文件上传示例

        HashMap<String, Object> paramMap1 = new HashMap<>();

        //文件上传只需将参数中的键指定(默认file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别

        paramMap1.put("file", FileUtil.file("D:\\face.jpg"));

        String result1= HttpUtil.post("https://www.baidu.com", paramMap1);

  

        //下载文件(很少用)

        String fileUrl = "http://mirrors.sohu.com/centos/8.4.2105/isos/x86_64/CentOS-8.4.2105-x86_64-dvd1.iso";

        //将文件下载后保存在E盘,返回结果为下载文件大小

        long size = HttpUtil.downloadFile(fileUrl, FileUtil.file("e:/"));

        System.out.println("Download size: " + size);

    }

}

3.总结

日常开发中,我们一般使用spring的resttemplate和hutool的HttpUtil偏多,特别是hutool,非常推荐,里面有很多省心的工具类。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

来源:Java调用第三方http接口的常用方式总结_java_脚本之家

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值