Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Proxy 向自身发出HTTP请求:重用端点_Proxy_Jersey_Jax Rs - Fatal编程技术网

Proxy 向自身发出HTTP请求:重用端点

Proxy 向自身发出HTTP请求:重用端点,proxy,jersey,jax-rs,Proxy,Jersey,Jax Rs,我在泽西岛有两个API,其中一个可能使用另一个 class PersonAPI{ @PATH("/person") @GET // support query param filter such as ?first_name=John&birthday=1988-09-12 public Person getPerson(){ return PersonService.getPerson(...); } } // some ot

我在泽西岛有两个API,其中一个可能使用另一个

class PersonAPI{
    @PATH("/person")
    @GET
    // support query param filter such as ?first_name=John&birthday=1988-09-12
    public Person getPerson(){
        return PersonService.getPerson(...);
    }
}


// some other class
class PetAPI{
    @PATH("/pet")
    @GET
    // support query param such as ?owner.first_name=John&owner.birthday=1988-09-12
    public Pet getPet(){
        //filter person based on "owner." params 

    }
}
PetAPI
中实现过滤person的一种方法是访问
PersonService
,但我宁愿
PetAPI
通过HTTP请求使用
PersonAPI
,就好像
PersonAPI
是另一种资源一样。这是因为
PetAPI
将来可能会被重构到另一个容器中,并且不会与
PersonAPI
位于同一个应用程序中

在泽西岛有没有这样的方法来调用PersonAPI,即使现在
PersonAPI
PetAPI
在同一个应用程序中

WebTarget target = client.target(baseURL + "/person");
target.queryParam( .... );
target.request().get().readEntity(Person.class);

编辑:我想更重要的问题是:当处理一种资源需要使用另一种资源时,这是一种好方法吗?

您描述的情况非常常见,并且在任何方面都不特定于Jersey

毫无疑问,您不希望在同一容器中的API之间进行web服务调用。这就是效率低下。当API位于同一个容器中时,您确实需要一个高效的解决方案,并且当API位于不同的容器中时,该解决方案易于重构

与面向服务的项目配合良好的模式是为服务定义一个接口,然后对该接口有两种不同的实现。第一个实现是您已经拥有的实现,它包含实际的业务逻辑。当业务逻辑实际在另一个容器中实现时,使用第二个实现。具体来说,您的接口可能被称为
PersonService
,它由
PersonServiceImpl
PersonRemoteServiceImpl
(或您喜欢的任何命名约定)实现

PersonServiceImpl.getPerson()
查询数据库(或以何种方式获取person)

PersonRemoteServiceImpl.getPerson()
对另一个容器进行HTTP调用以获取此人

现在,由于
PetApi
PersonApi
位于同一个容器中,您甚至不需要实现
PersonRemoteServiceImpl
(但是)-将重构保存到需要时。但是,当您进行重构时,您只需创建服务的“远程”实现,并替换您在
PetApi
中使用的具体服务实现。事实上,在需要第二个实现之前,您可以推迟为服务创建单独的接口

如果您想使这种方法更容易一些,您可能不希望将服务方法实现为静态的(如示例代码所示)。问题是您必须提到实际的类,而不是能够将其切换到接口。像这样的编码模式是我建议的:

public interface PersonService {
    Person getPerson();
}

public class PersonServiceImpl implements PersonService {
    public Person getPerson() { return new Person(); }
}

public class PersonApi {
    @PATH("/person")
    @GET
    public Person getPerson(){
        return getPersonService().getPerson(...);
    }

    public PersonService getPersonService() {
        // Return the appropriate implementation.
        if (personService == null) {
            personService = new PersonServiceImpl();
        }
        return personService
    }
    private PersonService personService;
}
服务实现实例的示例管理很简单,最好实现某种“服务管理器”,在该服务的所有使用者之间共享一个实例,或者实现IOC(控制反转)以注入所需服务实现的Spring之类的框架


如上所述,(除非您使用其中一个框架),您可以推迟将接口与实现分离,直到您真正需要它为止。如果您提前计划,那么在您实际需要时,重构很容易本地化。

您尝试过吗?webclient不应该关心它的调用。是的,我想现在的问题是Jersey是否优化了这些请求,因为它们在同一个应用程序中?不,Jersey不会优化。谢谢,这是非常彻底的,更触及了问题的核心,我在问题中没有澄清。