Android發送GET和POST以及HttpClient發送POST請求給服務器響應
效果如下圖所示:
布局main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/title" /> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/title" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:numeric="integer" android:text="@string/timelength" /> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/timelength" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/button" android:onClick="save" android:id="@+id/button"/> </LinearLayout>
string.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, MainActivity!</string> <string name="app_name">資訊管理</string> <string name="title">標題</string> <string name="timelength">時長</string> <string name="button">保存</string> <string name="success">保存成功</string> <string name="fail">保存失敗</string> <string name="error">服務器響應錯誤</string> </resources>
package cn.roco.manage; import cn.roco.manage.service.NewsService; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private EditText titleText; private EditText lengthText; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); titleText = (EditText) this.findViewById(R.id.title); lengthText = (EditText) this.findViewById(R.id.timelength); } public void save(View v) { String title = titleText.getText().toString(); String length = lengthText.getText().toString(); String path = "http://192.168.1.100:8080/Hello/ManageServlet"; boolean result; try { // result = NewsService.save(path, title, length, NewsService.GET); //發送GET請求 // result = NewsService.save(path, title, length, NewsService.POST); //發送POST請求 result = NewsService.save(path, title, length, NewsService.HttpClientPost); //通過HttpClient框架發送POST請求 if (result) { Toast.makeText(getApplicationContext(), R.string.success, 1) .show(); } else { Toast.makeText(getApplicationContext(), R.string.fail, 1) .show(); } } catch (Exception e) { Toast.makeText(getApplicationContext(), e.getMessage(), 1).show(); Toast.makeText(getApplicationContext(), R.string.error, 1).show(); } } }
package cn.roco.manage.service; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; public class NewsService { public static final int POST = 1; public static final int GET = 2; public static final int HttpClientPost = 3; /** * 保存數據 * * @param title * 標題 * @param length * 時長 * @param flag * true則使用POST請求 false使用GET請求 * @return 是否保存成功 * @throws Exception */ public static boolean save(String path, String title, String timelength, int flag) throws Exception { Map<String, String> params = new HashMap<String, String>(); params.put("title", title); params.put("timelength", timelength); switch (flag) { case POST: return sendPOSTRequest(path, params, "UTF-8"); case GET: return sendGETRequest(path, params, "UTF-8"); case HttpClientPost: return sendHttpClientPOSTRequest(path, params, "UTF-8"); } return false; } /** * 通過HttpClient框架發送POST請求 * HttpClient該框架已經集成在android開發包中 * 個人認為此框架封裝了很多的工具類,性能比不上自己手寫的下面兩個方法 * 但是該方法可以提高程序員的開發速度,降低開發難度 * @param path * 請求路徑 * @param params * 請求參數 * @param encoding * 編碼 * @return 請求是否成功 * @throws Exception */ private static boolean sendHttpClientPOSTRequest(String path, Map<String, String> params, String encoding) throws Exception { List<NameValuePair> pairs = new ArrayList<NameValuePair>();// 存放請求參數 if (params != null && !params.isEmpty()) { for (Map.Entry<String, String> entry : params.entrySet()) { //BasicNameValuePair實現了NameValuePair接口 pairs.add(new BasicNameValuePair(entry.getKey(), entry .getValue())); } } UrlEncodedFormEntity entity = new UrlEncodedFormEntity(pairs, encoding); //pairs:請求參數 encoding:編碼方式 HttpPost httpPost = new HttpPost(path); //path:請求路徑 httpPost.setEntity(entity); DefaultHttpClient client = new DefaultHttpClient(); //相當于瀏覽器 HttpResponse response = client.execute(httpPost); //相當于執行POST請求 //取得狀態行中的狀態碼 if (response.getStatusLine().getStatusCode() == 200) { return true; } return false; } /** * 發送POST請求 * * @param path * 請求路徑 * @param params * 請求參數 * @param encoding * 編碼 * @return 請求是否成功 * @throws Exception */ private static boolean sendPOSTRequest(String path, Map<String, String> params, String encoding) throws Exception { StringBuilder data = new StringBuilder(); if (params != null && !params.isEmpty()) { for (Map.Entry<String, String> entry : params.entrySet()) { data.append(entry.getKey()).append("="); data.append(URLEncoder.encode(entry.getValue(), encoding));// 編碼 data.append('&'); } data.deleteCharAt(data.length() - 1); } byte[] entity = data.toString().getBytes(); // 得到實體數據 HttpURLConnection connection = (HttpURLConnection) new URL(path) .openConnection(); connection.setConnectTimeout(5000); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); connection.setRequestProperty("Content-Length", String.valueOf(entity.length)); connection.setDoOutput(true);// 允許對外輸出數據 OutputStream outputStream = connection.getOutputStream(); outputStream.write(entity); if (connection.getResponseCode() == 200) { return true; } return false; } /** * 發送GET請求 * * @param path * 請求路徑 * @param params * 請求參數 * @param encoding * 編碼 * @return 請求是否成功 * @throws Exception */ private static boolean sendGETRequest(String path, Map<String, String> params, String encoding) throws Exception { StringBuilder url = new StringBuilder(path); url.append("?"); for (Map.Entry<String, String> entry : params.entrySet()) { url.append(entry.getKey()).append("="); url.append(URLEncoder.encode(entry.getValue(), encoding));// 編碼 url.append('&'); } url.deleteCharAt(url.length() - 1); HttpURLConnection connection = (HttpURLConnection) new URL( url.toString()).openConnection(); connection.setConnectTimeout(5000); connection.setRequestMethod("GET"); if (connection.getResponseCode() == 200) { return true; } return false; } }
在服務器上寫一個ManageServlet用來處理POST和GET請求
package cn.roco.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ManageServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String title = request.getParameter("title"); String timelength = request.getParameter("timelength"); System.out.println("視頻名稱:" + title); System.out.println("視頻時長:" + timelength); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
為了處理編碼問題 寫了過濾器
package cn.roco.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; public class EncodingFilter implements Filter { public void destroy() { System.out.println("過濾完成"); } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; if ("GET".equals(request.getMethod())) { EncodingHttpServletRequest wrapper=new EncodingHttpServletRequest(request); chain.doFilter(wrapper, resp); }else{ req.setCharacterEncoding("UTF-8"); chain.doFilter(req, resp); } } public void init(FilterConfig fConfig) throws ServletException { System.out.println("開始過濾"); } }
package cn.roco.filter; import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; /** * 包裝 HttpServletRequest對象 */ public class EncodingHttpServletRequest extends HttpServletRequestWrapper { private HttpServletRequest request; public EncodingHttpServletRequest(HttpServletRequest request) { super(request); this.request = request; } @Override public String getParameter(String name) { String value = request.getParameter(name); if (value != null && !("".equals(value))) { try { value=new String(value.getBytes("ISO8859-1"),"UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } return value; } }
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!