使用HttpURLConnection采用get方式或post方式请求数据

使用URLConnection提交请求:

1.通过调用URL对象openConnection()方法来创建URLConnection对象

2.设置URLConnection的参数和普通的请求属性

3.如果只是发送GET方式请求,使用connet方法建立和远程资源之间的实际连接即可;如果发送POST方式的请求,需要获取URLConnection实例对应的输出流来发送请求参数。

4.远程资源变为可用,程序可以访问远程资的头字段,或通过输入流读取远程资源的数据。

提交数据到服务器端(存在中文乱码):

需求:示范如何向Web站点发送GET请求、POST请求,并从Web站点取的响应。

服务器端

模拟用户登录的Serlvet

public class LoginServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String username =  request.getParameter("username");
		String password = request.getParameter("password");

		System.out.println("姓名="+username);
		System.out.println("密码="+password);

		if("lisi".equals(username) && "123".equals(password)){
			response.getOutputStream().write("success".getBytes());
		}else{
			response.getOutputStream().write("failed".getBytes());

		}
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

在地址栏中输入:

http://localhost:8080/ServerDemo1/servlet/LoginServlet?username=lisi&password=123

页面返回:

页面返回登录成功的信息:success.查看该页面的源文件也只是个:success

需求:从客户端请求数据到服务端,将服务端的信息返回个服务端。

客户端

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <EditText android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入用户名"
        android:id="@+id/et_username"/>
    <EditText android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入密码"
        android:id="@+id/et_password"/>
    <Button android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="GET提交方式"
        android:onClick="doGet"/>
    <Button android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="POST提交方式"
        android:onClick="doPost"/>
</LinearLayout>

工具类:

NetUtil.java

public class NetUtil {
	private static final String TAG = "NetUtil";
	/**
	 * 使用GET的方式登录
	 * @param username
	 * @param password
	 * @return 登录的状态
	 */
	public static String loginOfGet(String username,String password){
		HttpURLConnection conn = null;
		try {
			String data = "username="+username+"&password="+password;
			URL url =  new URL("http://10.3.5.154:8080/ServerDemo1/servlet/LoginServlet?"+data);
			conn = (HttpURLConnection) url.openConnection();

			conn.setRequestMethod("GET");//GET和POST必须全大写
			conn.setConnectTimeout(10000);//连接的超时时间
			conn.setReadTimeout(5000);//读数据的超时时间

			int responseCode = conn.getResponseCode();
			if(responseCode==200){
				//访问成功,通过流取的页面的数据信息
				InputStream is = conn.getInputStream();
				String status = getStringFromInputStream(is);
				return status;
			}else{
				Log.i(TAG, "访问失败:"+responseCode);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			if(conn!=null){
				conn.disconnect();//释放链接
			}
		}
		return null;
	}
	/**
	 * 使用POST提交方式
	 * @param username
	 * @param password
	 * @return
	 */
	public static String loginOfPost(String username, String password) {
		HttpURLConnection conn = null;
		try {
			URL url =  new URL("http://10.3.5.154:8080/ServerDemo1/servlet/LoginServlet");
			conn = (HttpURLConnection) url.openConnection();

			conn.setRequestMethod("GET");//GET和POST必须全大写
			conn.setConnectTimeout(10000);//连接的超时时间
			conn.setReadTimeout(5000);//读数据的超时时间
			conn.setDoOutput(true);//必须设置此方法  允许输出
		//	conn.setRequestProperty("Content-Length", 234);//设置请求消息头  可以设置多个

			//post请求的参数
			String data = "username="+username+"&password="+password;
			OutputStream out = conn.getOutputStream();
			out.write(data.getBytes());
			out.flush();
			out.close();

			int responseCode = conn.getResponseCode();
			if(responseCode==200){
				//访问成功,通过流取的页面的数据信息
				InputStream is = conn.getInputStream();
				String status = getStringFromInputStream(is);
				return status;
			}else{
				Log.i(TAG, "访问失败:"+responseCode);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			if(conn!=null){
				conn.disconnect();//释放链接
			}
		}
		return null;

	}
	/**
	 * 通过字节输入流返回一个字符串信息
	 * @param is
	 * @return
	 * @throws IOException
	 */
	private static String getStringFromInputStream(InputStream is) throws IOException {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		int len=0;
		while((len=is.read(buffer))!=-1){
			baos.write(buffer, 0, len);
		}
		is.close();
		String status = baos.toString();// 把流中的数据转换成字符串, 采用的编码是: utf-8
		baos.close();
		return status;
	}
}

Java代码:

MainActivity.java

public class MainActivity extends Activity {

	private EditText et_username;
	private EditText et_password;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		et_username = (EditText) findViewById(R.id.et_username);
		et_password = (EditText) findViewById(R.id.et_password);
	}
	//GET提交方式
	public void doGet(View view){
		final String username = et_username.getText().toString().trim();
		final String password =  et_password.getText().toString().trim();

		new Thread(new Runnable() {

			@Override
			public void run() {
				//使用GET方式抓取数据
				final String status = NetUtil.loginOfGet(username, password);
				//执行任务在主线程中
				runOnUiThread(new Runnable() {
					@Override
					public void run() {
						//就是在主线程中操作
						Toast.makeText(MainActivity.this, status, 0).show();

					}
				});

			}
		}).start();
	}
	//POST提交方式
	public void doPost(View view){
		final String username = et_username.getText().toString().trim();
		final String password = et_password.getText().toString().trim();
		new Thread(new Runnable() {
			@Override
			public void run() {
				final String status = NetUtil.loginOfPost(username,password);
				runOnUiThread(new Runnable() {
					@Override
					public void run() {
						Toast.makeText(MainActivity.this, status, 0).show();
					}
				});
			}
		}).start();
	}
}

运行效果图:

采用get或者post提交方式

从客户端提交数据到服务器端,将服务器端的信息,返回给了客户端。

      

但是以上代码存在严重的中文乱码问题:

乱码简单分析:

提交数据到服务器端(解决中文乱码)推荐:

明白了产生乱码的原因,这时候我们分析解决乱码的步骤:

(把握住:保证客户端与服务器端采用的编码必须一致)

1.修改客户端代码:

修改NetUtil.java

截图:

修改的代码:

/**
	* URLEncoder.encode(String s, String charsetName)对url中的中文参数进行编码,可以解决乱码
*/
		String data = "username="+URLEncoder.encode(username, "utf-8")+"&password="+URLEncoder.encode(password, "utf-8");
	    URL url =  new URL("http://10.3.5.154:8080/ServerDemo1/servlet/LoginServlet?"+data);
		conn = (HttpURLConnection) url.openConnection();

2.修改服务器端的代码:

修改LoginServlet.java

截图:

修改的代码:

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String username =  request.getParameter("username");//请求过来的参数,是采用的编码是: iso8859-1
		String password = request.getParameter("password");

		//采用iso8859-1的编码对姓名进行逆转,转换成字节数组,再使用utf-8编码对数据进行转换,字符串
		username = new String(username.getBytes("iso8859-1"), "utf-8");
		password = new String(password.getBytes("iso8859-1"), "utf-8");
		System.out.println("姓名="+username);
		System.out.println("密码="+password);

		if("lisi".equals(username) && "123".equals(password)){
			response.getOutputStream().write("登录成功".getBytes("utf-8"));
		}else{
			response.getOutputStream().write("登录失败".getBytes("utf-8"));

		}
	}

3.运行结果(成功解决乱码问题):

完整代码(已解决乱码问题):

服务器端:

public class LoginServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String username =  request.getParameter("username");//请求过来的参数,是采用的编码是: iso8859-1
		String password = request.getParameter("password");

		//采用iso8859-1的编码对姓名进行逆转,转换成字节数组,再使用utf-8编码对数据进行转换,字符串
		username = new String(username.getBytes("iso8859-1"), "utf-8");
		password = new String(password.getBytes("iso8859-1"), "utf-8");
		System.out.println("姓名="+username);
		System.out.println("密码="+password);

		if("lisi".equals(username) && "123".equals(password)){
			/**
			 * getBytes默认情况下,使用iso8859-1的编码,但如果发现码表中没有当前字符
			 * 会使用当前系统下的默认编码gbk;
			 */
			response.getOutputStream().write("登录成功".getBytes("utf-8"));
		}else{
			response.getOutputStream().write("登录失败".getBytes("utf-8"));

		}
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

客户端代码:

工具类:

public class NetUtil {
	private static final String TAG = "NetUtil";
	/**
	 * 使用GET的方式登录
	 * @param username
	 * @param password
	 * @return 登录的状态
	 */
	public static String loginOfGet(String username,String password){
		HttpURLConnection conn = null;
		try {
			/**
			 * URLEncoder.encode(String s, String charsetName)对url中的中文参数进行编码,可以解决乱码
			 */
			String data = "username="+URLEncoder.encode(username, "utf-8")+"&password="+URLEncoder.encode(password, "utf-8");
			//get方式,url是直接在后面拼接地址的
			URL url =  new URL("http://10.3.5.154:8080/ServerDemo1/servlet/LoginServlet?"+data);
			conn = (HttpURLConnection) url.openConnection();

			conn.setRequestMethod("GET");//GET和POST必须全大写
			conn.setConnectTimeout(10000);//连接的超时时间
			conn.setReadTimeout(5000);//读数据的超时时间

			int responseCode = conn.getResponseCode();
			if(responseCode==200){
				//访问成功,通过流取的页面的数据信息
				InputStream is = conn.getInputStream();
				String status = getStringFromInputStream(is);
				return status;
			}else{
				Log.i(TAG, "访问失败:"+responseCode);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			if(conn!=null){
				conn.disconnect();//释放链接
			}
		}
		return null;
	}
	/**
	 * 使用POST提交方式
	 * @param username
	 * @param password
	 * @return
	 */
	public static String loginOfPost(String username, String password) {
		HttpURLConnection conn = null;
		try {
			//post请求的url地址是以流的方式写过去的
			URL url =  new URL("http://10.3.5.154:8080/ServerDemo1/servlet/LoginServlet");
			conn = (HttpURLConnection) url.openConnection();

			conn.setRequestMethod("GET");//GET和POST必须全大写
			conn.setConnectTimeout(10000);//连接的超时时间
			conn.setReadTimeout(5000);//读数据的超时时间
			conn.setDoOutput(true);//必须设置此方法  允许输出
		//	conn.setRequestProperty("Content-Length", 234);//设置请求消息头  可以设置多个

			//post请求的参数
			String data = "username="+username+"&password="+password;
			// 获得一个输出流, 用于向服务器写数据, 默认情况下, 系统不允许向服务器输出内容
			OutputStream out = conn.getOutputStream();
			out.write(data.getBytes());
			out.flush();
			out.close();

			int responseCode = conn.getResponseCode();
			if(responseCode==200){
				//访问成功,通过流取的页面的数据信息
				InputStream is = conn.getInputStream();
				String status = getStringFromInputStream(is);
				return status;
			}else{
				Log.i(TAG, "访问失败:"+responseCode);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			if(conn!=null){
				conn.disconnect();//释放链接
			}
		}
		return null;

	}
	/**
	 * 通过字节输入流返回一个字符串信息
	 * @param is
	 * @return
	 * @throws IOException
	 */
	private static String getStringFromInputStream(InputStream is) throws IOException {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		int len=0;
		while((len=is.read(buffer))!=-1){
			baos.write(buffer, 0, len);
		}
		is.close();
		String status = baos.toString();// 把流中的数据转换成字符串, 采用的编码是: utf-8
		baos.close();
		return status;
	}
}

MainActivity.java类没有改变和上面的一样。

时间: 2024-10-08 12:59:43

使用HttpURLConnection采用get方式或post方式请求数据的相关文章

【黑马Android】(05)短信/查询和添加/内容观察者使用/子线程网络图片查看器和Handler消息处理器/html查看器/使用HttpURLConnection采用Post方式请求数据/开源项目

备份短信和添加短信 操作系统短信的uri: content://sms/ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.itheima28.backupsms" android:versionCode="1

07_android入门_采用HttpClient的POST方式、GET方式分别实现登陆案例

1.简介 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议. 2.功能介绍 以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页. (1)实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等) (2)支持自动转向 (3)支持 HTTPS 协议 (4)支持代理服务器等 3

TCP Incast 问题TCP INCAST解决思路 应用场景:在集群文件系统内,客户端应用请求某个逻辑数据块(通常情况下一个读数据块大小是1MB),该数据块以条带化方式分别存储在几个存储服务器上,即采用更小的数据片存储(32KB,256KB等),这种小数据片称为服务器请求单元(SRU)。只有当客户端接收到所有的服务器返回的其所请求数据块的SRU后才继续发送出下一个数据块请求,即客户端同时向

TCP INCAST解决思路 应用场景:在集群文件系统内,客户端应用请求某个逻辑数据块(通常情况下一个读数据块大小是1MB),该数据块以条带化方式分别存储在几个存储服务器上,即采用更小的数据片存储(32KB,256KB等),这种小数据片称为服务器请求单元(SRU).只有当客户端接收到所有的服务器返回的其所请求数据块的SRU后才继续发送出下一个数据块请求,即客户端同时向多个存储服务器发起并发TCP请求,且所有服务器同时向客户端发送SRU. 出现的问题: 1)         这种多对一的服务器向客

android入门_采用android-async-http开源项目的GET方式或POST方式实现登陆案例

09_android入门_采用android-async-http开源项目的GET方式或POST方式实现登陆案例

PHP中多级查询采用递归和循环的方式详解

现在的商城类app或者是购物网站一般除了购物外,还起到了推广,宣传和分销的作用,多级查询一般采用递归和循环的方式.不过很多初学者都是不清楚如何实现的,下面就以20级为例,编写的代码和运行效果如下:1.Php查询每级人数.php代码如下:$aim["prevtel"] = $tel; $n=0; $array_co = array(); while ( $n< 10) { $users=M('user')->where($aim)->getField('tel',tru

android 之post,get方式请求数据

get方式和post方式的区别: 1.请求的URL地址不同: post:"http://xx:8080//servlet/LoginServlet" get:http://xxx:8080//servlet/LoginServlet?username=root&pwd=123 2.请求头不同: ****post方式多了几个请求头:Content-Length   ,   Cache-Control , Origin openConnection.setRequestProper

Struts2--result页面跳转forward--get方式和post方式的获取参数

一.总体概述 这篇文章是写基于struts2(整合了ssh)的2个页面之间的跳转传参.突然这天想到,struts2的result有很多的type类型(跳转,重定向,...),于是就回忆起,跳转和重定向的不同(跳转地址栏不变,共享参数:重定向地址栏改变,不再共享参数).心里好奇,struts2里页面跳转的时候,get的方式提交时怎么再第二个页面获取参数的,post是怎么在第二个页面获取参数的.重定向又是怎么样的呢?真的抱歉,我今天花了一天时间,只弄清楚了页面跳转,关于页面重定向传参明天再搞.本来这

非接触IC卡中typeA卡和typeB卡的区别--总结,二者的调制方式和编码方式不同

非接触IC卡中typeA卡和typeB卡的区别--总结,二者的调制方式和编码方式不同 1.非接触式IC卡的国际规范ISO/IEC14443的由来? 在非接触式IC卡的发展过程中,这些问题逐渐被解决并形成通用的标准,体现在现在的射频IC卡的设计上,国际标准化组织(ISO)和国际电子技术委员会(IEC)为期制定了相应的非接触式IC卡的国际标准--ISO/IEC14443. 2.ISO/IEC14443中的主要内容及typeA,typeB卡的由来 ISO/IEC14443标准包括四个部分: 第一部分I

Linux平台达梦数据库V7单实例安装方式之静默方式

一 前言 我们在学习任何一个应用时,了解它的最初步骤通常是学会如何进行安装配置,后序才去关心如何使用,学习达梦数据库也是如此,而达梦数据库的安装提供了多种方式,接下来会一一介绍每种安装方式,达梦数据库支持多个操作系统平台的安装,本篇主要介绍Linux平台下的静默方式安装. 二 安装需求 2.1 硬件需求 用户应根据 DM 及应用系统的需求来选择合适的硬件配置,如 CPU 的指标.内存及磁盘容量等.档次一般应尽可能高一些,尤其是作为数据库服务器的机器,基于 Java 的程序运行时最好有较大的内存.