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

这篇具有很好参考价值的文章主要介绍了java远程调用接口、URL的方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一: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(){
        //远程调用接口的url
        String loginUrl = "http://localhost:8989/login/doLogin";
        OutputStream outputStream = null;
        InputStream inputStream = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        try {
            //获取压测接口的userTicket
            URL url = new URL(loginUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            //登录是post请求
            connection.setRequestMethod("POST");
            //post请求需要设置接口返回的数据,所以设置为true
            connection.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 {

    @Bean
    public RestTemplate restTemplate(){
        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
        //解决401报错时,报java.net.HttpRetryException: cannot retry due to server authentication, in streaming mode
        requestFactory.setOutputStreaming(false);
        RestTemplate restTemplate = new RestTemplate(requestFactory);
        restTemplate.setErrorHandler(new RtErrorHandler());
        return restTemplate;
    }
    
    @Bean
    public 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对象,该对象包装了服务器的响应内容。文章来源地址https://www.toymoban.com/news/detail-469024.html

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");
        //必须设置下面这个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) {
        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));
    }
}

到了这里,关于java远程调用接口、URL的方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java 远程调用 httpclient 调用https接口 忽略SSL认证

    httpclient 调用https接口,为了避免需要证书,所以用一个类继承DefaultHttpClient类,忽略校验过程。下面是忽略校验过程的代码类:SSLClient  然后再调用的远程get、post请求中使用SSLClient 创建Httpclient ,代码如下:

    2024年02月11日
    浏览(42)
  • Java实现HTTP请求的几种方式-HttpURLConnection(一)

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

    2024年02月16日
    浏览(45)
  • 小程序中Java后台调用接口(getAccessToken)获取调用凭据,调用接口(msgSecCheck)检测文本内容是否安全--最终版

    序言:书接上一篇文章:小程序前端调用接口(getAccessToken)获取调用凭据,调用接口(msgSecCheck)检测文本内容是否安全–最终版 原因: 在前端测试时,使用小程序工具的 真机调试 ,是可以跑通的,但你用小程序工具的 预览模式 就会没有响应。原因就在于访问 wx.request

    2024年04月26日
    浏览(46)
  • Java调用第三方http接口的常用方式

    前言 一、通过JDK网络类Java.net.HttpURLConnection 二、通过apache common封装好的HttpClient 三、通过Spring的RestTemplate 总结 今天项目需要接口互相调用,就看了一下这几个调用的方式 通过java.net包下的原生java.api提供的http请求 使用步骤: 通过统一的资源定位器(java.net.URL)获取连接器(java.

    2024年02月08日
    浏览(70)
  • java获取本地文件和远程文件的方式

    问题背景:我们项目开发的时候,经常会读取文件,如果文件在本服务器,则直接用new File() 读取即可,但是有时候需要远程读取文件,比如读取分布式存储服务器的内容或者是别人家的图片资源,这个时候new File就无法满足要求了。 下面提供列出获取远程文件和本地文件的

    2024年02月13日
    浏览(32)
  • JAVA JNA 调用C接口的三种方式

    test.c libtest.so 可以看到有test方法 建个普通maven项目 测试 使用Linux上的Java运行 mkdir -p /root/jna cd /root/jna 新建MyNative.java 编译并生成头文件(这里java17没找到javah命令,改用java8的,但注意javac ,javah要使用同一个Java版本的) linux直接编辑实现头文件中的接口: 编译时注意引入j

    2024年02月11日
    浏览(41)
  • Java 客户端调用 WebService 接口的一种方式

      通过SoapUI创建一个SOAP Project;   项目名称自定义,WSDL地址维护WebService接口地址。点击OK即可   项目创建完成后,展开WebService项,可以看到具体的接口,打开接口下的Request,右侧面板Form标签下可以清晰的看到请求入参,点击Submit请求按钮可以看到Overview标签下的响应结

    2024年01月18日
    浏览(50)
  • JAVA调用第三方接口的GET/POST/PUT请求方式

    GET请求 POST请求 POST请求(JSON传参) PUT请求(传TOKEN)

    2024年02月03日
    浏览(63)
  • spring boot java项目整合Scala&Spark,接口api调用方式调用scala代码,配置分享

    版本说明: spring boot: 2.5.9 jdk:1.8 spark:2.4.5 sclala:2.11.12 首先你需要有一个完美的spring boot项目(java版本)能成功运行,这就不赘述了,按照网上的自己搭建吧,然后重要的来了,我捣鼓了两天时间,各样的报错见过了,网上的处理方法要嘛是不全,要嘛是没有用,各种办

    2024年02月10日
    浏览(52)
  • Feign远程调用如何携带form url

     这是一个需要携带参数在form url上的请求,正常调用方式是这样的 响应:     在Feign中,应该怎么调用呢?? 定义OpenFeignClient接口 然后构建 LinkedMultiValueMap即可调用访问 调用成功 

    2024年02月16日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包