如何从Android调用RESTful Web服务?

我使用Jersey Framework和Java在Netbean IDE中编写了一个REST Web服务。

对于用户需要提供用户名和密码的每个请求,我知道这个身份validation不是最佳实践(使用curl命令,如: curl -u username:password -X PUT http://localhsot:8080/user ) 。

现在我想从Android类调用REST Web服务。

我应该怎么做?

我有一个Android类使用DefaultHttpClientCredentialUsernameAndPassword ,但是当我在Eclipse中运行它,有时我得到一个运行时exception或SDKexception。

这是一个示例restclient类

 public class RestClient { public enum RequestMethod { GET, POST } public int responseCode=0; public String message; public String response; public void Execute(RequestMethod method,String url,ArrayList<NameValuePair> headers,ArrayList<NameValuePair> params) throws Exception { switch (method) { case GET: { // add parameters String combinedParams = ""; if (params!=null) { combinedParams += "?"; for (NameValuePair p : params) { String paramString = p.getName() + "=" + URLEncoder.encode(p.getValue(),"UTF-8"); if (combinedParams.length() > 1) combinedParams += "&" + paramString; else combinedParams += paramString; } } HttpGet request = new HttpGet(url + combinedParams); // add headers if (headers!=null) { headers=addCommonHeaderField(headers); for (NameValuePair h : headers) request.addHeader(h.getName(), h.getValue()); } executeRequest(request, url); break; } case POST: { HttpPost request = new HttpPost(url); // add headers if (headers!=null) { headers=addCommonHeaderField(headers); for (NameValuePair h : headers) request.addHeader(h.getName(), h.getValue()); } if (params!=null) request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); executeRequest(request, url); break; } } } private ArrayList<NameValuePair> addCommonHeaderField(ArrayList<NameValuePair> _header) { _header.add(new BasicNameValuePair("Content-Type","application/x-www-form-urlencoded")); return _header; } private void executeRequest(HttpUriRequest request, String url) { HttpClient client = new DefaultHttpClient(); HttpResponse httpResponse; try { httpResponse = client.execute(request); responseCode = httpResponse.getStatusLine().getStatusCode(); message = httpResponse.getStatusLine().getReasonPhrase(); HttpEntity entity = httpResponse.getEntity(); if (entity != null) { InputStream instream = entity.getContent(); response = convertStreamToString(instream); instream.close(); } } catch (Exception e) { } } private static String convertStreamToString(InputStream is) { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); } catch (IOException e) { } return sb.toString(); } } 

最近发现第三方库 – Square Retrofit可以很好地完成这项工作。


定义REST端点

 public interface GitHubService { @GET("/users/{user}/repos") List<Repo> listRepos(@Path("user") String user,Callback<List<User>> cb); } 

获得具体的服务

 RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://api.github.com") .build(); GitHubService service = restAdapter.create(GitHubService.class); 

调用REST端点

 List<Repo> repos = service.listRepos("octocat",new Callback<List<User>>() { @Override public void failure(final RetrofitError error) { android.util.Log.i("example", "Error, body: " + error.getBody().toString()); } @Override public void success(List<User> users, Response response) { // Do something with the List of Users object returned // you may populate your adapter here } }); 

该库处理json序列化和deserailization为您。 您也可以自定义序列化和反序列化。

 Gson gson = new GsonBuilder() .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) .registerTypeAdapter(Date.class, new DateTypeAdapter()) .create(); RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://api.github.com") .setConverter(new GsonConverter(gson)) .build(); 

我为我的android使用这个REST客户端 。 这看起来很酷。 卢克的工作很好。

http://lukencode.com/2010/04/27/calling-web-services-in-android-using-httpclient/

停下来,不pipe你在做什么! 🙂

RESTful客户端作为服务来实现 ,并将密集的networking东西委托给独立于活动的组件:SERVICE。

观看这个有洞察力的videohttp://www.youtube.com/watch?v=xHXn3Kg2IQE,Virgil Dobjanschi正在解释他对这个挑战的方法。

使用Spring和RestTemplate进行Android https://spring.io/guides/gs/consuming-rest-android/

 // The connection URL String url = "https://ajax.googleapis.com/ajax/" + "services/search/web?v=1.0&q={query}"; // Create a new RestTemplate instance RestTemplate restTemplate = new RestTemplate(); // Add the String message converter restTemplate.getMessageConverters().add(new StringHttpMessageConverter()); // Make the HTTP GET request, marshaling the response to a String String result = restTemplate.getForObject(url, String.class, "Android"); 

我使用OkHttpClient来调用宁静的Web服务。 这很简单。

 OkHttpClient httpClient = new OkHttpClient(); Request request = new Request.Builder() .url(url) .build(); Response response = httpClient.newCall(request).execute(); String body = response.body().string() 

什么后端? 如果是JAVA,那么可以使用REST和Java(JAX-RS)使用Jersey。

在Android端,你可以使用这个简单的RestClient来处理这个REST服务。

对于JSON < – >两侧的对象映射(Android,Java后端),您可以使用GSON。

也许是迟到了,也许你已经使用过,但有另一个叫做ksoap ,它非常惊人..它还包括超时,可以有效地parsing任何基于SOAP的Web服务。 我也做了一些修改,以适应我的parsing..查找它

按照以下步骤在Android中使用RestFul。

步骤1

创build一个android空白项目。

第2步

需要互联网访问权限。 在AndroidManifest.xml文件中写下面的代码。

  <uses-permission android:name="android.permission.INTERNET"> </uses-permission> 

第三步:

需要在另一台服务器或同一台机器上运行的RestFulurl。

步骤4

制作一个RestFul客户端,它将扩展AsyncTask。 请参阅RestFulPost.java。

第五步:

为RestFull Request和Response创buildDTO类。

RestFulPost.java

 package javaant.com.consuming_restful.restclient; import android.app.ProgressDialog; import android.content.Context; import android.os.AsyncTask; import android.util.Log; import com.google.gson.Gson; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import java.util.Map; import javaant.com.consuming_restful.util.Util; /** * Created by Nirmal Dhara on 29-10-2015. */ public class RestFulPost extends AsyncTask<map, void,="" string=""> { RestFulResult restFulResult = null; ProgressDialog Asycdialog; String msg; String task; public RestFulPost(RestFulResult restFulResult, Context context, String msg,String task) { this.restFulResult = restFulResult; this.task=task; this.msg = msg; Asycdialog = new ProgressDialog(context); } @Override protected String doInBackground(Map... params) { String responseStr = null; Object dataMap = null; HttpPost httpost = new HttpPost(params[0].get("url").toString()); try { dataMap = (Object) params[0].get("data"); Gson gson = new Gson(); Log.d("data map", "data map------" + gson.toJson(dataMap)); httpost.setEntity(new StringEntity(gson.toJson(dataMap))); httpost.setHeader("Accept", "application/json"); httpost.setHeader("Content-type", "application/json"); DefaultHttpClient httpclient= Util.getClient(); HttpResponse response = httpclient.execute(httpost); int statusCode = response.getStatusLine().getStatusCode(); Log.d("resonse code", "----------------" + statusCode); if (statusCode == 200) responseStr = EntityUtils.toString(response.getEntity()); if (statusCode == 404) { responseStr = "{\n" + "\"status\":\"fail\",\n" + " \"data\":{\n" + "\"ValidUser\":\"Service not available\",\n" + "\"code\":\"404\"\n" + "}\n" + "}"; } } catch (Exception e) { e.printStackTrace(); } return responseStr; } @Override protected void onPreExecute() { Asycdialog.setMessage(msg); //show dialog Asycdialog.show(); super.onPreExecute(); } @Override protected void onPostExecute(String s) { Asycdialog.dismiss(); restFulResult.onResfulResponse(s,task); } } 

有关更多详细信息和完整代码,请访问http://javaant.com/consume-a-restful-webservice-in-android/#.VwzbipN96Hs

这是我为简单的Web服务调用创build的库,

你可以通过添加一行gradle依赖关系来使用它 –

 compile 'com.scantity.ScHttpLibrary:ScHttpLibrary:1.0.0' 

这里是使用的演示。

https://github.com/vishalchhodwani1992/httpLibrary