2014-03-27 9 views
3

Android 용 모바일 클라이언트가 Flask REST API를 통해 서버와 통신하는 Android 애플리케이션을 개발 중입니다. 특정 모바일 장치는 POST 끝점 중 하나에 대해 서버에서 400 응답을 간헐적으로 수신합니다. 400 즉시 요청 JSON 객체가있는 경우 내부 상태 액세스로 반환Flask POST 400 요청에 액세스 할 때 오류가 발생했습니다. JSONObject

def post(self): 
      app.logger.info("Request :" + request.url) 
      if request.headers['Content-Type'] == "application/json": 
        tok = str(request.json['tok']) 
        user_id = str(request.json['user_id']) 
        contact = str(request.json['contact']) 
        . 
        . 
        . 
      else: 
        response = jsonify({"message": "Unsupported Media Type"}) 
        response.status_code = 415 
        return response 

응답 :

다음은 관련된 서버 측 코드이다.

HttpParams httpParameters = new BasicHttpParams(); 
    HttpConnectionParams.setConnectionTimeout(httpParameters,Constants.HTTP_CONNECTION_TIMEOUT); 
    HttpConnectionParams.setSoTimeout(httpParameters, Constants.HTTP_SOCKET_TIMEOUT); 
    HttpClient client = new DefaultHttpClient(httpParameters); 
    URL url = null; 
    URI uri = null; 
    try { 
     url = new URL(Constants.URL+"api/v1/testapi"); 
     uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); 
    } catch (MalformedURLException e3) { 
     e3.printStackTrace(); 
    } catch (URISyntaxException e) { 
     e.printStackTrace(); 
    } 
    HttpPost post = new HttpPost(uri.toString()); 
    final JSONObject msgObject = jObject[0]; 

    StringEntity se = null; 
    try { 
     se = new StringEntity(msgObject.toString()); 
    } catch (UnsupportedEncodingException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE,"application/json")); 
    post.setEntity(se); 
    boolean postFailed = false; 
    try { 
     HttpResponse response = client.execute(post); 
     Log.v(TAG,response.getStatusLine().toString()); 
     if(response.getStatusLine().toString().indexOf("200")!=-1){ 
      HttpEntity httpEntity = response.getEntity(); 
      InputStream is = httpEntity.getContent(); 
      JSONParser parseJSON = new JSONParser(); 
      JSONObject JO = parseJSON.getJSONObj(is); 
      . 
      . 
      . 

      } 
      is.close(); 

     }else 
      postFailed = true; 

    } catch (ClientProtocolException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     postFailed = true; 
    } catch (UnsupportedEncodingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     postFailed = true; 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     postFailed = true; 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     postFailed = true; 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     postFailed = true; 
    } 

msgObject 모든 예상되는 키 값 쌍을 보유 입력 된 JSONObject이다 :

은 다음 POST 요청을 JSON 객체를 인코딩하고 실행하는데 사용되는 로이드 자바 코드이다.

이상한 부분은 대부분 특정 모바일 클라이언트 (간헐적으로 발생하는 문제)입니다.이 문제를 해결하는 방법에 대한 제안이 있으면 알려 주시기 바랍니다. 감사!

+0

당신에게 JSON은 "USER_ID"의 키를 가진 아이가 요청 확신

Content-Type: application/json; charset=utf-8 

희망 : 콘텐츠 형식뿐만 아니라 인코딩 때문에이 같은 헤더 결과? – kupsef

+0

더 많은 코드를 붙여 넣을 수 있습니까? 확인해야 할 2 가지 사항이 있으며 이전 요청의 응답을 완전히 소비해야하며 연결을 올바르게 해제해야합니다. –

+0

@kupsef, 나는 json이 대부분의 모바일 클라이언트와 완벽하게 작동하기 때문에 'user_id'키를 가진 아이가 있다는 것은 확실합니다. 또한, 내가 키를 검색하는 순서를 바꿨는지 확인하려면 아무런 효과가 없습니다. – aadharjain

답변

4

Flask에 JSON의 올바른 콘텐츠 형식이 설정되어 있는지를 나타내는 가장 좋은 방법은 is_json 함수입니다. 당신이 어떤 이유로이 방법을 사용하지 않으 경우에도 여기에 다음과 같은

if "application/json" in request.headers["Content-Type"]: 

문제 같은 경우 성명을 발표해야한다, 거기에 고객의 대부분은 단지 응용 프로그램/JSON을 두지 않는다는 것입니다 이 지금 일을 지 웁니다 :

+0

감사합니다! 확인 할게 ! – geekoraul

+0

이봐 요,이게 속임수 였나요? – akalipetis

관련 문제