2010-08-23 3 views
2

오버로드를 달성하기 위해 @Path에서 정규 표현식을 사용했으며 처음에는 정말 깔끔하다고 생각했지만 오버로드하는 방법은 일반적으로 좋지 않았습니다. RESTful 웹 서비스에도 똑같이 적용됩니까? JAX-RS를 사용하여 이것을 달성하는 더 좋은 방법이 있습니까?REST에서 http 메서드 오버로드에 대한 조언

그래서 지금은 그러나, 오버로드 중 하나는 실제로 200 응답 본문을 반환해야, 12345

@Path("/project") 
public class ProjectPropertiesResource 
{ 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    @Path("/{name : [a-zA-Z]+}") 
    public Response getProjectPropertiesByName(@PathParam("name") String name) 
    { 
     ... 
    } 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    @Path("/{id : \\d+}") 
    public Response getProjectPropertiesById(@PathParam("id") long id) 
    { 
     ... 
    } 
} 
+1

아마 나 일 뿐이지 만 귀하의 예에서는 과부하가 표시되지 않습니다. 두 방법 모두 다른 이름을 사용합니다. –

+1

난 그 방법에 액세스하는 경로를 '오버로드'했습니다. 메서드 자체는 일반적으로 오버로드를 사용하지 않으므로 다른 이름을가집니다. – willcodejavaforfood

답변

6

당신은 그것을 할 수 있습니다// 프로젝트/ProjectNumber1000/또는 프로젝트에 의해 내 getProject REST 서비스를 호출 할 수 있습니다 다른 오버로드는 본문을 반환하는 URI로 303 리디렉션을 반환해야합니다.

이렇게하면 캐시에 리소스 복사본이 하나만 있는지 확인하고 주 URI에서 PUT 또는 POST를 수행하면 복사본 하나가 무효화됩니다. 그렇지 않으면 캐시에있는 다른 버전으로 인해 일관성없는 결과가 나타날 수 있습니다.

+0

좋습니다, 좋은 지적입니다. 그래서 저는 그 중 하나에서 Response.temporaryRedirect를 사용합니다. – willcodejavaforfood

+0

예, 그런 것 같습니다. 303은 실제로 "임시 리디렉션"이 아닌 "기타 참조"입니다. –

+0

''POST 후 리디렉션 (일명 POST/리디렉션/GET) 패턴에서 사용됩니다. ' JavaDoc의 주석은 저를 놀라게했습니다. – willcodejavaforfood