2012-10-17 4 views
9

나는 (RavenDB에서 유래)ServiceStack 라우팅

public string ID {get;set;}  
activities/1 

의 ID로 엔티티를했습니다.

내가 POST에 백본 응용 프로그램을 사용하여 내 REST 서비스에 처하고있어 내 ServiceStack AppHost

Routes 
    .Add<Activity>("/activities") 
    .Add<Activity("/activities/{id}"); 

에 다음과 같은 경로를 등록하고있다.

  • ID 속성은 "활동/1"
  • ID 속성은 "활동 %의 2F1"와 같은 경로로 인코딩으로 JSON으로 직렬화 : 밖 박스 어떻게됩니까

  • ServiceStack은 URL 기반 id 속성에 우선 순위를 부여하므로 내 문자열은 RavenDb에 직접 사용되지 않는 인코딩 된 값을 가져옵니다.
  • 을 슬래시보다는 하이픈을 사용하는
  • 변경 RavenDb ID 생성에 JSON 시리얼 라이저 킥에 "/ 활동"을 게시 할 수

    • 변경 백본 :

    옵션은 내가 알고 있어요

  • 는 세트 인코딩 %의 2 층 내 Id 속성의 구문 분석을 확인하고

모두가 I RESTfuln을 잃게 하나의 단점이 슬래시로 변환 내 API에있는, 바람직하지 않은, 또는 일반적으로 현명한 여우입니다 RavenDb 규칙을 따르지 않습니다. 또한, 나는 개인적으로 슬래시를 선호하는 경향이있다.

이렇게 나는 타협을 포함하여이 문제점을 분류하는 데 사용할 수있는 서비스 옵션에 다른 옵션이 있는지 궁금합니다. Serialiser 사용자 지정이나 와일드 카드 라우팅 중 하나가 내 머리 속에 있습니다. ...

답변

10

나는 ASP.Net WebAPI와 동일한 문제가 있으므로 ServiceStack과 관련한 문제는 아니라고 생각합니다. Raven URL에 Raven 스타일의 ID가 있습니다.

[{ 
    Id:"users/1", 
    Name:"John" 
}, 
{ 
    Id:"users/2", 
    Name:"Mary" 
}] 

가 지금은 특정 사용자를 얻으려면 :

예를 들어, 내가 GET: /api/users를 조회하고 같은 결과를 반환 가정 해 봅시다. 순수한 REST 접근법을 따르는 경우이 ID가이 문서에서 수집되어 URL의 id 부분에 전달됩니다. 여기서 문제는 GET: /api/users/users/1처럼 보이지만 웹API (및 ServiceStack)가 url 매개 변수를 작업 메소드에 전달하는 방식에 슬래시가 발생한다는 것입니다.

내가 만든 타협안은 URL의 관점에서만 정수로 id를 처리하는 것입니다. 따라서 클라이언트는 GET: /api/users/1을 호출하고 내 방법은 public User Get(int id)으로 정의합니다.

멋진 부분은 Raven의 session.Load(id)은 전체 문자열 형식 또는 정수 형식을 사용하는 오버로드가 있으므로 대부분의 시간을 변환 할 필요가 없습니다.이 session.GetStringIdFor<User>(id) 간단 호출

public static string GetStringIdFor<T>(this IDocumentSession session, int id) 
{ 
    var c = session.Advanced.DocumentStore.Conventions; 
    return c.FindFullDocumentKeyFromNonStringIdentifier(id, typeof (T), false); 
} 

: 당신이 자신의 ID를 번역 할 필요가 찾을 수없는 경우

, 당신은이 확장 방법을 사용할 수 있습니다. 문서를 즉시 로딩하는 것 이외의 다른 ID를 사용하여 작업하는 경우에는 보통 수작업으로 번역해야합니다.

이러한 ID를 변환하여 일부 REST 순수 규칙을 위반하고 있음을 이해합니다. 그러나 상황에 따라 합리적이라고 생각합니다. 나는 누군가가 생각해내는 대안 적 접근에 관심이있다.

+0

감사합니다. 그래서 GET :/api/users에서 Integer ID를 돌려 주겠습니까? – Chris

+0

아니, 결과 집합을 조작하기에는 너무 서투른 ㄴ다는 것을 알았 기 때문에 전체 문자열 ID를 반환합니다. 클라이언트 응용 프로그램은 전체 문자열 ID를 유지하지만 ID가있는 URL을 작성할 때 id.split ("/") [1]과 같은 것을 사용하여 전면 부분을 제거합니다. –

0

RavenDB에서 Durandal JS를 시도 할 때이 문제가 발생했습니다.

제 해결 방법은 작동시키기 위해 URL을 약간 변경하는 것입니다. 귀하의 예제에서 그래서 :

GET /api/users/users/1 

jQuery를에서

GET /api/users/?id=users/1 

되었다,이된다 :이 매트에 대한

var vm = {}; 
vm.users = []; 

$.get("/api/users/?" + $.param({ id: "users/1" }) 
    .done(function(data) { 
     vm.users = data; 
    });