2012-10-23 2 views
29

자바 스크립트로 압축 된 POST 데이터를 제어하려는 서버에 보내고 싶습니다. HTTP 레이어가 압축을 처리하도록 할 수있는 방법이 있습니까?브라우저에서 보낸 HTTP 포스트 데이터 압축하기

JSON을 보내고 있습니다. 콘텐츠 유형을 GZIP/deflate로 설정하면 브라우저가 자동으로 압축 한 다음 deflate mod가있는 Apache가 자동으로 압축을 풀어 내 애플리케이션이 압축중인 데이터에 대해 생각할 필요가 없습니까?

다른 방법으로도 작동 할 수 있지만이 방법으로 작동시키는 방법은 알고 있습니다.

답변

63

브라우저가 자동으로 gzip으로 데이터를 인코딩합니까? 짧은 대답은 ...

HAAHAHAAahahahahahhaha입니다.

긴 대답은 일부 사용자 에이전트는 다음과 같은 일을 할 수 있다는 것입니다,하지만 당신은 확실히에 의존 할 수 없다. 아파치 mod_deflate 문서 상태 :

일부 특수 애플리케이션은 실제로 일부 WebDAV 클라이언트와 같은 요청 압축을 실제로 지원합니다.

아니, 그게 효과가 없을거야. 직접 적절한 HTTP 요청 메시지를 생성해야합니다. 이 경우 적절한 헤더는 이고 Content-Type:이 아니므로 콘텐츠 자체가 application/json이므로 전송을 위해 HTTP 요청 메시지의 엔티티 본문을 인코딩하려고합니다.

압축 후 메시지 엔터티 본문의 크기 (바이트)를 지정하는 적절한 Content-Length: 헤더를 추가해야합니다 (또는 Transfer-Encoding: chunked을 사용하여 HTTP 메시지를 보내고 콘텐츠 길이 지정을 지켜야 함). 수신 측에

, 당신 instruct mod_deflate to use an input filter는 정보를 압축 할 수 있습니다 : 당신은 단지 자원의 몇 메시지 본문을 압축 수신하는 경우

<Location /dav-area> 
SetInputFilter DEFLATE 
</Location> 

이것은 손으로 약간 무거운 편이다. 대신에 클라이언트 측 스크립트를 사용하여 Content-Encoding: gzip 헤더를 확인하고 요청 본문의 압축을 수동으로 풀어야합니다. PHP에서이 작업을 수행하는 방법은 완전히 다른 질문입니다. 자세한 내용이 필요하면 다른 질문을 올리십시오.

+0

JSON 텍스트의 작은 버스트를 보내는 경우 데이터 압축에 필요한 처리 오버 헤드가 전송 크기 이점보다 클 것이라고 덧붙입니다. 요청에서 이진 파일을 스트리밍하는 것에 대해 이야기하는 경우 다른 이야기입니다. 하지만 JSON의 경우? 아마 너의 시간 가치가 없어. – rdlowrey

+0

나는 그것을 할 수 없을 정도로 많은 것을 알았다. 그러나 나는 여하튼 물었다. JSON 필드 중 하나를 압축하고 응용 프로그램에서 압축을 푸는 버전이 있습니다 (Sinatra). 나는 이것이 내 상황을 위해 최선의 방법이라고 생각한다. 해당 필드의 정보는 알맞은 크기이므로 압축이 유용합니다. 고마워요 –

+121

"HAAHAHAAahahahahahhaha." 매우 압축 적입니다. –

0

그냥 달성 https://github.com/dankogai/js-deflate그러나 어떤 이유로 든 postdata는 + 기호를 제거하고 공백으로 대체합니다.

자바 스크립트를 통해 데이터를 전송하려면 :

params.mapdata= btoa(RawDeflate.deflate(JSON.stringify(mapdata))); 

는 PHP를 통해 데이터를 수신하려면 :

$value = gzinflate(base64_decode(preg_replace('/\s/', '+',$value))); 
+3

POST 데이터는 URL 인코딩되어야하므로'+'는'% 2B'으로 보내야합니다. '+'는 공백에 대한 오래된 인코딩입니다. –

+1

이게 잘못되었습니다. btoa는 데이터를 30 % 확장합니다. 따라서 텍스트를 바이너리로 압축 한 다음 바이너리를 텍스트로 다시 확장합니다. 이것은 아마 항상 더 큰 수송을 할 것이다. – cnd

1

그것은 가능하지만, 나는 당신의 서버에 들어오는 gzip으로 압축 된 데이터를 수락에 대해 강력하게 추천 할 것입니다. 주된 이유는 서버가 gzip bombed이되지 못하게하기 위해서입니다.일반적으로 압축되지 않은 데이터가 실제로 압축 해제되기 전에 어떤 모양인지 알 수 없기 때문에 사용자는 무해한 1KB 또는 1MB의 데이터처럼 보이지만 실제로는 100GB의 데이터 인 웹 요청을 보낼 수 있습니다. 그런 다음 웹 서버 (nginx 또는 apache)는 다음 10 분 동안 모든 압축을 풀려고 멈추고 결국 메모리가 부족하거나 잠김 상태가됩니다.