Java 调用第三方接口方法

article/2025/8/27 6:16:53

Java 调用第三方接口方法

一、 通过JDK网络类Java.net.HttpURLConnection

1.java.net包下的原生java api提供的http请求

使用步骤:

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

2、设置请求的参数。

3、发送请求。

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

5、关闭输入流。

2.HttpClientUtil工具类

/*** jdk 调用第三方接口* @author hsq*/
public class HttpClientUtil2 {/*** 以post方式调用对方接口方法* @param pathUrl*/public static String 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();}}return result;}/*** 以get方式调用对方接口方法* @param pathUrl*/public static String 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();}}return result;}
}

3.第三方api接口

/*** @author hsq*/
@RestController
@RequestMapping("/api")
public class HelloWorld {private static final Logger log= LoggerFactory.getLogger(HelloWorld.class);@GetMapping ("/getHello")public Result getHelloWord(){log.info("进入到api接口.......");return Result.success("hello world api get 接口数据");}@PostMapping("/postHello")public Result postHelloWord(@RequestBody User user){log.info("进入post 方法.....");System.out.println(user.toString());return Result.success("hello world api post接口数据");}
}

在这里插入图片描述

4.测试类

 @Testpublic void testJDKApi(){//测试get方法String s = HttpClientUtil2.doGet("http://localhost:9092/api/getHello");System.out.println("get方法:"+s);//测试post方法User user = new User();user.setUname("胡萝卜");user.setRole("普通用户");//把对象转换为json格式String s1 = JsonUtil.toJson(user);String postString = HttpClientUtil2.doPost("http://localhost:9092/api/postHello",s1);System.out.println("post方法:"+postString);}

结果:
在这里插入图片描述

二、通过Apache common封装好的HttpClient

1.引入依赖

 		<!--HttpClient--><dependency><groupId>commons-httpclient</groupId><artifactId>commons-httpclient</artifactId><version>3.1</version></dependency><!--json--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.28</version></dependency>

2.httpClientUtil

/***httpClient的get请求方式* 使用GetMethod来访问一个URL对应的网页实现步骤:* 1.生成一个HttpClient对象并设置相应的参数;* 2.生成一个GetMethod对象并设置响应的参数;* 3.用HttpClient生成的对象来执行GetMethod生成的Get方法;* 4.处理响应状态码;* 5.若响应正常,处理HTTP响应内容;* 6.释放连接。* @author hsq*/
public class HttpClientUtil {/*** @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");//必须设置下面这个HeaderpostMethod.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("param", json.getString("param"));StringRequestEntity param = new StringRequestEntity(json.getString("param"));postMethod.setRequestEntity(param);String res = "";try {int code = httpClient.executeMethod(postMethod);if (code == 200){byte[] responseBody = postMethod.getResponseBody();res = new String(responseBody, "UTF-8");//res = postMethod.getResponseBodyAsString();System.out.println(res);}} catch (IOException e) {e.printStackTrace();}return res;}
}

3.第三方api接口

@RestController
@RequestMapping("/api")
public class HelloWorld {private static final Logger log= LoggerFactory.getLogger(HelloWorld.class);@GetMapping ("/getHello")public Result getHelloWord(){log.info("进入到api接口.......");return Result.success("hello world api get 接口数据");}@PostMapping("/postHello")public Result postHelloWord(@RequestBody User user){log.info("进入post 方法.....");System.out.println(user.toString());return Result.success("hello world api post接口数据");}}

4.测试类

 	@Testpublic void testApi() {//测试get方法String s = HttpClientUtil.doGet("http://localhost:9092/api/getHello", "UTF-8");System.out.println("get方法:"+s);//测试post方法User user = new User();user.setUname("胡萝卜");user.setRole("普通用户");JSONObject jsonObject = new JSONObject();String s1 = JsonUtil.toJson(user);jsonObject.put("param",s1);String postString = HttpClientUtil.doPost("http://localhost:9092/api/postHello", jsonObject);System.out.println("post方法:"+postString);}

结果:
在这里插入图片描述

三、通过Spring的RestTemplate

1.引入依赖

导入springboot的web包

    <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>

2.RestTemplate配置类

/*** @author hsq*/
@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate(ClientHttpRequestFactory factory){return new RestTemplate(factory);}@Beanpublic ClientHttpRequestFactory simpleClientHttpRequestFactory(){SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();factory.setConnectTimeout(15000);factory.setReadTimeout(5000);return factory;}
}

3.RestTemplate实现类

/*** @author hsq*/
@Component
public class RestTemplateToInterface {@Autowiredprivate RestTemplate restTemplate;/*** 以get方式请求第三方http接口 getForEntity* @param url* @return*/public Result doGetWith1(String url){ResponseEntity<Result> responseEntity = restTemplate.getForEntity(url, Result.class);Result result = responseEntity.getBody();return result;}/*** 以get方式请求第三方http接口 getForObject* 返回值返回的是响应体,省去了我们再去getBody()* @param url* @return*/public Result doGetWith2(String url){Result result  = restTemplate.getForObject(url, Result.class);return result;}/*** 以post方式请求第三方http接口 postForEntity* @param url* @param user* @return*/public String doPostWith1(String url,User user){ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, user, String.class);String body = responseEntity.getBody();return body;}/*** 以post方式请求第三方http接口 postForEntity* 返回值返回的是响应体,省去了我们再去getBody()* @param url* @param user* @return*/public String doPostWith2(String url,User user){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;}}

4.第三方api接口

/*** @author hsq*/
@RestController
@RequestMapping("/api")
public class HelloWorld {private static final Logger log= LoggerFactory.getLogger(HelloWorld.class);@GetMapping ("/getHello")public Result getHelloWord(){log.info("进入到api接口.......");return Result.success("hello world api get 接口数据");}@PostMapping("/postHello")public Result postHelloWord(@RequestBody User user){log.info("进入post 方法.....");System.out.println(user.toString());return Result.success("hello world api post接口数据");}
}

在这里插入图片描述

5.测试类

//注入使用
@Autowired
private RestTemplateToInterface restTemplateToInterface;@Test
public void testSpringBootApi(){Result result= restTemplateToInterface.doGetWith1("http://localhost:9092/api/getHello");System.out.println("get结果:"+result);User user = new User();user.setUname("胡萝卜");user.setRole("普通用户");String s = restTemplateToInterface.doPostWith1("http://localhost:9092/api/postHello", user);System.out.println("post结果:"+s);
}

结果:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/om8I4ggp.shtml

相关文章

Java调用第三方接口示范

人工智能&#xff0c;零基础入门&#xff01;http://www.captainbed.net/inner 在项目开发中经常会遇到调用第三方接口的情况&#xff0c;比如说调用第三方的天气预报接口。 使用流程 【1】准备工作&#xff1a;在项目的工具包下导入HttpClientUtil这个工具类&#xff0c;或者…

调用第三方接口

快速使用&#xff1a;调用第三方接口获取数据&#xff08;简易版&#xff09;_myme95的博客-CSDN博客_调用第三方接口 controller层 private String jokeApiKey "40ff81dexxxxxxxxxxxx97a39d39";AutowiredApiService apiService;/*** 京东万象-笑话api*/GetMapping(…

国内7款API供应平台功能对比及详细介绍

我们都知道一句话“巧妇难为无米之炊”&#xff0c;数据源就是数据产生价值中的那些大米。那大数据时代企业需要哪些数据呢&#xff1f;根据我个人理解我觉得可以大致分为以下几类&#xff1a; 1、&#xff08;内部&#xff09;企业自身业务生产经营环节产生的内部数据【包括销…

Java Web系统常用的第三方接口

1. Web Service 接口 1.1 接口方式说明和优点 在笔者的开发生涯中&#xff0c;当作为接口提供商给第三方提供接口时&#xff0c;以及作为客户端去调用第三方提供的接口时&#xff0c;大部分时候都是使用 Web Service接口&#xff0c; Web Service作为接口使用广泛的…

进制转换2

进制之间的转换 本文转自&#xff1a;http://www.bloghome.cn/posts/38472 数学 /bullly 发表于2006-07-11, 18:08 不同进制之间的转换纯粹是数学上的计算。不过&#xff0c;你不必担心会有么复杂&#xff0c;无非是乘或除的计算。 生活中其实很多地方的计数方法都多少有点不…

计算机二进制

二进制转十进制 不考虑符号为 十进制转二进制 奇数要算一次 1 / 2 偶数不需要 计算 1 / 2 奇数要算一次 1 / 2 偶数不需要 计算 1 / 2 奇数要算一次 1 / 2 偶数不需要 计算 1 / 2 奇数要算一次 1 / 2 偶数不需要 计算 1 / 2 奇数要算一次 1 / 2 偶数不需要 计算 1 / 2 奇数…

-2进制

http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id4435 懵~ 后来问别人&#xff0c;他让我试着用二进制反推十进制&#xff0c;就晓得了(用&#xff08;-2&#xff09;^n&#xff09;。 这个是学长写的代码 //我写的时候&#xff0c;将它先变成二进制&#xff0c;再给每…

进制.2

转自&#xff1a; http://www.d2school.com/bhcpp_book/5_8.php 5.8.1 十六进制 说到十六进制&#xff0c;首先会问&#xff1a;总共只有10个阿拉伯数字&#xff1a;0、1、2、3、4、5、6、7、8、9&#xff0c;如何表达“逢16进1”的概念呢&#xff1f;方法是用英文字母&#x…

二进制及二进制转换

二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2&#xff0c;进位规则是“逢二进一”&#xff0c;借位规则是“借一当二” 二进制数&#xff08;binaries&#xff09;是逢2进位的进位制&#xff0c;0、1是基本算符 [2] &#xff1…

二进制?十进制!

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 给定两个十进制整数 : AAA,BBB 你需要把它们的二进制形式以十进制的运算法则相加输出结果。 例如&#xff1a; A3,B2A 3 , B 2A3,B2 的时候&#xff0c;AAA 的二进制表示是 : 111111 , BB…

关于二进制???

文章目录 二进制二进制转化为十进制十进制转化成二进制无符号数和有符号数原码反码补码 二进制的计算规则 二进制 二进制转化为十进制 二进制是一套计数方法&#xff0c;每个数位有0、1两种可能&#xff0c;类比在日常生活中我们使用的十进制&#xff0c;每个数位有0-9十种可…

二进制及二进制的转换

二进制&#xff08;binary&#xff09;是在数学和数字电路中指以2为基数的记数系统&#xff0c;是以2为基数代表系统的二进位制。这一系统中&#xff0c;通常用两个不同的符号0&#xff08;代表零&#xff09;和1&#xff08;代表一&#xff09;来表示 [1] 。数字电子电路中&a…

二进制转换

1、十进制数45转换为二进制 &#xff08;1&#xff09;除二取余法 除数被除数余数24512220211125122021120 自下往上&#xff1a;101101 &#xff08;2&#xff09;2的幂做加法 45 32 841 对应的是101101 2、二进制转负整数 以11010011为例子 先减1 11010010 按…

什么是二进制,进制之间是如何转换的,浅显易懂的,一看就会

什么是二进制呢? 二进制数据是用0和1两个数码来表示的数,它的基数为2,进位规则是逢二进一 加法:000;101;011;110(等价于10,向前进一) 案例(前面用0补齐) 1110,10111,111100,1001101,1011110,1101111,11111000 ... 减法: 0&#xff0d;00&#xff0c;1&#xff0d;01&#xf…

二进制详解

在计算机的世界里&#xff0c;只有0和1&#xff0c;也就是二进制。 那如何把一个十进制的数转成二进制或者其他进制&#xff0c;请下图&#xff1a; 十进制转二进制 十进制的123转成二进制就是1111011&#xff0c;转成几进制都是一个道理。 一、二进制 1.1 二进制是计算机采…

几何平均数

几何平均数是n个变量值连乘积的n次方根。 [2] 分为简单几何平均数与加权几何平均数。 1、简单几何平均数&#xff1a; 几何平均数示意图 2、加权几何平均数&#xff1a; 转载于:https://www.cnblogs.com/kakaisgood/p/9981420.html

算术平均、几何平均、调和平均、平方平均和移动平均

本文内容 算术平均几何平均调和平均平方平均移动平均 算术平均、几何平均、调和平均、平方平均和移动平均跟计算编程有什么关系&#xff1a;Just One Word&#xff0c;不能只会算术平均数&#xff0c;还有其他很多选择&#xff0c;以及不同场景使用不同的平均数。 算术平均 算…

加权平均数的例子_加权平均值和算术平均值的区别与公式

某些数值占较高比重的平均值&#xff0c;平均值&#xff0c;在计算一个简单的平均值时&#xff0c;每个数值的比重都是相同的&#xff0c;这是 1、2、3 和 4 的平均值&#xff1a; 把数值相加&#xff0c;然后除以个数&#xff1a; 平均值 1 2 3 4 10 2.5 4 4 权数我们可…

加权平均

在日常生活中&#xff0c;我们经常提到“ 平均数”。一般我们在求“ 平均数”时&#xff0c;通常是用“ 一组数据中所有数据之和再除以数据的个数”。但是&#xff0c;这种叫法是不准确的。 一般来说&#xff0c;“平均数”大致可以分为7类。即&#xff1a;“算数平均数”&a…

加权平均的重要作用

目录 ​编辑 加权平均概述&#xff1a; 加权平均值概述&#xff1a; 加权平均值数学概念&#xff1a; 权重&#xff1a; 应用&#xff1a; 加权平均概述&#xff1a; 加权平均&#xff0c;统计学术语&#xff0c;是利用过去若干个按照时间顺序排列起来的同一变量的观测值…