2012-06-21 4 views
2

잠시 동안 무엇이 잘못되었는지 알아 내려고 노력했습니다. 내 서버 API에 json 본문과 HttpClient.execute 함께 게시물 요청을 만들고있어. 정상적인 와이파이 및 대부분의 3g에서 잘 작동하지만 특히 & T dataplans가있는 휴대 전화에서는 3g이 넘기 때문에 상태 코드 422의 요청을 실행하려고하면 HttpResponseException이 다시 발생합니다. 422에 대한 조사가 있었는데 그 이유는 다음과 같습니다.Android : HttpPost 콘텐츠 유형 헤더 및 본문이 wifi와 3g가 다른 경우

"422 Unprocessable Entity (WebDAV) (RFC 4918), 요청은 형식이 올바르지 만 의미 론적 오류로 인해 처리 할 수 ​​없습니다."

요청이 어떻게 바뀌는 지 알 수 없지만 Wi-Fi 또는 3g에 관계없이 요청을 만들 때 동일한 작업을 수행하고 있습니다. 이 오류의 원인은 무엇입니까?

편집 : 내 서버가 위조 방지 기능을 사용하여 게시물을 잡는 것 같습니다. 끄고 오류가 멈췄지만 API는 통과하지 못했습니다. 조금 더 깊게 파고 서버에서 실제로 수신중인 것을 출력하여 wifi를 켜고 껐다가 비교하여 두 가지 차이점을 발견했습니다. 첫째로, 시체는 3g에서 비어 있었고, 어떻게 든 보냈던 것으로부터 차단 된 것처럼 보입니다. 둘째, 헤더가 전송되는 콘텐츠 유형을 변경했습니다.

wifi : "application/json" att 3g : "text/plain; charset = ISO-8859-1, application/JSON "

내가 기대 해요"이런 내가 설정하고있어 나의 연결 특정 응용 프로그램/JSON "내가의 3G 이상 이동하면 상황이 변화하는 이유

StringEntity se = new StringEntity(json.toString()); 
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); 

어떤 아이디어?

업데이트 : tcpdump를 실행하면 안드로이드에서 보내는 메일이 wifi와 3g 사이에서 똑같은 것처럼 보이므로 내 데이터를 변경하는 공급자 인 것으로 보입니다. HTTPS 이외의 다른 제안 된 전략은 무엇입니까?

+0

서버에서받은 내용 (전화로 보낸 내용과 비교)은 이동 통신사의 프록시를 통해 재 작성 중일 수 있습니다. 당신이 뿌리가 있다면 당신은 tcpdump를 실행하여 무엇을 보내고 있는지를 볼 수 있습니다 (루트가 아닌 방법이지만 매우 까다 롭습니다). https를 사용하면 해결할 수 있습니다. –

답변

7

해결!

기존 코드 :

mPost = new HttpPost(ur); 
    StringEntity se = new StringEntity(json.toString()); 
    se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); 
    mPost.setEntity(se); 

새로운 코드 : 내 게시물의 몸으로 대신 StringEntity의 ByteArrayEntity를 사용하여 같은

mPost = new HttpPost(ur); 
    ByteArrayEntity baEntity = new ByteArrayEntity(json.toString().getBytes("UTF8")); 
    baEntity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); 
    mPost.setEntity(baEntity); 

거의 모습은 3g에서 작동합니다. 왜 이것이 wifi와 3g 사이의 tcpdump가 정확히 StringEntity를 사용하는 동안 똑같이 보였는지는 확실하지 않지만 문제를 해결하여 불평하지는 않습니다.

+0

고맙습니다. 모바일 데이터를 디버깅하는 데 문제가 발생하여 내 생명이 구해졌습니다. –

+0

이것은 나를 위해 일했습니다. –

+0

이것은 저에게도 효과적이었습니다. 고맙습니다 – Nirali