0

わかりましたので、スタックオーバーフローで質問する以外はすべて試しました...

httpclient と resttemplate を使用して、Android からいくつかの http パラメータを使用して REST 呼び出しをサーバー側の Spring コントローラーに実行しようとしています。私のすべてのスウェーデン語の文字は、サーバー上で「\u001A」として終了します...

httpclient と resttemplate コードのセットアップ:

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);

私は最終的に残りの呼び出しを行います:

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();

私が知る限り、どれも機能しませんでした。

私はアイデアがありません!誰かが何か意見を持っていれば、私は大いに感謝しています。ありがとう!

4

2 に答える 2

4

同様の問題があり、MediaType.APPLICATION_JSON を使用する代わりに、適切なコンテンツ タイプと文字セットを手動で設定して修正しました。

HttpHeaders headers = new HttpHeaders();
Charset utf8 = Charset.forName("UTF-8");
MediaType mediaType = new MediaType("application", "json", utf8);
headers.setContentType(mediaType);
于 2012-03-28T12:32:15.283 に答える
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に従ってヘッダーをフォーマットすることを検討する必要があります- 一部のサーバーはサポートしていますが、他のサーバーは惨めに失敗します。

于 2012-02-02T12:20:33.237 に答える