Android应用程序中Spring RestTemplate的奇怪问题

Mai*_*r00 4 java rest post spring android

我开始在我的android客户端应用程序中使用Spring Framework的RESTful api.但是当我尝试通过postForObject/postForEntity方法执行HTTP请求时遇到了问题.这是我的代码:

public String _URL = "https://someservice/mobile/login";
public void  BeginAuthorization(View view)
{     
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.setContentType(MediaType.APPLICATION_JSON);
         HttpEntity<String> _entity = new HttpEntity<String>(requestHeaders);
        RestTemplate templ = new RestTemplate();
        templ.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
        templ.getMessageConverters().add(new MappingJacksonHttpMessageConverter());
        ResponseEntity<String> _response = templ.postForEntity(_URL,_entity,String.class); //HERE APP CRASHES
        String _body = _response.getBody();
Run Code Online (Sandbox Code Playgroud)

那么问题是我做错了什么?如何解决这个问题?可能还有其他办法吗?

我真的需要帮助.提前致谢!

Ole*_*rov 5

我认为您的目标是Android 4.0-4.2应用.然后,您必须在后台执行所有操作,而不是主(UI)线程.正如我所见,您正在执行授权过程.这是一个简短的操作,所以你最好使用AsyncTask它.以下是androidDevelopers上的指南:

http://developer.android.com/reference/android/os/AsyncTask.html

你应该以这种方式覆盖doInBackground(Params ...):

class LoginTask extends AsyncTask<String,Void,Void>
{
    @Override
    protected Void doInBackground(String... params) {
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.setContentType(MediaType.APPLICATION_JSON); 
        HttpEntity<String> _entity = new HttpEntity<String>(requestHeaders);
        RestTemplate templ = new RestTemplate();
        templ.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
        templ.getMessageConverters().add(new MappingJacksonHttpMessageConverter());
        ResponseEntity<String> _response = templ.postForEntity(params[0],_entity,null) //null here in order there wasn't http converter errors because response type String and [text/html] for JSON are not compatible;
        String _body =  _response.getBody();
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在BeginAuthorization(View视图)中调用它:

new LoginTask().execute(URL);
Run Code Online (Sandbox Code Playgroud)

PS另外,如果您编写Java,请使用正确的命名约定._response请写下来而不是这个response.