相关疑难解决方法(0)

如何版本REST URI

版本REST URI的最佳方法是什么?目前我们在URI本身有一个版本#,即.

http://example.com/users/v4/1234/
Run Code Online (Sandbox Code Playgroud)

对于此表示的第4版.

该版本是否属于queryString?即.

http://example.com/users/1234?version=4
Run Code Online (Sandbox Code Playgroud)

或者版本控制最好的另一种方式?

versioning rest clean-urls

106
推荐指数
6
解决办法
6万
查看次数

REST api版本控制(仅表示表示,而不是资源本身)

我看了一下API版本的最佳实践?,但我不太相信答案,所以我再次用更具体的例子质疑版本控制部分.我有两个URI(一个版本作为URI的一部分,一个没有):

http://xxxx/v1/user/123    -> favored solution in discussed thread
http://xxxx/user/123             
Run Code Online (Sandbox Code Playgroud)

我怀疑第一个链接是否表达了REST的想法.我觉得很http://xxxx/v1/user/123困惑,因为它表明有一天会有更高的api版本http://xxxx/v2/user/123.但这在REST术语中没有意义,api版本本身是HTTP 1.0或1.1,它已经在HTTP请求中发送.这个以REST资源为中心的视图与其他api接口(如SOAP或Java接口)非常不同(其中通常有限定名称的api版本).

在REST中,版本控制唯一有意义的是该资源的表示(例如,添加或删除新字段).此版本控制属于内容协商的部分,如:

http://xxx/user/123 + HTTP 'Accept' Header -> Content negotation through header
http://xxx/user/123?v=1                    -> for perma-links/hyperlinks
Run Code Online (Sandbox Code Playgroud)

人们还可以争辩说,这样的版本内容协商可能是路径中URI的一部分,但我觉得它反直觉,因为你最终可能会为同一资源使用不同的URI,并且必须在某些时候维护重定向.

总结:在REST URI中,没有api版本,只有资源表示的版本控制.表示版本信息属于内容协商(作为queryParam或HTTP'接受').

你怎么看?你不同意/同意哪些事情?

versioning rest api-design

51
推荐指数
3
解决办法
3万
查看次数

如何实现@RequestMapping自定义属性

作为一个例子,取子域映射.

本文:在Google App Engine上为同一应用程序管理多个域和子域 建议解析Filter上的子域并将变量分配给ServletRequest头.

然后映射将如下所示:

@RequestMapping(value = "/path", headers="subdomain=www")
 public String subsiteIndexPage(Model model,HttpServletRequest request) { ... }
Run Code Online (Sandbox Code Playgroud)

如果我们想创建自定义@RequestMapping属性,例如子域,例如.创建这样的映射:

@RequestMapping(value = "/some/action", subdomain = "www")
public String handlerFunction(){ ... }
Run Code Online (Sandbox Code Playgroud)

我们应该使用我们自己的实现覆盖@RequestMapping @interface定义并覆盖RequestMappingHandlerMapping受保护的方法
(如JIRA所述:" 允许自定义请求映射条件SPR-7812 ").

这样对吗?任何人都可以提供一个提示,如何实现这一功能?


想法1:
正如原始jira线程所建议的,是创建自己的实现RequestCondition

有一个项目在github上使用这个解决方案:https://github.com/rstoyanchev/spring-mvc-31-demo/

和相关的问题:在Spring mvc 3.1中添加自定义RequestCondition

也许像@Subdomain("www")Type和Method 这样的映射是可能的解决方案吗?


链接到forum.springsource.com上的相同问题

java spring servlets spring-mvc

19
推荐指数
1
解决办法
2万
查看次数

是否可以扩展WebMvcConfigurationSupport并使用WebMvcAutoConfiguration?

我需要扩展WebMvcConfigurationSupport类,修改两件事:

@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
    @Override
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping();
        handlerMapping.setRemoveSemicolonContent(false);
        handlerMapping.setOrder(1);
        return handlerMapping;
    }
}
Run Code Online (Sandbox Code Playgroud)

我喜欢从WebMvcAutoConfiguration类注册的默认值,但由于类上的条件注释,当我扩展WebMvcConfigurationSupport类时,它会阻止自动配置发生.

@Configuration
@ConditionalOnWebApplication
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class,
    WebMvcConfigurerAdapter.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@Order(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter(DispatcherServletAutoConfiguration.class)
public class WebMvcAutoConfiguration {...}
Run Code Online (Sandbox Code Playgroud)

是否要加载WebMvcAutoConfiguration类而不必在该类中复制/粘贴大部分代码?

或者是否可以从其他地方调用RequestMappingHandlerMapping setOrder()和setRemoveSemicolonContent(),这样我就可以使用@EnableWebMvc注释并运行自动配置类而没有任何问题?

提前致谢!

java spring spring-mvc spring-boot

12
推荐指数
3
解决办法
8967
查看次数

版本化RESTful服务?

我在http://example.com/v1/SomeResource上部署了RESTful Web服务.有一天,新的协议版本(不向后兼容)被部署到http://example.com/v2/SomeResource.从客户端看,此升级可能在两个HTTP请求之间的任何时间发生.

服务器如何向客户端指示它不再支持v1调用,并且客户端应该升级到v2?我可以使用适当的响应代码吗?

我想向客户提供以下信息:

  1. 发生了不兼容的升级.客户端无法使用新服务,因为协议可能完全不同.
  2. 新客户端软件的URL.
  3. 向用户解释他们必须升级的消息.

versioning rest

10
推荐指数
2
解决办法
1万
查看次数

实践中的REST Web服务版本控制

我正在创建一个新的Web服务,我已经阅读了一些来自APIgee的电子书,其中建议对Web服务进行版本控制.我知道在URL和标题之间保持版本信息之间存在一些"争执".根据我的阅读和理解,我想在标题中使用版本控制.

我的问题是; 这在实践中看起来如何?我正在使用Spring MVC 3.2.你是否只是在同一个控制器中创建这样的方法来响应不同的版本?

版本1:

@RequestMapping(method = RequestMethod.GET, produces = "application/vnd.example-v1+json")
Run Code Online (Sandbox Code Playgroud)

版本2:

@RequestMapping(method = RequestMethod.GET, produces = "application/vnd.example-v2+json")
Run Code Online (Sandbox Code Playgroud)

或者这是错的?或者更常见的是创建包含不同版本控制器的不同包?或者还有其他方法吗?

java rest spring spring-mvc java-ee

9
推荐指数
1
解决办法
8457
查看次数

如何配置Spring REST服务来处理多个版本?

几乎所有API都处理不同的发行版本.通常你会看到这种版本:

但是我没有找到一个描述如何在Spring堆栈中组织它们的源代码.我想在每个控制器上都有一个/v1前缀@RequestMapping("/v1/questions")不是最好的方法.

想象一下@Service,只有当前版本的一层(在我们的例子中是V2).

我们的服务应该处理V1和V2的请求.唯一的变化是V2在问题实体上添加了一个新字段(这意味着V1问题可以很容易地转换为V2问题).

现在的问题是:

  • 如何组织不同于~.web.* @Controllerjava包的观点?
  • 如何注释~.web.* @Controller他们知道他们的版本的不同?以这种方式RequestMapping?或者是否可以使用上下文配置它们:在V1 java包中进行组件扫描?
  • 如何组织转换器?把它们放在哪里,如何命名它们?水木清华.像QuestionsV1ToV2控制器?
  • 是否有DTO图层重新征集?因为我们的域必须同时处理许多版本?

一个例子看起来像这样(我在各处添加了包):

// on V1 Question look like this:
public class project.domain.Question
{
    private String question;
}

// on v2 Question looks like this:
public class project.domain.Question
{
    private String question;
    private Date creationDate;
}


@Service
public class project.service.QuestionService
{
    public long create(Question q) {...};
    public Question read(long id) {...};
    public void remove(long id) …
Run Code Online (Sandbox Code Playgroud)

java rest spring spring-ws spring-mvc

8
推荐指数
2
解决办法
3817
查看次数

Resteasy和Google Guice:如何在@Injection中使用多个@ApplicationPath和资源?

我使用Resteasy 创建了一个项目来测试Google Guice在我的Jax-rs资源中提供的依赖注入.

我的意图是:

  • @ApplicationPath对我的API版本使用multiple .在每个用@ApplicationPathI 注释的类中,为特定版本加载一组类.
  • 每个资源都有一个@Inject(来自Google Guice)在他的构造函数中注入一些服务.

我创建了两个带有注释的类@ApplicationPath:ApplicationV1RSApplicationV2RS.在这两个中我添加了相同的资源类(UserResourceHelloResource),仅用于我的测试.

我的模块配置如下:

public class HelloModule implements Module
{
   public void configure(final Binder binder)
   {
      binder.bind(IGreeterService.class).to(GreeterService.class);

      binder.bind(IUserService.class).to(UserService.class);
   }
}
Run Code Online (Sandbox Code Playgroud)

当我打电话http://localhost:9095/v1/hello/worldhttp://localhost:9095/v2/hello/world,我收到同样的错误:

java.lang.RuntimeException: RESTEASY003190: Could not find constructor 
    for class: org.jboss.resteasy.examples.guice.hello.HelloResource
Run Code Online (Sandbox Code Playgroud)

好吧,正如我所料,这不起作用.对于我来说,使用construtor实例化资源类并不是"聪明"的.

但我找不到办法.说实话,我真的很困惑Google Guice,Jetty和Resteasy在这种情况下如何互相玩耍.

如果我放弃使用的想法@ApplicationPath,我的资源与Google Guice一起配置我HelloModule这样:

public class HelloModule implements Module
{
   public void configure(final Binder binder)
   {
      binder.bind(HelloResource.class);
      binder.bind(IGreeterService.class).to(GreeterService.class); …
Run Code Online (Sandbox Code Playgroud)

jax-rs guice embedded-jetty resteasy

8
推荐指数
1
解决办法
1088
查看次数

REST API版本控制

我目前正在开发基于Java的Web应用程序.最近我们使用Spring创建了一些REST端点.这是因为我们开发了一个混合移动应用程序,通过这些端点与我们的主要应用程序集成.

问题是,未来我们不太确定如何处理更新.如果我们更新我们的API,例如我们更改端点方法的方法签名,或者我们更改我们作为JSON返回的DTO上的属性,那么如果我们的移动用户运行的是过时版本的移动设备,我们就会遇到问题应用程序.

我们想要实施的是强制我们的用户在应用过期时更新应用的内容.我见过很多移动应用程序都是这样做的.因此,我们考虑为我们的REST API提供API版本,然后让移动应用程序检查它使用的版本是否与我们的服务器运行的版本相同,如果没有,则强制用户进行更新.

我们遇到的问题是:

  1. 我们只有一个版本的服务器可以随时运行.那么我们如何计算我们的发布时间?如果我们发布新版API和移动应用程序但应用程序商店尚未公开最新版本,会发生什么情况.然后,用户将被迫进行更新,但更新的应用程序尚不可用.

  2. 我们如何维护API版本号?在移动应用程序上,我们可以配置它.但是在服务器上,维护版本号并不是很好.我说这个的原因是,如果我们对方法签名或DTO等进行更改,并忘记在发布之前手动更新此版本号?当然有一种更自动的方法可以根据API的当前定义生成一些独特的"API密钥"吗?然后我们可以使用它而不是API版本号.

java rest

7
推荐指数
1
解决办法
1027
查看次数

使用Spring实现REST Api实现

编写RESTFul api应用程序的最佳实践之一是添加版本控制.例如:

http://my-server/api/v1/getData
http://my-server/api/v2/getData
Run Code Online (Sandbox Code Playgroud)

我们的应用程序使用Spring框架公开REST api.我们将类标记为Controller,使用RequestMapping注释将URL映射到函数,并添加一些转换为json对象的对象.

例如:

@RequestMapping(method = RequestMethod.POST, value = "/api/v1/getData")
public @ResponseBody ResponseDataDTO getData(@RequestBody OperationsDetailsTDO details) {...}
Run Code Online (Sandbox Code Playgroud)

现在,我们想要提供API的第二个版本.大约2/3的功能保持不变,1/3的功能正在发生变化.更改在逻辑和JSON对象中.

我想知道如何设计代码.我认为这种代码很难管理:

@RequestMapping(method = RequestMethod.POST, value = "/api/{version-var}/getData")
public @ResponseBody ResponseDataDTO createReleaseFromTemplate(@PathVariable("version-var") Integer version, @RequestBody OperationsDetailsTDO details) {
if (version == 1)
{
   doForVersion1();
}
else if (version == 2)
{
   doForVersion2();
}

}
Run Code Online (Sandbox Code Playgroud)

它很难管理,因为在每个函数中都会有不同的分支.只是为了演示这个问题,如果我有一个生成文档的自动工具 - 它将无法理解什么是API.

其次,我想知道如何处理绑定到JSON对象的类.我是否需要复制所有这些类,以进行微小的更改?

谢谢.

java spring spring-mvc

6
推荐指数
1
解决办法
2018
查看次数

关于在Java/Spring项目中组织版本化REST API代码的最佳实践(示例?)?

我很好奇,如果有人能够指出一个很好的例子/最佳实践来组织REST API代码与版本控制(基于uri,意思是"/ v1/zzz"和"/ v2/xxx",甚至更好的东西依赖于Accept标头) - 在Java/Spring项目中?我担心我现在的项目太复杂了,所以向别人学习会很好.

澄清:不确定我是否应该通过过滤器,然后使用一些设计模式来改变行为,但这将使我的过滤器相当复杂..或者可能是我没有考虑弹簧和DI的一些技巧,所以我可以使我的代码更清洁.最简单的方法是在每种方法中都有一些策略模式,它们会有不同的版本,但它似乎也不太干净:-(

java api rest spring web

5
推荐指数
1
解决办法
4092
查看次数

Spring boot & Swagger 2 UI & 自定义 requestmappinghandlermapping - 映射问题

我有自己的 RequestMappingHandlerMapping 并且正在使用 springfox-swagger-ui。添加自定义映射后,我无法在http://localhost:8080/swagger-ui.html实现 swagger ui 。有任何想法吗?

这是我的配置。

    @Configuration
       public class WebMvcConfig extends WebMvcConfigurationSupport {
    @Override
    @Bean
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        return new ApiVersionRequestMappingHandlerMapping("v");
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
          .addResourceHandler("/webjars/**")
          .addResourceLocations("(META-INF/resources/webjars");
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的 pom.xml:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.hateoas</groupId>
        <artifactId>spring-hateoas</artifactId>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.4.0</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.4.0</version>
    </dependency>
    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
        <version>1</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

spring swagger-ui spring-boot swagger-maven-plugin swagger-2.0

5
推荐指数
1
解决办法
5901
查看次数

如何使用Spring Boot设置SpringFox以显示Rest API的两个(或更多)版本?

我试图弄清楚如何使用Spring Fox管理两个(或更多)API端点版本。

要对API进行版本控制,我正在通过内容协商使用版本控制,也称为使用Accept标头的版本控制。使用标头信息分别控制每个端点的版本。例如,对于第一版,我使用属性produces

@Override
@PostMapping(
        produces = "application/vnd.company.v1+json")
public ResponseEntity<User> createUser(
Run Code Online (Sandbox Code Playgroud)

对于第二版,我使用:

@Override
@PostMapping(
        produces = "application/vnd.company.v2+json",
        consumes = "application/vnd.company.v2+json")
public ResponseEntity<User> createUserVersion2(
Run Code Online (Sandbox Code Playgroud)

我不使用consumes第一个(v1)版本,因此如果客户端仅application/json在通话中使用,则默认情况下将调用第一个版本。

我想在Swagger UI上显示两个版本。怎么做?

spring swagger spring-boot springfox

1
推荐指数
1
解决办法
848
查看次数