2013-03-12 4 views
11

MongoDB 스토어 위에 RESTful API가 빌드되어 있으므로 배열을 저장할 수 있다는 점이 좋습니다.배열 요소 추가/제거를위한 RESTful API 끝점?

POST /users { items: [ 1001, 1002, 1003 ] }

하지만 어떻게 항목을 새로운 항목을 추가하거나 제거하기위한 HTTP 엔드 포인트의 모습 것이다 : 그것은이 같은 새로운 자원을 만들 간단합니다?

PATCH /users/{id} { name: 'Bruce Wayne', items: [ 1001, 1002 ] }

을 또는 직접 MongoDB의 쿼리를 전달 :

PATCH /users/{id}?query[$push][items]=1003

는 지금, 나는 터치하고 싶지 않은 요소를 포함한 전체 배열을 지정해야

더 좋은 방법이 있나요?

편집 :

내가 StackMob's API 그것을 수행하는 방법을 좋아한다. name을 업데이트하고 동시에 items에서 요소를 제거하려면 어떻게합니까? 예를 들어 관리자 대시 보드에서 사용자 세부 정보를 업데이트 할 때? 나는 배열 전체를 대체하는 것이 mongodb에서 좋은 생각이라고 생각하지 않습니까?

+0

RESTful API에 무엇을 사용하고 있습니까? MongoDB는 일반적인 사용을위한 out-of-the-box API를 가지고 있지 않습니다 (Admin 전용). 또한 프로덕션 용도로 권장되지 않습니다. http://docs.mongodb.org/manual/administration/security/#rest-api – WiredPrairie

+0

질문을 명확히했습니다 (mongodb 위에 Express 응용 프로그램이 있음) – thatmarvin

+0

처음에는, 분명히 mongodb 쿼리를 RESTful 호출로 전달하는 것을 피할 것이다. 누군가가 예상치 못한 쿼리를 통과하여 데이터를 손상시킬 수 있기 때문에 매우 중요한 보안 구멍이 될 수 있습니다. – thehiatus

답변

-1

는 새로운 요청을 생성하고 삭제하는 REST 표준에 따라 경찰 -> POST -Create 모음에서 새 리소스는 및 는

내가 당신에게 방법의 예를 제공 할 수 있습니다 - 삭제 리소스를 삭제 Java의 고급 HTTP 엔드 포인트는 Jersey를 사용하는 것처럼 보입니다. HTTP 경로가 지정된 리소스 클래스와 다른 작업을 수행하는 메서드의 특정 경로를 가질 수 있습니다. 여기

는 당연히 (당신의 진입 점 당신이 할 것 샘플 자원 클래스입니다 (즉, 사용자의 입력 데이터를 포함) 요청 JSON 또는 XML을 동반 /휴식 /에서는 MyResource/자원 - 은 그래서 URL처럼 볼 수 있었다)이 클래스에 대한 URL 매핑을 할 수있는 web.xml 구성을 할 필요가 ->

import javax.ws.rs.Consumes; 
import javax.ws.rs.POST; 
import javax.ws.rs.DELETE; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 
import org.json.JSONObject; 

public class SampleRESTServiceResource { 

    /** 
    * @param incomingJsonString 
    * @return Response 
    */ 
    @POST 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response createNewResource(JSONObject myJson) { 
     // Do a call to a DAO Implementation that does a JDBC call to insert into Mongo based on JSON 
     return null; 

    } 

    /** 
    * @param incomingJsonString 
    * @return Return response 
    */ 
    @DELETE 
    @Produces(MediaType.APPLICATION_JSON) 
    @Consumes(MediaType.APPLICATION_JSON) 
    public Response deleteResource(JSONObject myJson) { 
     // Do a call to a DAO Implementation that does a JDBC call to delete resource from Mongo based on JSON 
     return null; 
    } 
} 

당신은이 페이지를 참조 할 수있는 예를 시도 할 경우 -> https://www.ibm.com/developerworks/library/wa-aj-tomcat/

+0

@Downvoter ... 왜? –

+0

mongodb 배열에 대한 고급 수준의 끝점 디자인에 대한 질문은 아니며 특정 Java 구현과는 관련이 없습니다. – thatmarvin

+0

나는이 질문에 구체적으로 대답하고 있다고 생각했다.> "하지만 새 항목을 추가하거나 항목을 제거하는 HTTP 끝점은 어떻게 생겼을까요?" 그래서 Java에서 어떻게 생겼는지 예를 들었습니다. –

9

을 mongodb 쿼리를 전달하는 것은 나쁜 생각처럼 보입니다.

  • : 백엔드 구현에 따라 당신이 일부 제한 PUT 또는 패치와 자원에 대한 속성의 수정을 모델링 할 수 SQL Injection

    같이 데이터에 나쁜 일을하는 공격자로 이어질 수 클라이언트는 PUT을 사용하여 전체 자원 표현을 보낼 것으로 예상됩니다. IT는 당신을 위해 일하지만 성 가실 수 있습니다.

  • PATCH을 사용하면 클라이언트는 전체 리소스 대신 변경하려는 특성을 보내야합니다. 그러나 값의 추가 또는 삭제뿐만 아니라 전체 값 을 보내야합니다.다시는 작동하지만 당신은 그걸 좋아하지 않습니다. /users/:id/items
  • 추가 POST을 수락 : 나는 그 자체 자원으로 배열을 모델링 할

    1. :

난 당신이 배열에 항목을 추가 및 제거 모델링하는 방법을 찾고 있다고 생각 배열에 항목을 넣고 배열에서 제거하려면 DELETE.

간단하고 RESTful입니다.

+0

위의 방법은 하나의 항목에서 작업 할 때 생성 또는 삭제 작업을 수행 할 때 유용합니다. 한 번에 여러 항목을 만들거나 삭제해야 할 때 API를 구성하는 방법은 무엇입니까? –

+0

사용자를위한 배열 항목이 있다면 {userId : 1, items : [1,2,3]} 그냥 "item = 2 & item = 3"을 삭제 하시겠습니까? delee에서 나는 "몸"을 설정할 수 있습니다. – W92

+0

하지만 배열의 항목을 URI 경로'DELETE'/users/: id/items/: index'에 사용 된 배열의 색인으로 식별 할 수 있습니다. –