我试图通过https将Android应用程序连接到我的休息服务器。
服务器使用jdbcAuthentication运行spring boot和spring security。我很确定问题不是来自服务器端。
在Android应用程序中,我是这样从restTemplate创建一个restClient:
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContextBuilder;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
public class RestClient extends RestTemplate {
public RestClient(String username, String password) {
CloseableHttpClient httpClient = null;
try {
SSLContextBuilder sslContextBuilder = new SSLContextBuilder();
sslContextBuilder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContextBuilder.build());
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(new AuthScope("localhost", 443, AuthScope.ANY_REALM), new UsernamePasswordCredentials(username, password));
httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).setDefaultCredentialsProvider(credsProvider).build();
getMessageConverters().add(new MappingJackson2HttpMessageConverter());
setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
} catch (NoSuchAlgorithmException e) {
Log.e("NoSuchAlgorithmEx", e.getMessage());
} catch (KeyStoreException e) {
Log.e("KeyStoreException", e.getMessage());
} catch (KeyManagementException e) {
Log.e("KeyManagementException", e.getMessage());
}
}
public static <T> T getItem(String url, Class<T> type, String username, String password) {
RestClient restClient = new RestClient(username, password);
return restClient.getForObject(url, type);
}
}
我这样用它:
MyObject myObject= RestClient.getItem(url, MyObject.class,"username","pasword");
如果我在服务器端使用selectUrl上的.permitAll()禁用身份验证,则一切正常。
如果我启用身份验证,Android应用程序无法连接到服务器。 &#34;无法提取响应:没有为响应类型找到合适的HttpMessageConverter&#34;
在android方面我使用
compile 'org.springframework.android:spring-android-rest-template:2.0.0.M1'
compile 'org.apache.httpcomponents:httpclient-android:4.3.5'
我认为问题来自我的httpClient的配置,但我无法看到什么。
如果你们有任何线索......