我的Android进阶之旅------>Android发送GET和POST以及HttpClient发送POST请求给服务器响应

简介: 效果如下图所示:   布局main.xml   string.xml Hello World, MainActivity! 资讯管理 标题 时长...

效果如下图所示:

 

布局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;
	}

}


 

 


 

相关文章
|
5月前
|
Java Android开发 UED
🧠Android多线程与异步编程实战!告别卡顿,让应用响应如丝般顺滑!🧵
【7月更文挑战第28天】在Android开发中,确保UI流畅性至关重要。多线程与异步编程技术可将耗时操作移至后台,避免阻塞主线程。我们通常采用`Thread`类、`Handler`与`Looper`、`AsyncTask`及`ExecutorService`等进行多线程编程。
64 2
|
4月前
|
存储 安全 Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
【8月更文挑战第13天】随着Android系统的更新,权限管理变得至关重要。尤其从Android 6.0起,引入了动态权限请求,增强了用户隐私保护并要求开发者实现更精细的权限控制。本文采用问答形式,深入探讨动态权限请求机制与最佳实践,并提供示例代码。首先解释了动态权限的概念及其重要性;接着详述实现步骤:定义、检查、请求权限及处理结果;最后总结了六大最佳实践,包括适时请求、解释原因、提供替代方案、妥善处理拒绝情况、适应权限变更及兼容旧版系统,帮助开发者打造安全易用的应用。
86 0
|
3月前
|
Java Android开发 UED
🧠Android多线程与异步编程实战!告别卡顿,让应用响应如丝般顺滑!🧵
在Android开发中,为应对复杂应用场景和繁重计算任务,多线程与异步编程成为保证UI流畅性的关键。本文将介绍Android中的多线程基础,包括Thread、Handler、Looper、AsyncTask及ExecutorService等,并通过示例代码展示其实用性。AsyncTask适用于简单后台操作,而ExecutorService则能更好地管理复杂并发任务。合理运用这些技术,可显著提升应用性能和用户体验,避免内存泄漏和线程安全问题,确保UI更新顺畅。
130 5
|
3月前
|
存储 API Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
随着Android系统的更新,权限管理成为应用开发的关键。尤其在Android 6.0(API 级别 23)后,动态权限请求机制的引入提升了用户隐私保护,要求开发者进行更精细的权限管理。
79 2
|
4月前
|
Java Android开发
全志 Android 11:实现响应全局按键
本文介绍了在全志平台Android 11上实现响应全局按键的方法,通过修改`TvWindowManager.java`来全局拦截特定的热键事件,并在`FocusActivity`中处理这些事件以启动调焦界面和控制步进电机调整焦距。
46 2
|
4月前
|
XML Android开发 UED
"掌握安卓开发新境界:深度解析AndroidManifest.xml中的Intent-filter配置,让你的App轻松响应scheme_url,开启无限交互可能!"
【8月更文挑战第2天】在安卓开发中,scheme_url 通过在`AndroidManifest.xml`中配置`Intent-filter`,使应用能响应特定URL启动或执行操作。基本配置下,应用可通过定义特定URL模式的`Intent-filter`响应相应链接。
125 12
|
4月前
|
JSON Android开发 数据格式
Android项目架构设计问题之实现交互响应的结构化处理如何解决
Android项目架构设计问题之实现交互响应的结构化处理如何解决
21 0
|
5月前
|
消息中间件 调度 Android开发
Android经典面试题之View的post方法和Handler的post方法有什么区别?
本文对比了Android开发中`View.post`与`Handler.post`的使用。`View.post`将任务加入视图关联的消息队列,在视图布局后执行,适合视图操作。`Handler.post`更通用,可调度至特定Handler的线程,不仅限于视图任务。选择方法取决于具体需求和上下文。
63 0
|
6月前
|
JSON 编解码 Apache
Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
71 1
|
6月前
|
存储 算法 Java
Android 进阶——代码插桩必知必会&ASM7字节码操作
Android 进阶——代码插桩必知必会&ASM7字节码操作
307 0