2017-03-02 1 views
0

서버가 요청을 인식하고 요청한 데이터 클라이언트를 다시 보내려는 경우 200을 보냅니다. 서버가 요청을 인식하지만 클라이언트가 요청한 데이터를 다시 보내지 않으면 422를 보내십시오. JSON API가 어떻게 작동하는지 정확하게 알려줍니다. 나는 안드로이드에 422, HttpURLConnection의 입력 스트림에 액세스하려고 예외가 발생 보낼 때, 불행하게도JSON API의 상태 코드로 작업

respond_to do |format| 
     if @user.persisted? 
     format.json do 
      render json: { id: @user.id }, status: 200 
     end 
     else 
     format.json do 
      render json: { error: @user.errors.full_messages }, status: 422 
     end 
     end 
    end 

: 모델을 저장할 때, 나는 모델 유효성 검사 오류를 포함 할 때, 나는 422을 보내 200을 보내

W/System.err: java.io.FileNotFoundException: http://10.0.2.2:3001/users/auth/facebook/callback.json 

이제 JSON API에서 422를 200으로 변경하면 예외가 발생하지 않으며 데이터를 구문 분석 할 수 있습니다.

url = new URL(OMNI_AUTH_CALLBACK); 
urlConnection = (HttpURLConnection) url.openConnection(); 
urlConnection.setReadTimeout(10000); 
urlConnection.setConnectTimeout(15000); 
urlConnection.setRequestMethod("POST"); 
urlConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 
urlConnection.setDoInput(true); 
urlConnection.setDoOutput(true); 

OutputStream os = urlConnection.getOutputStream(); 
BufferedWriter writer = new BufferedWriter(
        new OutputStreamWriter(os, "UTF-8")); 
writer.write(getQuery(params[0])); 


writer.flush(); 
writer.close(); 
os.close(); 

int status = urlConnection.getResponseCode(); 
InputStream in = urlConnection.getInputStream(); 
InputStreamReader reader = new InputStreamReader(in); 
int data = reader.read(); 
while(data != -1) { 
       char current = (char) data; 
       result += current; 
       data = reader.read(); 
} 

데이터를 저장하는 동안 문제가 발생했기 때문에 응답이 200이 아니어야합니다. Android 개발자는 무엇을 할 수 있습니까?

+0

??? 422 에러가 발생하고 200 에러가 발생하지 않고 응답이 200이 아니어야한다고 말하고 있습니까? 422 또는 200과 오류가 있거나 오류가 없으면 무엇이 필요합니까? – user7568042

+0

@ user7568042 나는 이미 내 질문에 설명했다 : 모델이 저장되지 않을 때, 422를 다시 보내고 싶다. 그러나 422를 안드로이드에 보내면 예외가 발생하고 JSON 오류 메시지를 처리 ​​할 수 ​​없다. 422 상태 코드 응답. – Donato

답변

0

응답이 성공적이지 않으면 응답 스트림을 읽습니다.

HttpURLConnection httpConn = (HttpURLConnection)_urlConnection; 
InputStream _is; 
if (httpConn.getResponseCode() >= 400) { 
    _is = httpConn.getInputStream(); 
} else { 
    /* error from server */ 
    _is = httpConn.getErrorStream(); 
} 

가 여기에 버그, WNF로 폐쇄 : http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4513568

그것은 422 응답을 FNFE을 던지고 있다는 사실을 심각하게 엉망이된다. HttpURLConnection의 출처를 보면 422를 정의하지도 않습니다.

+0

그 파일을 찾을 수 없다는 오류가 큰 시간을 저 버렸습니다. 나는 그것이 무슨 말을하고 있는지 전혀 모른다. – Donato

+0

나는 다른 사람이 4xx 코드를 잘 알고 있다는 것을 알고 싶다. –