4

我开始在我的 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();

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

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

4

3 回答 3

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

然后在您的 BeginAuthorization(查看视图)中调用它:

new LoginTask().execute(URL);

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

于 2012-12-17T18:26:44.637 回答
2

文档中

NetworkOnMainThreadException

当应用程序尝试在其主线程上执行网络操作时引发的异常。

您应该创建一个线程并从那里进行网络连接。可能是您正在寻找的。

于 2012-12-17T17:11:02.633 回答
1

从 android>= 4.0 网络调用必须经过 asynctack

于 2012-12-17T17:05:24.420 回答