1

저는 RESTful 웹 서비스의 클라이언트 인 SPA에서 작업하고 있습니다. 클라이언트와 서버 모두 동일한 프로젝트의 일부입니다. 즉 양측의 코드를 자유롭게 수정할 수 있습니다. 나는 RESTful API 디자인을 읽고 모든 것을 "올바른"방식으로 수행하도록 노력해 왔습니다. 내가 읽어야 할 테이크 어웨이 중 하나는 클라이언트가 더 많은 정보에 액세스 할 수 있도록 RESTful 서비스가 하이퍼 링크를 게시해야하며 클라이언트는 진입 점 이외의 서비스 URL에 대한 하드 코딩 된 정보가 없어야한다는 것입니다. 하이퍼 링크를 사용하면 서버가 URL을 변경하는 경우 클라이언트의 유연성이 향상됩니다.딥 링크를 사용하여 RESTful 클라이언트/서버 웹 앱에서 URL을 하드 코딩하지 않도록하려면 어떻게해야합니까?

그러나 사용자가 특정 클라이언트 상태에 연결할 수있을 때이 아키텍처가 어떻게 작동하는지 알 수 없습니다. 예 :

보기 중 하나는 구입할 수있는 책 목록입니다. 클라이언트는이 페이지를 식별하기 위해 브라우저의 위치를 ​​/books/으로 설정하고 백엔드 데이터는 해당 URL을 게시하는 API 엔트리 포인트에서 가져온 엔드 포인트 /api/books/에서 온 것입니다. 서비스 URL이 같은 JSON 문서로 응답

[ 
    {"title": "The Great Gatsby", 
    "id": 24, 
    "url": "http://localhost/api/books/24/"}, 

    < and so on > 

] 

클라이언트는, 클릭하면, 한 권의 책의 상세보기로 이동 읽을 수있는 링크를 생성하려면이 옵션을 사용합니다. 브라우저의 위치는 /books/the-great-gatsby/24/으로 업데이트되어 사용자가이보기를 책갈피에 추가하고 링크 할 수 있습니다.

사용자가이 링크를 직접 클릭하면 어떻게 처리됩니까 ?? 하드 코드 된 URL이 없어도이 책의 정보를 어디에서 얻을 수 있는지 어떻게 알 수 있습니까?

내가 가지고 올 수있는 최선은 다음과 같은 요청의 순서입니다 : - 서비스

  • OPTIONS /api/books/ (책에서 모두가 찾을 수)을 사용할 수 있습니다보기 -

    1. GET /api/에 대한 설명을 볼 것 책에서 작업 할 수 있습니다 (예 : ID로 책을 찾을 수 있는지 확인).
    2. GET /api/books/?id=24 - 브라우저 위치에서 ID와 일치하는 책을 찾을 수 있는지 확인하십시오.
    3. GET /api/books/24/는 - 사실 짧은 데이터

    뭐든지 클라이언트가 API의 URL에 대한 지식을 하드 코딩 한 것을 의미하는 것입니다 검색 할 수 있습니다. 그러나 웹 앱 관점에서 보았을 때 이것은 비효율적으로 보입니다.

    누락 된 트릭이 있습니까? /api/books/24/ 끝점을 하드 코드하지 않고 도서 ID 24에 대한 세부 정보를 얻는 방법을 클라이언트가 알 수있는 방법이 있습니까?

  • +0

    사용자가 URL을 북마크 할 수있게하려면 서버에서 해당 위치를 지원해야합니다. '하드 코드 된'정보라고 부르지 않습니다. –

    +0

    어쩌면 내가 아키텍처를 이해하지 못할 수도 있습니다. URL을 생성 한 클라이언트 측 코드가있는 경우 클라이언트가 콘텐츠를 다시 생성해야합니다. 그래서이 경우'http : // localhost/api/books/24 /'를 어디에 저장할 것인지 궁금 할 것입니다. –

    +0

    @JochenBedersdorfer 정확하게 - 자바 스크립트 코드에서 해당 URL 작성기를 하드 코딩하는 대안을 볼 수 없으므로 효율적으로'/ books/the-great-gatsby/24 /'보기를 렌더링 할 수 있습니다. –

    답변

    2

    서버에서이 리소스 /books/the-great-gatsby/24/을 요청하면 서버는 해당 URL에 특정한 것으로 응답해야합니다. 현재, 아마도 해킹 비트 인 window.location을 분석 중입니다. /books/the-great-gatsby/24/이 정적 콘텐츠 인 경우

    는, 당신은 거의 선택의 여지가 : 당신은 어딘가에 명시 적으로 클라이언트의 현재 상태를 저장 (예 : /books?data=api/books/24 또는 암시 적으로 다음 클라이언트가 API 리소스에 그 번역하는 방법을 알고하는 데에 이르게 /books/the-great-gatsby/24/

    .

    RESTful 방법은 하이퍼 텍스트를 사용하여 관련 리소스 (즉, 렌더링 할 데이터)가 태그를 적절한 선택으로 만드는 위치를 나타내는 것입니다.당신은 항상 당신의 클라이언트 측의 통제를 유지 제 3 자에게 API를 게시하지 않을 경우

    즉 좀 더 생산적 죽겠다 수 있습니다, 그러나, <head><link href="api/books/24" ....></link></head>

    /books/the-great-gatsby/24/을 정적 컨텐츠를 도랑 및 렌더링 RESTful이며 그냥 RESTish로 이동하십시오.

    0

    또 다른 아이디어 : 당신은 이미 다음과 같은 가정, /books/the-great-gatsby/24/ 어떻게 든 /api/books/24/ 같은 경로로 URL로 매핑해야합니다 경로 구성 요소가있는 URL을 만들고있어

    .

    이 매핑을 수행하는 소규모 서비스 서버 측을 추가하지 않는 이유는 무엇입니까? 예 :

    /lookup?url=/books/the-great-gatsby/24/ 
    

    추가 요청이 걱정되는 경우 해당 끝점은 실제 응답을 반환 할 수 있습니다. 실제 URL (또는 표준, 원하는 경우)을 나타내는 self 링크가 계속있을 수 있습니다.

    또는 리디렉션 할 수 있으며 HTTP/2를 사용하면 실제 리소스를 즉시 푸시 할 수 있습니다.