1

Springs resttemplace と Apache 共通 HTTP クライアントを使用してリクエストを行う Android クライアント。

私は、ユーザー情報文字列を含む http ヘッダー文字列「ERROR」で 401 エラーを返すことがあるサーバーに対して作業しています。文字列は言語に依存するため、スカンジナビア文字などを含む場合があります。

Firefox RESTclient プラグインで調べた場合と同様に、IOS アプリでも文字列は問題ないように見えます。

ただし、私のAndroidアプリでは、文字を正しく出力することはできません。誰かがデータを正しく出力する方法を考えていただければ幸いです。

サーバーは content-type UTF-8 を送信し、取得しようとするパラメーターを設定する httpservletresponse で通常の .setHeader() を送信します。

Androidクライアントでの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().setSoTimeout(prefs.getServerTimeout());
    httpClient.getParams().setConnectionManagerTimeout(3000);
    httpClient.getParams().setContentCharset("utf-8");
    httpClient.getParams().setCredentialCharset(prefs.getCredentialsEncoding());
    httpClient.getParams().setHttpElementCharset("utf-8");
    httpClient.getParams().setUriCharset("utf-8");
    CommonsClientHttpRequestFactory requestFactory = new CommonsClientHttpRequestFactory(httpClient);
    requestFactory.setReadTimeout(prefs.getServerTimeout());
    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);

    // Set our specific error handler
    restTemplate.setErrorHandler(new MyErrorHandler());

これは私の http 応答であり、Firefox で同じ要求を実行した場合に restclient からコピーされます。

Status Code: 401 Unauthorized
Content-Length: 954
Content-Type: text/html;charset=utf-8
Date: Sat, 19 Jan 2013 23:53:10 GMT
ERROR: För att <contents cut out but as you see Scandinavian char looks fine here >
Server: Apache-Coyote/1.1
WWW-Authenticate: Basic realm="rest"
4

2 に答える 2

0

HTTP ヘッダーは ASCII (古い仕様では Latin-1) を使用します。他のエンコーディングをヘッダーに入れると、機能する場合と機能しない場合があります。

于 2013-01-20T09:52:19.327 に答える
0

Response Content-Type は text/html のようです。以下のようにリクエストヘッダーに Content-Type と charset を設定してみましたか?ここのドキュメントに従って

text/html、text/plain などのテキスト タイプの HTTP で送信されるドキュメントは、HTTP ヘッダーで charset パラメータを送信して、ドキュメントの文字エンコーディングを指定できます。

LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
headers.set("Content-Type", "text/html;charset=utf-8");
HttpEntity request = new HttpEntity(null, headers);
ResponseEntity<Person> response = template.exchange(url,
                HttpMethod.GET, request, Person.class);
于 2013-02-18T04:04:31.743 に答える