java远程调用接口、URL的方式

news/2025/1/23 3:48:02/

一:httpUrlConnection

1.获取HttpURLConnection连接对象

   /*** 获取HttpURLConnection连接对象* @param url 远程调用的url* @return*/public static HttpURLConnection getHttpURLConnection(String url){try {//建立连接URL httpUrl = new URL(url);HttpURLConnection urlConnection =(HttpURLConnection)httpUrl.openConnection();//向文件所在服务器发送标识信息,模拟浏览器urlConnection.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36");return urlConnection;} catch (IOException e) {e.printStackTrace();return null;}}

2.远程调用代码

/*** 远程调用登录接口*/public void accessLoginUrl(){//远程调用接口的urlString loginUrl = "http://localhost:8989/login/doLogin";OutputStream outputStream = null;InputStream inputStream = null;ByteArrayOutputStream byteArrayOutputStream = null;try {//获取压测接口的userTicketURL url = new URL(loginUrl);HttpURLConnection connection = (HttpURLConnection) url.openConnection();//登录是post请求connection.setRequestMethod("POST");//post请求需要设置接口返回的数据,所以设置为trueconnection.setDoOutput(true);//参数userId和密码String param = "mobile=" + 13100000000000L + "&password=" + "123456";//获取登录接口返回的流文件outputStream = connection.getOutputStream();outputStream.write(param.getBytes(StandardCharsets.UTF_8));outputStream.flush();inputStream = connection.getInputStream();byteArrayOutputStream = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = inputStream.read(buffer)) >= 0){byteArrayOutputStream.write(buffer, 0, len);}//获取响应结果String response = byteArrayOutputStream.toString();ObjectMapper objectMapper = new ObjectMapper();RespBean respBean = objectMapper.readValue(response, RespBean.class);String userTicket = (String) respBean.getObject();System.out.println("远程调用接口的返回值"+userTicket);//userTicket就是远程接口返回的值} catch (IOException e) {e.printStackTrace();} finally {if(byteArrayOutputStream != null){try {byteArrayOutputStream.close();} catch (IOException e) {e.printStackTrace();}}if(outputStream != null){try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}}}

二:RestTemplate

2.1 什么是RestTemplate

  • 1.spring 框架提供的 RestTemplate 类可用于在应用中调用 rest 服务,它简化了与 http 服务的通信方式,统一了 RESTful 的标准,封装了 http 链接, 我们只需要传入 url 及返回值类型即可。相较于之前常用的 HttpClient,RestTemplate 是一种更优雅的调用 RESTful 服务的方式。

  • 2.在 Spring 应用程序中访问第三方 REST 服务与使用 Spring RestTemplate 类有关。RestTemplate 类的设计原则与许多其他 Spring 模板类(例如 JdbcTemplate、JmsTemplate)相同,为执行复杂任务提供了一种具有默认行为的简化方法。

  • 3.RestTemplate 默认依赖 JDK 提供 http 连接的能力(HttpURLConnection),如果有需要的话也可以通过 setRequestFactory 方法替换为例如 Apache HttpComponents、Netty 或 OkHttp 等其它 HTTP library。

  • 4.考虑到 RestTemplate 类是为调用 REST 服务而设计的,因此它的主要方法与 REST 的基础紧密相连就不足为奇了,后者是 HTTP 协议的方法:HEAD、GET、POST、PUT、DELETE 和 OPTIONS。例如,RestTemplate 类具有 headForHeaders()、getForObject()、postForObject()、put()和 delete()等方法。

2.2 配置RestTemplate

@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate(){SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();//解决401报错时,报java.net.HttpRetryException: cannot retry due to server authentication, in streaming moderequestFactory.setOutputStreaming(false);RestTemplate restTemplate = new RestTemplate(requestFactory);restTemplate.setErrorHandler(new RtErrorHandler());return restTemplate;}@Beanpublic ClientHttpRequestFactory simpleClientHttpRequestFactory() {SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();factory.setReadTimeout(5000);factory.setConnectTimeout(15000);return factory;}

2.2 RestTemplate 添加请求头headers和请求体body

        HttpHeaders header = new HttpHeaders();header.add("X-Consumer-Third-User-Id", "X-Consumer-Third-User-Id");header.add("X-Consumer-Third-User-Name", "X-Consumer-Third-User-Name");header.set("Authorization", "authorization");HttpEntity<AssetProcessVo> httpEntity = new HttpEntity<>(assetProcessVo, header);
  • header 为需要设置的请求头
  • AssetProcessVo为需要远程调用接口传递的参数

2.3 示例代码

/*** 远程调用登录接口*/public void accessLoginUrl(){HttpHeaders header = new HttpHeaders();header.add("X-Consumer-Third-User-Id", "X-Consumer-Third-User-Id");header.add("X-Consumer-Third-User-Name", "X-Consumer-Third-User-Name");header.set("Authorization", "authorization");HttpEntity<AssetProcessVo> httpEntity = new HttpEntity<>(assetProcessVo, header);ResponseEntity<ByteArrayOutputStream> exchange;try {//保存案件名称后,启动工作流exchange = restTemplate.exchange(url, HttpMethod.POST, httpEntity, ByteArrayOutputStream.class);if (exchange.getStatusCodeValue() == 200) {String response = byteArrayOutputStream.toString();ObjectMapper objectMapper = new ObjectMapper();RespBean respBean = objectMapper.readValue(response, RespBean.class);}} catch (RestClientException e) {e.printStackTrace();}

三:HttpClient

3.1 导入依赖

	<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.3</version></dependency>

3.2 使用方法

1,创建HttpClient对象;
2,指定请求URL,并创建请求对象,如果是get请求则创建HttpGet对象,post则创建HttpPost对象;
3,如果请求带有参数,对于get请求可直接在URL中加上参数请求,或者使用setParam(HetpParams params)方法设置参数,对于HttpPost请求,可使用setParam(HetpParams params)方法或者调用setEntity(HttpEntity entity)方法设置参数;
4,调用httpClient的execute(HttpUriRequest request)执行请求,返回结果是一个response对象;
5,通过response的getHeaders(String name)或getAllHeaders()可获得请求头部信息,getEntity()方法获取HttpEntity对象,该对象包装了服务器的响应内容。

3.3 代码实现

package com.cnzz.demo.remote.rpc;import com.alibaba.fastjson.JSONObject;
import org.apache.commons.httpclient.*;
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;/*** ************************************************************* Copyright © 2020 cnzz Inc.All rights reserved.  *    *** ************************************************************** @program: demo* @description:* @author: cnzz* @create: 2020-12-23 17:41**/public class HttpClientUtil {/*** 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=GBK");//必须设置下面这个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("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) {System.out.println(doGet("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=telPhone", "GBK"));System.out.println("-----------分割线------------");System.out.println("-----------分割线------------");System.out.println("-----------分割线------------");JSONObject jsonObject = new JSONObject();jsonObject.put("commentId", "telPhone");System.out.println(doPost("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071", jsonObject));}
}

http://www.ppmy.cn/news/175495.html

相关文章

MySQL 5.7 修改账号密码

MySQL 5.7 修改账号密码 1、概述2、更改密码2.1、寻找命令2.2、补充 3、总结 1、概述 大家好&#xff0c;我是欧阳方超。 MySQL数据库安装后设置的密码太简单了&#xff0c; 近期安全检查&#xff0c;这种弱密码全部得修改&#xff0c;好吧那就开始改吧 2、更改密码 2.1、寻…

台式计算机规格型号怎么查,台式电脑主板型号在哪里看

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。 查看台式电脑主板型号的方法&#xff1a; 1、打开桌面左下角的“开始菜单”&#xff0c;在搜索功能中输入“DxDiag”然后点击运行。 2、接下来就会出现“DirectX诊断工具”&#xf…

dell台式计算机主板电池,台式机主板电池怎么拆

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。 以戴尔台式机为例&#xff0c;台式机主板电池的拆法&#xff1a; 1、关闭电源&#xff0c;将所有插在机箱上面的电线与相关设备移除。 2、用十字的螺丝刀启开电脑机箱&#xff0c;将…

hp 服务器主板如何查看型号,hp台式电脑主板型号怎么查看

惠普ProDesk400G1SFFJ4J37PA惠普ProDesk400G1SFFJ4J37PA类型&#xff1a;商用台式机&#xff1b;操作系统&#xff1a;Linux&#xff1b;处理器&#xff1a;IntelCeleronG18402.8GHz/L32M&#xff1b;内存大小&#xff1a;2GB&#xff1b;硬盘容量&#xff1a;500GB&#xff1b…

windows环境使用clion搭建redis5.0 redis6.0的源码阅读环境

1、下载cygwin https://cygwin.com/install.html 第一步选择从互联网安装 别放在C盘 选择直接连接 我这边选择的是163的节点 接下来&#xff0c;就是让我们选择要安装的东西&#xff0c;网上一般给的就是如下几个&#xff1a; gcc-core、gcc-g、make、gdb、binutils 一个个…

台式机计算机在哪里看,IT教程:台式电脑主板型号在哪里看

科技就如同电灯发出的光一样&#xff0c;点亮我们的世界&#xff0c;点亮我们的生活&#xff0c;这一段时间以来台式电脑主板型号在哪里看的消息络绎不绝是什么原因呢?接下来就让我们一起了解一下吧。 大家好&#xff0c;我是智能客服时间君&#xff0c;上述问题将由我为大家进…

台式计算机M丅BF是什么,台式机主板的 BIOS ID 代码

如果您有一台零售的英特尔台式机主板&#xff0c;您的电脑上的 BIOS ID 代码就可以确认。请按照以下步骤查找 BIOS ID 代码&#xff1a;在启动过程中&#xff0c;按F2进入 BIOS 设置。 在主菜单上&#xff0c;记下 BIOS 版本(该菜单上的第一个项目)。 按F10退出 BIOS 设置程序。…

台式电脑主板插线步骤图_电脑主板跳线插法 装机接线详细图解教程

组装一台电脑,主板上的跳线接线是最让小白装机用户头疼的事情,接错了轻则启动不了,重则烧毁硬件,但其实具体跳线插法,在机箱连接的跳线接口上以及主板跳线插座上都有详细标注,我们只需要在主板上找到对应插座,插上去就好了。那么机箱上的跳线接在主板那些位置?下面电脑…