RestEasy 调用Rest接口使用详解[通俗易懂]

RestEasy 调用Rest接口使用详解[通俗易懂]RestEasy 调用Rest接口使用详解

大家好,又见面了,我是你们的朋友全栈君。

        最近项目中需要调用其他项目的Rest接口,之前一直在使用Apache的httpclient工具,该工具使用起来不是很方便,各种try{……} catch{……}结构,造成了代码量很大,而且有实际意义的代码却很少。

       最近请教别人,学习使用RESTEasy工具,进行调用REST接口,极大地减少了调用Rest接口的代码,项目中仅需要一个RestEasyClient.java工具类即可,其他package中是需要调用REST接口时,仅需要直接调用即可,代码中仅有一个try{……} catch{……},很好的维护了项目代码的整洁和实用。

1.实战

RESTEasy的Maven依赖:

 <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>jaxrs-api</artifactId>
            <version>3.0.7.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jaxrs</artifactId>
            <version>3.0.19.Final</version>
            <!--<scope>provided</scope>-->
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-client</artifactId>
            <version>3.0.19.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-multipart-provider</artifactId>
            <version>3.0.19.Final</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jackson2-provider</artifactId>
            <version>3.0.19.Final</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-servlet-initializer</artifactId>
            <version>3.0.19.Final</version>
        </dependency>

RestEasyClient.java工具类: 

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.jboss.resteasy.client.jaxrs.ResteasyClient;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;

import javax.ws.rs.client.Entity;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.core.Response;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * Created by lance.
 */
@Slf4j
public class RestEasyClient {

  private static ResteasyClient client = null;

  static {
    ResteasyClientBuilder resteasyClientBuilder = new ResteasyClientBuilder();
    resteasyClientBuilder.connectionPoolSize(300);
    resteasyClientBuilder.socketTimeout(5, TimeUnit.SECONDS);
    resteasyClientBuilder.maxPooledPerRoute(200);
    client = resteasyClientBuilder.build();
  }


  /**
   * @param url url地址参数
   * @return
   */

  public static JSONObject get(String url, Map<String, Object> headers) {
    Response response = null;
    try {
      ResteasyWebTarget target = client.target(url);
      Invocation.Builder builder = target.request();
      if (null != headers && !headers.isEmpty()) {
        headers.entrySet().forEach(entry -> builder.header(entry.getKey(), entry.getValue()));
      }
      response = builder.get();
      if (response != null) {
        JSONObject jsonObject = response.readEntity(JSONObject.class);
        log.info("http get result:{}", JSON.toJSONString(jsonObject));
        return jsonObject;
      }

    } catch (Exception e) {
      log.error("client.get() Error, url:{}", url);
      log.error("client.get() Error", e);
    } finally {
      if (response != null) {
        try {
          response.close();
        } catch (Exception e) {
          log.error("client.close() Error", e);
        }
      }
    }

    return new JSONObject();
  }


  /**
   * @param url       url地址参数
   * @param headers   请求中的header参数
   * @param entity    请求的具体参数内容
   * @param mediaType 之情请求的类型,如json
   * @return
   */


  public static JSONObject post(String url, Map<String, Object> headers, Object entity, String mediaType) {

    log.info("client.post() INFO, url:{}, headers:{}, entity:{}, mediaType:{}", url, headers, entity, mediaType);
    Response response = null;
    try {
      ResteasyWebTarget target = client.target(url);
      Invocation.Builder builder = target.request();
      if (null != headers && !headers.isEmpty()) {
        headers.entrySet().forEach(entry -> builder.header(entry.getKey(), entry.getValue()));
      }
      response = builder.post(Entity.entity(entity, mediaType));

      if (response != null) {
        JSONObject jsonObject = response.readEntity(JSONObject.class);
        log.info("http get result:{}", JSON.toJSONString(jsonObject));
        return jsonObject;
      }
    } catch (Exception e) {
      log.error("client.post() Error, url:{}, headers:{}, entity:{}, mediaType:{}", url, headers, entity, mediaType);
      log.error("client.post() Error", e);
    } finally {
      if (response != null) {
        try {
          response.close();
        } catch (Exception e) {
          log.error("client.close() Error", e);
        }
      }
    }

    return new JSONObject();

  }

   Test类:

public class Test {


    public static void main(String[] args) {
	
	//get test
	 Map map = RestEasyClient.get("http://10.118.32.254:8801/data/rest/");
         log.info("response:{}",map);
	 
	 
	 
	 
	//post test
	Map<String, Object> header = Maps.newHashMap(); 
        header.put("userId", "1000");
        Object item = new Object(); 
		
        Map map = RestEasyClient.post("http://10.118.32.254:8801/data/rest/", header, Sets.newHashSet(item), MediaType.APPLICATION_JSON);


        log.info("response:{}", map);
	
	}
	
}






版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149577.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 关于新人的培养与程序的测试

    关于新人的培养与程序的测试

    2021年7月26日
    51
  • cygwin安装组件教程_cygwin常用命令

    cygwin安装组件教程_cygwin常用命令1.安装make下载make包https://gnu-make.soft32.com/free-download/将make解压放到E:\cygwin64\home\Administrator2.在cygwin中进入/home/Administrator/make-3.81路径依次执行以下命令:./configure./build.sh在make-3.81下就会生成make.exe文件3.将make.exe移到shell命令根目录mvmake.exe/

    2022年10月10日
    1
  • ASP.NET_动态网页怎么连接数据库

    ASP.NET_动态网页怎么连接数据库近期本人在关注实体设计的过程中一直在了解“ADO.NETEntityFramework数据模型”,从中结识了.NETFramework4中的ASP.NET动态数据,ASP.NET动态数据允许您通过在运行时从数据库架构推断数据实体的外观和行为并从中派生UI行为,创建可扩展的、数据驱动的Web应用程序。         动态数据的一个重要功能是基架机制

    2025年6月14日
    1
  • 少儿编程是学什么的(小学编程是学些什么东西)

    前言  我是一位从业十年的程序员,也是一位程序员爸爸。十年来,一直coding,从未停歇。既做过传统行业的软件,也做过移动互联网产品,甚至还曾在年少时,闯荡过幼教产品的创业大潮。作为程序员爸爸(或许应该叫工程师爸爸,换个称呼可以让孩子更崇拜),我时常在想我家的小朋友是否应该学习或者接触一下编程?那么说到编程,就必然需要先理解一下编程是什么?少儿编程又是什么?对于前者,我期望从实践者的视角作出我的…

    2022年4月15日
    75
  • uwsgi使用_qemu virtual cpu

    uwsgi使用_qemu virtual cpu导论wsgi全称webservergatewayinterface,wsgi不是服务器,也不是python模块,只是一种协议,描述webserver如何和webapplication通信的规则。运行在wsgi上的web框架有bottle,flask,djangouwsgi和wsgi一样是通信协议,是uWSGI服务器的单独协议,用于定义传输信息的类型,是一个web服务器,实现了W…

    2022年9月12日
    0
  • JRTPLIB_刘伯温传简介

    JRTPLIB_刘伯温传简介jrtplib是一个基于C++、面向对象的RTP封装库,最新的版本是3.9.1(2011年11月)。为了与RFC3550相兼容,3.x.x版本经过完全重写,现在它提供了一些非常有用的组件,这些组件为构建各种各样的RTP应用程序开发提供了有用的帮助。较旧的2.x版本依然可用,但是不兼容RFC3550。1.特性    jrtplib支持定义于RFC3550中的RTP协议,它使得发送和接

    2022年7月28日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号