2012-02-02 25 views
0

[OK]をJSONとAndroidのクライアントから仕事なので、stackoverflowので尋ねるに過ぎしようとしたすべてをIVEに文字エンコーディングを取得できませんAndroidは、httpclientとresttemplateを使用してサーバー側のSpringコントローラに接続します。すべての私のスウェーデンの文字はは、私はからいくつかのhttpのparamsでREST呼び出しを実行しようとしている...</p> <p>をresttemplateと

はHTTPClientのとresttemplateコードを設定... 'の\ u001A' としてサーバに終わる:

HttpClient httpClient = new HttpClient(); 

Credentials defaultcreds = new UsernamePasswordCredentials(msisdn, password); 
httpClient.getState().setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM), defaultcreds); 

//httpClient.getParams().setContentCharset(prefs.()); 
httpClient.getParams().setCredentialCharset(prefs.getCredentialsEncoding()); 

CommonsClientHttpRequestFactory requestFactory = new CommonsClientHttpRequestFactory(httpClient); 

RestTemplate restTemplate = new RestTemplate(requestFactory); 

// Add message converters 
List<HttpMessageConverter<?>> mc = restTemplate.getMessageConverters(); 
MappingJacksonHttpMessageConverter json = new MappingJacksonHttpMessageConverter(); 

List<MediaType> supportedMediaTypes = new ArrayList<MediaType>(); 
supportedMediaTypes.add(MediaType.APPLICATION_JSON); 
json.setSupportedMediaTypes(supportedMediaTypes); 
mc.add(json); 
restTemplate.setMessageConverters(mc); 

return restTemplate; 

私はその後、私のパラメータでhttpentityを準備:

HttpHeaders headers = new HttpHeaders(); 
headers.setContentType(MediaType.APPLICATION_JSON); 
headers.add("myparam", "" + "å"); 
HttpEntity<String> entity = new HttpEntity<String>(headers); 

私は最終的にREST呼び出しますサーバー上で

ResponseEntity<UserStatusTO> response = rest.exchange(url, HttpMethod.GET, entity, 
      MyResponseClass.class); 

を、私はジャクソンデシリアライザを持っていると私スプリングコントローラメソッドは次のようになります。

@RequestMapping(method = RequestMethod.GET, value = "/event/out", headers = "Accept=application/json", produces = {"application/xml;charset=UTF-8", "application/json;charset=UTF-8"}) 
public 
@ResponseBody 
UserStatusTO out(Authentication auth, @RequestHeader(value="myparam", required = false) String myparam) { 

すべての特殊文字は\ u001aとなります!私は手作業でクライアントとサーバー側の文字列を再エンコードして、何も処理していない。私は httpClient.getParams()を使っていろいろ試してみました。setContentCharset(); httpClient.getParams()。setUriCharset();

私が知る限り、何も働いていません。

私はアイデアがありません!誰かが何か入力を持っているならば、私はずっと義務づけられています。ありがとう!

+0

あなたが詰め込むている「MYPARAM」ヘッダを除きå、ä:sとö:s? – Jens

+0

スウェーデン語の文字を持つパラメータは1つだけです。私は私の例を簡略化して読みやすくしましたが、私のアプリでは、ユーザーが私がサーバーに送信しようとしているメモを入力できるフィールドがあります...しかし、私が "å"を持っている場所は私のコードでは、テキストフィールドのテキストを入れます – Mathias

答えて

1

これは、あなたがこの簡単なテストでテストすることができますよう、ApacheのHTTPクライアントからサーバ側の問題ヘッダーになり喜んで出力Latin-1の文字のように聞こえる:

HttpGet get = new HttpGet("http://www.riksdagen.se"); 
get.addHeader("SwedishHeader", "Mona Sahlin är ett nötdjur"); 

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
SessionOutputBufferImpl buffer = new SessionOutputBufferImpl(out, get.getParams()); 
HttpRequestWriter writer = new HttpRequestWriter(buffer, BasicLineFormatter.DEFAULT, get.getParams()); 

writer.write(get); 
buffer.flush(); 
System.out.println(out.toString("ISO-8859-1")); 

SessionOutputBufferImplがに少しハックですAbstractSessionOutputBufferを使用

class SessionOutputBufferImpl extends AbstractSessionOutputBuffer { 
    SessionOutputBufferImpl(OutputStream out, HttpParams params) { 
     init(out, 1024, params); 
    } 
} 
あなたはおそらくあなたのサーバーのバックエンドに集中すべきである

- あなたは何を使用していますか?それが「固定」の場合は、RFC 2407に従ってヘッダーをフォーマットすることを検討してください。一部のサーバーはサポートしていますが、他は悲惨に失敗します。

+0

申し訳ありませんが、私はそれがサーバーではないことを確認できます。私は、同じ機能を持つ私のIOSアプリケーションを更新する日を過ごしました。テキストは正常にエンコードされ、正しくエンコードされ、すべての文字がデータベース内で正常に見えます。 – Mathias

+0

サーバー入力をwiresharkedしてエンコードの違いをチェックしましたか? – Jens

4

私は同様の問題を持っていたし、私が代わりにMediaType.APPLICATION_JSONを使用する手動で設定し、適切なコンテンツ・タイプと文字を設定することで、それを修正:

HttpHeaders headers = new HttpHeaders(); 
Charset utf8 = Charset.forName("UTF-8"); 
MediaType mediaType = new MediaType("application", "json", utf8); 
headers.setContentType(mediaType); 
関連する問題

 関連する問題