App與後臺交互,後臺使用的是Jersey RESTful 服務。在APP端使用Android 內部集成的HttpClient接口,無需引入第三方jar包,
import org.apache.http.client.HttpClient;
在網上找到一個歪果人寫Android端的REST類,網上文章引用挺多的。
Calling Web Services in Android using HttpClient
public class RestClient { private ArrayList <NameValuePair> params; private ArrayList <NameValuePair> headers; private String url; private int responseCode; private String message; private String response; public String getResponse() { return response; } public String getErrorMessage() { return message; } public int getResponseCode() { return responseCode; } public RestClient(String url) { this.url = url; params = new ArrayList<NameValuePair>(); headers = new ArrayList<NameValuePair>(); } public void AddParam(String name, String value) { params.add(new BasicNameValuePair(name, value)); } public void AddHeader(String name, String value) { headers.add(new BasicNameValuePair(name, value)); } public void Execute(RequestMethod method) throws Exception { switch(method) { case GET: { //add parameters String combinedParams = ""; if(!params.isEmpty()){ combinedParams += "?"; for(NameValuePair p : params) { String paramString = p.getName() + "=" + URLEncoder.encode(p.getValue(),”UTF-8″); if(combinedParams.length() > 1) { combinedParams += "&" + paramString; // 如何不是添加第一個key-value時 } else { combinedParams += paramString; // 添加第一個key-value } } } HttpGet request = new HttpGet(url + combinedParams); //add headers for(NameValuePair h : headers) { request.addHeader(h.getName(), h.getValue()); } executeRequest(request, url); break; } case POST: { HttpPost request = new HttpPost(url); //add headers for(NameValuePair h : headers) { request.addHeader(h.getName(), h.getValue()); } if(!params.isEmpty()){ request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); } executeRequest(request, url); break; } } } 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); // Closing the input stream will trigger connection release instream.close(); } } catch (ClientProtocolException e) { client.getConnectionManager().shutdown(); e.printStackTrace(); } catch (IOException e) { client.getConnectionManager().shutdown(); e.printStackTrace(); } } 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"); } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); } }
調用實例:
RestClient client = new RestClient(LOGIN_URL); client.AddParam("accountType", "GOOGLE"); client.AddParam("source", "tboda-widgalytics-0.1"); client.AddParam("Email", _username); client.AddParam("Passwd", _password); client.AddParam("service", "analytics"); client.AddHeader("GData-Version", "2"); try { client.Execute(RequestMethod.POST); } catch (Exception e) { e.printStackTrace(); } String response = client.getResponse();
GET 方法沒有問題,但是POST方法就需要考慮了,因爲傳遞內容並不是只有
request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
比如自己的項目中使用的是:request.setEntity(new StringEntity(obj.toString(),HTTP.UTF_8));
這裏的 setEntity 內容是和setHeader 有關係的。
我的項目中應用的兩種:postRequest.addHeader("Content-Type", "multipart/mixed");
post 圖片的header
MultipartEntity reqEntity = new MultipartEntity();
reqEntity.addPart("uploaded", bab);
postRequest.setEntity(reqEntity);
POST json 對象的:header 說明
rest.AddHeaders("Content-Type","application/json;charset=utf8");
Entity這樣設置的:
request.setEntity(new StringEntity(obj.toString(),HTTP.UTF_8));
所以這個類寫的通用型不行。