2012-03-30 7 views
1

다음 작업을 수행하는 HttpCRUDServlet을 작성했습니다 (지금까지).빈 응답을 수신하는 Ajax PUT 요청

  • 적절한 CORS 헤더 (service())와 OPTIONS 메소드에 응답
  • 파싱 데이터베이스 (doPut())의 PUT 요청에 전달 된 데이터를 삽입한다.

클라이언트가 빈 응답을받는 것을 제외하면 모든 기능이 정상적으로 작동하는 것처럼 보입니다.

package com.gamersdemokrasy.http; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 
import java.net.URLDecoder; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.json.JSONException; 
import org.json.JSONObject; 

import com.gamersdemokrasy.DAO; 
import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException; 

/** 
* Servlet implementation class HttpCRUDServlet 
*/ 
public class HttpCRUDServlet extends HttpServlet { 
private static final long serialVersionUID = 1L; 
private String uri = null; 

/** 
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
*/ 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // TODO Auto-generated method stub 
} 

/** 
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
*/ 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // TODO Auto-generated method stub 
} 

/* 
* @see HttpServlet#doDelete(HttpServletRequest, HttpServletResponse) 
*/ 
@Override 
protected void doDelete(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    // TODO Auto-generated method stub 
    super.doDelete(request, response); 
} 

/* 
* @see HttpServlet#doPut(HttpServletRequest, HttpServletResponse) 
*/ 
@Override 
protected void doPut(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    JSONObject dataJson = getJsonData(new BufferedReader(new InputStreamReader(request.getInputStream())).readLine()); 

    response.getWriter().println("Hello"); 
    DAO dao = new DAO(); 
    try { 
     if(dao.create(dataJson, uri)) { 
      response.setStatus(HttpServletResponse.SC_OK); 
     } else if(dao.getException() instanceof MySQLIntegrityConstraintViolationException) { 
      response.setContentType("text/plain"); 
      response.getWriter().println(dao.getException().getMessage()); 
      response.setStatus(HttpServletResponse.SC_CONFLICT); 
      dao.getException().printStackTrace(); 
     } else if(dao.getException() instanceof Exception) { 
      response.setContentType("text/plain"); 
      response.getWriter().println(dao.getException().getMessage()); 
      response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 
      dao.getException().printStackTrace(); 
     } 
    } finally { 
     response.getWriter().flush(); 
     response.getWriter().close(); 
    } 

} 

/** 
* Converts a parameter string into a JSONObject 
* 
* @param data 
* @return 
*/ 
private JSONObject getJsonData(String data) { 
    JSONObject json = new JSONObject(); 

    String[] params = data.split("&"); 
    try { 
     for(String param:params) { 
      String tokens[] = param.split("="); 
      json.accumulate(URLDecoder.decode(tokens[0].trim(),"utf-8"), URLDecoder.decode(tokens[1].trim(),"utf-8")); 
     } 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (UnsupportedEncodingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return json; 
} 

/* 
* @see HttpServlet#service(HttpServletRequest, HttpServletResponse) 
*/ 
@Override 
protected void service(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    String method = request.getMethod(); 
    uri = request.getRequestURI().replaceFirst(request.getContextPath(), ""); 
    while(uri.endsWith("/")) { 
     uri = uri.substring(0, uri.length()-1); 
    } 
    System.out.println("Debug>> Request:"+method + " " + uri); 
    System.out.println("Debug>> ContextPath:"+request.getContextPath()); 

    if(request.getMethod().equals("OPTIONS")) { 
     // Set CORS headers 
     response.setHeader("Access-Control-Allow-Origin", "*"); 
     response.setHeader("Access-Control-Allow-Methods", 
       "PUT,GET,POST,DELETE"); 
     response.setHeader("Allow", "PUT,GET,POST,DELETE"); 
     response.setHeader("Access-Control-Max-Age", "180"); 
     response.setHeader("Access-Control-Allow-Headers", "Content-type"); 
    } else if(method.equals("PUT") || method.equals("GET") 
      || method.equals("POST") || method.equals("DELETE")) { 
     super.service(request, response); 
    } 
} 

} 

여기 아약스 코드입니다 : iceweasel 3.5.16에 내가 방화범을 사용하고

$.ajax({ 
     url: 'http://localhost:8080/gamedem/user/', 
     type: 'PUT', 
     data: { 
      id: 'dominick', 
      nick: '[email protected]!s', 
      phno: '9739097300', 
      steam_id: 'lorddominique', 
      games_played: 'cs1.6' 
      //phno1: 9999999999 
     }, 
     //contentType: 'text/plain', 
     contentType: 'application/json', 
     success: function() { 
      alert("Resource Created"); 
     } 
    }); 

및 응답 (409) 충돌 (예상)

여기 소스입니다. 그러나 PUT 요청 아래의 응답 탭은 비어 있습니다.

이제 응답이 비어있는 이유는 무엇입니까? response.printWriter에 오류를 쓰고 플러시하고 닫았습니다.

+0

@ thinksteep, @ alex 그냥 청크 분할 전송 인코딩에 주목했습니다. 이것이 어떤 문제를 일으킬까요? 여기에 헤더'서버 \t 아파치 - 코요테/1.1 콘텐츠 유형 \t 텍스트/\t가 날짜 \t 2012년 3월 30일 (금) 20시 24분 25초 GMT' –

답변

0

오류가있는 경우 오류가있는 것으로 보이지 않습니다. 해당 오류 코드가 표시됩니다. HTTP Spec에 따라 : HTTP Spec에 대해서는 link입니다. 새로운 리소스가 작성되면

는 원 서버는 201 (Created) 응답 사용자 에이전트를 알려야한다. 기존 자원 이 수정 된 경우, 요청 완료에 성공했음을 나타 내기 위해 200 (OK) 또는 204 (No Content) 응답 코드 을 전송해야합니다 (SHOULD). 경우 자원이 생성 될 수 없거나 HttpServletResponse.setStatus에 대한 Javadoc부터 문제의 본질

+0

가 이미 오류 코드를 반환하고 청크 일반 전송 인코딩입니다. 오류 코드를 변경할 수 있지만 문제는 아닙니다. 내가 찾고있는 오류 코드와 함께 문자열을 전달하는 방법입니다. 충돌이 있음을 나타내는 오류 409가 반환되지만 오류 메시지 (e.getMessage)는 충돌이 발생하는 위치를 클라이언트에 알릴 수 있습니다. 나는 request.getWriter(). println (e.getMessage())가 작동 할 것이라고 생각했지만, 방화 광구의 응답은 비어있다. –

0

반영 요청 - URI, 적절한 에러 응답을 발송해야한다 으로 수정 :

을 컨테이너는 버퍼를 지우고 쿠키 및 기타 헤더를 ​​보존하는 위치 헤더를 설정합니다.

응답 작성자에게 상태 메시지를 쓰기 전에 setStatus으로 전화 해보십시오.

+0

그 차이는 없습니다. 참고로 Java EE 6을 사용하고 javadoc은'이 메소드는 모든 쿠키 및 기타 응답 헤더를 보존합니다. '라고 말합니다.버퍼가 지워지는 Java EE 5를 제거하십시오. –