2012-09-07 6 views
0

서버에 XMLHttpRequest ~ POST을 사용하는 자바 스크립트 코드 작업 중입니다.자바 스크립트 XMLHttpRequest - 첫 번째 POST 요청 만 작동합니다.

var a = sometext; 
var b = someOtherText; 
var msg = "a=" + encodeURIComponent(a) + "&b=" + encodeURIComponent(b); 
var server = new XMLHttpRequest(); 
server.open("POST", "http://localhost:3333", true); 
server.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
server.send(msg); 

내 컴퓨터의 포트 3333에에서 듣고있어 (윈도우 7)을 사용하여 netcat을 :

내 코드는 다음 (내가 구글 크롬의 북마크에서 그것을 실행하는거야)과 같이 보입니다 . 처음으로 코드를 실행하면 netcat을 실행중인 명령 프롬프트에서 POST 요청, 모든 헤더 및 보낸 데이터의 올바른 값 (msg)을 표시합니다. 그러나 스크립트를 다시 실행하면 (열려있는 웹 페이지에서) 명령 프롬프트에 더 이상 새로운 정보가 표시되지 않습니다. 이는 나중에 POST 명령이 실패했음을 의미합니다. (Chrome의 JavaScript 콘솔을 보면 아무 것도 없습니다. 오류 메시지). netcat 리스너를 재시작하고 스크립트를 재실행하면 첫 번째 실행이 올바르게 작동하고 후속 실행은 아무 것도 수행하지 않습니다.

왜 이것이 실패하는지에 대한 아이디어가 있습니까?

편집 : 나는 조금 더 장난 짓을했는지, 그리고 그것을 폐쇄로 표시되지 않습니다 로컬 호스트에 대한 연결을 밝혀 (또는 어떻게 든 server 목적을 위해 예약되고있다) . 스크립트를 실행 한 탭을 닫으면 모든 리소스가 보관되고 스크립트가 다시 작동합니다.

XMLHttpRequest가 완료 되 자마자 닫을 수있는 방법이 있습니까? 나는 ('Connection: close') 할 헤더를 추가하려고했지만 허용되지 않는 것으로 밝혀졌습니다. 나 또한 동기화 및 호출 server.abort() 이후에 요청을 변경했는데 (심지어는 그 기능이 정확히 무엇인지 말할 훌륭한 문서를 찾을 수 없었다),하지만 도움이되지 않았다. 어떻게 도움이 될 것 같아 1.1 대신 HTTP/1.0을 사용하여 연결하려면 지정하는 방법을 알아낼 수 없습니다.

아이디어가 있으십니까?

답변

2

당신은 닫는 netcat을 말하고 그것을 재시작하면 효과가있다. 아마 당신은 첫 번째 POST가 끊어진 후에 청취자를 다시 열기 위해 netcat을 설정하지 않았을 것입니다.

netcat cheat sheet에 따르면 -L을 Windows에서 사용할 수 있습니다.

-L : Listen harder (Windows 버전의 Netcat에서만 지원됨). 이 옵션은 netcat을 사용하면 (자동 폐쇄 아니에요 아마 때까지 브라우저 회) 연결을 종료하려면 클라이언트가

을 차단 한 후 다시 듣기 시작하는 지속적인 수신기, 아마도 the minimal Full-Response "HTTP/1.0 200 OK\r\n\r\n"), a valid HTTP response로 응답하려고한다.

HTTP/1.0 요청에 대한 HTTP/1.1 응답은 브라우저 (클라이언트)가 이전 프로토콜을 구현한다고 가정합니다 (이전 버전과의 호환 가능). HTTP/1.1 응답에도 응답 할 수 있지만 connections are assumed to be persistent (즉, not closed right away)입니다.

클라이언트는 달리 명시하지 않는 한 서버의 오류 응답 후에도 서버가 지속적 연결을 유지한다고 가정해야합니다 (SHOULD).

편집 : 실수로 최소 요청 응답을 사용했습니다. 서버가 (TCP) 연결을 닫아야 할 수도 있기 때문에 응답을 실제로 영구 리스너로 구현하는 것이 더 어려울 수 있습니다. 아마도 netcat "minimal HTTP listener" (-L을 사용하지 않고 연결을 다시 열기 위해 루핑)을 재 작성한 스크립트가 더 효과적일까요? 다음 단계는 더미 응답을 제공하는 실제 HTTP 서버를 시작하는 것입니다. 좋은 아이디어는 아닙니다. 콘텐츠로 올바른 응답을 테스트 할 수있는 기회를 제공 할 것이기 때문입니다.

+0

저는 이미 -L을 사용하고 있습니다. (netcat을 시작하기 위해 "nc -L -p 3333 -vv"를 사용하고 있습니다). 또한 명령 프롬프트의 커서가 정보의 끝에서 끝나기 때문에 연결이 닫히지 않는 것처럼 느껴집니다. 새 줄이나 다른 것이 아닙니다. – scaevity

+0

@scae : (유효한) HTTP 응답으로 브라우저를 닫으십시오. 업데이트 된 답변. –

+0

감사! HTTP 요청에 응답하는 간단한 서버를 만들었고 연결을 올바르게 닫을 수있었습니다. – scaevity

관련 문제