有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何从Android调用RESTful web服务?

我使用Jersey框架和Java在Netbean IDE中编写了一个REST web服务

对于用户需要提供用户名和密码的每个请求,我知道这种身份验证不是最佳做法(使用类似于:curl -u username:password -X PUT http://localhsot:8080/user的curl命令)

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

我该怎么做

我有一个Android类,它使用DefaultHttpClientCredentialUsernameAndPassword,但当我在Eclipse中运行它时,有时会出现运行时异常或SDK异常


共 (3) 个答案

  1. # 1 楼答案

    最近发现第三方库-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序列化和反序列化。您也可以自定义序列化和反序列化

    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();
    
  2. # 2 楼答案

    使用Spring for Android和RestTemplate 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");
    
  3. # 3 楼答案

    我使用OkHttpClient调用restful web服务。这很简单

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