2010-04-17 5 views
2

POST HTTP 요청을 통해 큰 파일을 업로드한다고 가정 해 보겠습니다.HTTP POST 명령/REST url

파일을 업데이트하는 리소스의 이름을 지정하는 다른 매개 변수 (파일 제외)가 있다고 가정 해 보겠습니다.

리소스는 REST로 할 수있는 방법 (예 : foo.com/bar/123)과 같이 URL의 일부가 될 수 없습니다. 이것이 기술적 및 정치적 이유의 결합 때문이라고 가정 해 봅시다.

리소스 이름이 유효하지 않거나 IP 주소 및/또는 로그인 한 사용자가 리소스를 업데이트 할 권한이없는 경우 서버에서 파일을 무시해야합니다. 이것은 POST 요청에서 자원 매개 변수가 처음 나온 경우 쉽게 수행 할 수 있습니다.

이 POST가 대부분의 (모든?) 브라우저에 대해 리소스 이름과 파일 필드가 포함 된 HTML 양식에서 나온 경우이 요청은 POST 요청에 보존됩니다. 그러나 완전히 그것에 의지하는 것이 순진 할 것입니다, 그렇지 않습니까?

즉 HTTP 매개 변수의 순서는 중요하지 않으며 클라이언트는 임의의 순서로 POST를 자유롭게 작성할 수 있습니다. 그게 사실이 아닌가?

적어도 이론적으로 서버가 요청을 거부하기 전에 큰 파일 전체를 저장하게 될 수 있음을 의미합니다.

요청에 대한 특정 권한 부여/오류 검사를 수행하기 위해 POST 내용을 볼 필요가 없으므로 RESTful URL에 이점이있는 경우가 분명합니다.

동의합니까? 당신의 생각과 경험은 무엇입니까?

기타 의견주세요! 내 생각에, 대용량 파일 업로드 (또는 그 문제에 대한 파일 업로드)를 수행하는 모든 사람이 이에 대해 생각해 봤어야합니다.

답변

2

확실히 POST 변수의 순서에 의존 할 수 없습니다. 특히 양식을 제출/게시 할 때 양식 배열을 올바른 순서로 신뢰할 수 없습니다. 대역폭을 저장하려면 실제 데이터 게시 시점에 도달하기 전에 자격 증명 등을 확인해야 할 수 있습니다.

+0

클라이언트 측 유효성 검사? 어서. 그것은 신뢰할 수 없습니다. 요점은 이것이 REST로만 효율적으로 해결할 수 있다는 결론을 내 렸습니다. 동의하니? –

+0

클라이언트 쪽 유효성 검사가 아니라 양식을 사용하여 html 페이지에 들어가기 전에 사용자의 유효성을 검사합니다. 예를 들어 권한 부여 데이터로 먼저 한 요청을 수행하고이를 쿠키에 저장 한 다음 실제 콘텐츠로 다른 요청을하십시오. 아래의 접근 방식도 좋습니다. – Timo

+0

알겠습니다. 두 가지 요청을 제안합니다. 하나는 자원에 대한 쿠키를 가져오고 다른 하나는 자원에 POST합니다. 예,이 방법이 효과가 있지만 인공 솔루션은 무엇입니까? REST의 우아함과 비교해보십시오. –

1

저는 요청의 쿼리 문자열에서 첫 번째로 필요한 변수를 붙였습니다. 클라이언트에

,

<form action="/yourhandler?user=0&resource=name" method="post"> 
<input type="file" name="upload" /></form> 

서버에 당신에게

POST /yourhandler?user=0&resource=name HTTP/1.1 
Content-Type: multipart/form-data; boundary=----- 
... 

----- 
Content-Disposition: form-data; name="upload"; filename="somebigfile.txt" 
Content-Type: text/plain 

... 

를 가져옵니다, 당신은 업로드가 완료되기 전에 쿼리 문자열을 확인하고 필요한 경우 시스템을 종료 할 수있을 것입니다. (REST와 거의 같지만 기술적으로나 정치적으로 작업해야하는 것을 기반으로 구현하기가 더 쉽습니다.)

다른 옵션으로는 쿠키를 사용하여 데이터를 저장할 수 있지만 이것은 사용자가 쿠키를 사용할 수 없을 때 분명히 실패합니다. Authorization 헤더를 사용할 수도 있습니다.

+0

다른 댓글보다 소리가 좋습니다. 그러나 그것은 아직도 hackish하게 들린다. 그것은 기본적으로 작동해야하지만 나는 당신을 위해 것들을 자동화하려고하는 특정 프레임 워크를 혼란스럽게 할 수도 있다고 긴장합니다. 그리고 REST만큼 우아하지 않습니다. –

-1

사용 사례에 대해 더 많은 배경 지식을 제공해야합니다. 지금까지는 절대적으로 이유가 없습니다. 왜 생성하거나 업데이트 할 리소스에 큰 엔티티를 넣지 말아야할까요?

 
PUT /documents/some-doc-name 
Content-Type: text/plain 

[many bytes of text data] 

왜 그렇다고 생각하십니까?

1 월

+0

"리소스는 REST (예 : foo.com/bar/123)로 URL의 일부가 될 수 없습니다 (예 : foo.com/bar/123). 이것이 기술적 인 이유와 정치적인 이유가 결합 된 이유입니다." –

+0

나는 그것을 확실히 읽었습니다 :-) 그러나 나는 그것이 정말로 요구 사항이라는 것을 의심합니다. 그래서 나는 당신에게 배경을 설명해달라고 부탁했다. 리소스 식별의 일부를 요청 엔터티로 이동해야하는 기술적 또는 정치적 이유가있을 수 없습니다. –