java - 如何从 Android 调用 RESTful Web 服务?

标签 java android web-services rest authorization

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

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

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

我该怎么做?

我有一个使用 DefaultHttpClientCredentialUsernameAndPassword 的 Android 类,但是当我在 Eclipse 中运行它时,有时会遇到运行时异常或 SDK 异常。

最佳答案

这是一个示例 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();
    }
}

关于java - 如何从 Android 调用 RESTful Web 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6047194/

相关文章:

java - 在 linux 中编辑 .jar 文件

java - 如何将地理围栏存储在磁盘中? (安卓)

wcf - 为什么 WCF 服务使用接口(interface)作为服务契约而不是抽象类?

java - 如何从java动态Web应用程序访问资源文件

android - 以编程方式删除的文件仍然显示在 Windows 资源管理器中

json - download.file 错误不支持的 URL 方案

java - 返回对象值方法无法正常工作

java - 从 p+q 和 pq 计算 p^n + q^n

python 语法中的 Java 主类

java - 发现彩信大小限制?