HTTP 클 라 이언 트 POST 방식 중국어 솔 루 션

더 읽 기
그 동안 한 지역 포 털 사이트(alexa 글로벌 랭 킹 1200 정도)에 SSO 통합 을 했 는데 그 중의 하 나 는 웹 서비스 인터페이스 와 클 라 이언 트 이다.우 리 는 REST 방식 을 사용 했다.SOAP 가 아니 라 대체적으로 클 라 이언 트 가 HTTP POST 방식 으로 서버 에 데 이 터 를 제출 했다.예 를 들 어 계 정 동기 화,서버 가 xml 로 돌아 가 클 라 이언 트 에 게 피드백 을 했다.그러나 제출 과정 에서 중국어 문제 가 발생 했 습 니 다.계 정 에 realName 필드 가 중국어 이기 때 문 입 니 다.클 라 이언 트 는 다음 과 같은 몇 가지 가 있 습 니 다.
1.Java HTTP 클 라 이언 트(HttpURLConnection)
2.PHP 클 라 이언 트(curl 라 이브 러 리)
3.ajax 클 라 이언 트(XML HTTP)
4.일반 양식 제출(POST 방식)
…..
위의 네 가지 클 라 이언 트 API 와 demo 를 개발 하 는 것 이 빠 르 니 중국어 솔 루 션 문 제 를 기록 해 보 세 요.
제 가 발표 하고 자 하 는 이 유 는 제 가 있 는 해결 방식 이 자동화 되 고 인 코딩 량 이 가장 적 기 때 문 입 니 다.그리고 저 는 몇 번 도 시도 하지 않 고 어떻게 해 야 하 는 지,어떻게 안 되 는 지,그리고 원인 을 찾 아 냈 습 니 다.
주의:저 는 request 의 중국어 해결 방안 을 설 명 했 을 뿐 이 고 POST 방식 일 뿐 입 니 다.그러나 이것 에 대해 잘 이해 하면 response 의 중국어 도 간단 합 니 다.
처음에 저도 비교적 기계 적 이 고 서버 쪽 servlet 에서 얻 을 수 있 는 매개 변수 값 을 사 용 했 습 니 다.
byte[] b = value.getBytes("ISO-8859-1");
output = new String(b,"UTF-8");

이렇게 하면 문 제 를 해결 할 수 있 고 모두 성 공 했 지만 네 가지 클 라 이언 트 가 보 낸 중국어 에서 encoding 작업 을 해 야 합 니 다.마지막 으로 나 는 이것 이 가장 좋 은 것 이 아니 라 작업량 이 너무 많 기 때문에 재 구성 하기 로 결정 했다.
서버 에 보 내 는 request 를 모두 filter 로 차단 합 니 다.주로 아래 의 이 말 입 니 다.사실 이 방식 은 매우 오래 되 었 기 때문에 언급 할 가치 가 없습니다.doFilter 에서:
request.setCharacterEncoding(encoding); 

오 는 모든 요청(response 얘 기 가 나 오지 않 았 습 니 다)을 지정 한 인 코딩(UTF-8)으로 인 코딩 하 는 것 입 니 다.
filter 를 사용 하면 서버 이식 문 제 를 해결 할 수 있 습 니 다.예 를 들 어 제 가 가장 잘 아 는 Tomcat,resin,WL,WS 등 입 니 다.
나 는 axis(유명한 웹 서비스 SOAP 엔진)에 첨부 된 TCPMonitor 로 보 낸 POST 요청 을 탐지 했다.
Java HTTP 클 라 이언 트(HttpURLConnection):
요청 한 데 이 터 를 key/value 의 value 로 인 코딩 해 야 합 니 다:
URLEncoder.encode(value,"UTF-8")
;
PHP 클 라 이언 트(curl 라 이브 러 리):
위 와 같이 반드시 코드 를 바 꿔 야 합 니 다.
$truename = iconv("GBK", "UTF-8","   ");

왜냐하면 저희 PHP 의 기본 환경 은 중국어 입 니 다.
ajax 클 라 이언 트:
POST 요청 을 보 낼 때 는 직접 중국어 로,자 바스 크 립 트 의 encodeURI()나 escape()를 사용 하지 않 아 도 되 지만,사용 해도 영향 을 주지 않 습 니 다.
why?ajax POST 방식 은 기본적으로 UTF-8 방식 으로 보 내기 때 문 입 니 다.인 코딩 된 중국어,즉%E9%99%88%E5%BF%97%E6%AD%A6 와 같은 정상 적 인 기호 에 대해 서버 는 인 코딩 을 무시 합 니 다.
이 두 함 수 는 중국어 encode 에 대한 결과 가 다 릅 니 다.encodeURI()를 사용 하면 UTF-8 로 인 코딩 되 지만 다른 인 코딩 형식 을 선택 할 수 없습니다.서버 쪽 filter 가 GBK 로 기본 값 을 사용 하면 이렇게 자동 으로 처리 할 수 없습니다.
따라서 ajax 클 라 이언 트 를 사용 할 때 는 신중 해 야 합 니 다.
일반 양식 제출(POST 방식)
문 제 를 자동 으로 해결 하려 면 filter 에서 request 요청 인 코딩 을 UTF-8 로 설정 한 전제 에서 다음 과 같이 추가 하 는 것 이 좋 습 니 다.

charset 이 GBK 라면 서버 엔 드 에 가 는 것 은 어 지 러 운 것 입 니 다.
why?submit 방식 으로 제출 할 때 제출 한 폼 인 코딩 형식(enctype)은:
Content-type:application/x-ww-form-urlencoded,즉 제출 할 때 우리 의 중국 어 는 자동 으로 인 코딩 되 지만 근 거 는 위의 html 명령 입 니 다.이 증 거 는 TCPMonitor 가 차단 한 HTTP 패 킷 에서 볼 수 있다.
위의 방식 과 비교 하면 ajax 방식 은 브 라 우 저가 http 채널 을 만들어 서 중국 어 를 직접 제출 한 것 같 습 니 다.앞에서 소개 한 두 가지 와 같 습 니 다.
서버 쪽 에 서 는 자바 웹 용기 나 응용 서버 가 자동 으로 request 인 자 를 디 코딩 합 니 다.인 코딩 된 문 자 를 원래 모습 으로 복원 합 니 다.
콘 솔 에서 본 것 이 모두 정확 한 중국어 라면 데이터 베 이 스 를 버 리 고 인 코딩 문제 가 있 지만 그것 도 가끔 귀 찮 습 니 다.

좋은 웹페이지 즐겨찾기