如何从 Android 调用 RESTful Web 服务? [英] How to call a RESTful web service from Android?
问题描述
我使用 Jersey 框架和 Java 在 Netbean IDE 中编写了一个 REST Web 服务.
I have written a REST web service in Netbean IDE using Jersey Framework and Java.
对于用户需要提供用户名和密码的每个请求,我知道这种身份验证不是最佳实践(使用 curl 命令,例如:curl -u username:password -X PUT http://localhsot:8080/user
).
For every request the user needs to provide a username and a password, I know that this authentication is not a best practice (using a curl command like: curl -u username:password -X PUT http://localhsot:8080/user
).
现在我想从 Android 类调用 REST Web 服务.
Now I want to call a REST web service from an Android Class.
我该怎么做?
我有一个使用 DefaultHttpClient
和 CredentialUsernameAndPassword
的 Android 类,但是当我在 Eclipse 中运行它时,有时会出现运行时异常或 SDK 异常.
I have an Android Class which uses DefaultHttpClient
and CredentialUsernameAndPassword
, but when I run it in Eclipse, sometimes I get a runtime exception or SDK exception.
推荐答案
这是一个示例 restclient 类
This is an sample restclient class
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 + "
");
}
is.close();
}
catch (IOException e)
{ }
return sb.toString();
}
}
这篇关于如何从 Android 调用 RESTful Web 服务?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!