http-使用get和post方式提交数据

来源:互联网 发布:淘宝节点处罚 编辑:程序博客网 时间:2024/05/19 18:42

注意点:

  1.Getpost这两种提交方式有何不同?



很明显post方式提交多了content-lengthcontent-type这两项,所以post提交是要为这两项设置setRequestProperty属性


处理乱码问题

①客户端发送请求时没有对URL进行编码,我们只要使用URLEncoder.encodekeyValue,"UTF-8")处理即可。

 

Tomcat服务器在获取参数时,默认编码不是"UTF-8",一般是"ISO-8859-1",此时要如何处理呢?

 

主要思路是这样的:先把以"ISO-8859-1"(假设是这种编码,如果不是也无所谓)编码获取的数据转为最原始的二进码数据,然后再对该二进制数据以"UTF-8"格式进行重新编码





 

1.在一个web项目中创建一个servlet。让android项目访问servlet的路径,返回结果

 

loginServlet.java

 

package cn.com.servlet;import java.io.IOException;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// 服务器接受统一编码iso-8859-1,然后获取字符串时转化为utf-8String name = new String(request.getParameter("name").getBytes("iso-8859-1"), "utf-8");String password = request.getParameter("password");System.out.println("name:" + name);System.out.println("password:" + password);if (name.equals("张三") && password.equals("123")) {// 往浏览器写字符串response.getOutputStream().write("get方式登录成功".getBytes("utf-8")); // 写到浏览器的编码是utf-8} else {response.getOutputStream().write("get方式登录失败".getBytes("utf-8")); // 写到浏览器的编码是utf-8}}@Overrideprotected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// doGet(request, response);// 服务器接受统一编码iso-8859-1,然后获取字符串时转化为utf-8String name = new String(request.getParameter("name").getBytes("iso-8859-1"), "utf-8");String password = request.getParameter("password");System.out.println("name:" + name);System.out.println("password:" + password);if (name.equals("张三") && password.equals("123")) {// 往浏览器写字符串response.getOutputStream().write("post方式登录成功".getBytes("utf-8")); // 写到浏览器的编码是utf-8} else {response.getOutputStream().write("post方式登录失败".getBytes("utf-8")); // 写到浏览器的编码是utf-8}}}


 

 

2.android项目

 

 

(1)添加网络访问权限

<uses-permission android:name="android.permission.INTERNET"/>

 

(2)布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >     <EditText        android:id="@+id/name"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:hint="输入用户名"         android:text="张三"        />    <EditText        android:id="@+id/password"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:hint="输入密码" />    <Button        android:id="@+id/button"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="get提交"        android:onClick="onClick1"         />         <Button        android:id="@+id/button"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="post提交"        android:onClick="onClick2"         />     </LinearLayout>

 

 

MainActivity.java

 

package com.example.get;import java.io.UnsupportedEncodingException;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.view.Menu;import android.view.View;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity {private EditText name, password;private final int SUCCESS = 1;private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {if (msg.what == SUCCESS) {String result = (String) msg.obj;if (result != null) {Toast.makeText(MainActivity.this, result, 1).show();} else {Toast.makeText(MainActivity.this, "登陆失败", 1).show();}}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);name = (EditText) findViewById(R.id.name);password = (EditText) findViewById(R.id.password);}/** * get方式提交 *  * @param view */public void onClick1(View view) {final String loginName = name.getText().toString();final String loginPasswor = password.getText().toString();new Thread() {@Overridepublic void run() {String result = null;try {result = LoginService.loginByGet(loginName, loginPasswor);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}Message msg = new Message();msg.what = SUCCESS;msg.obj = result;handler.sendMessage(msg);}}.start();}/** * post方式提交 *  * @param view */public void onClick2(View view) {final String loginName = name.getText().toString();final String loginPasswor = password.getText().toString();new Thread() {@Overridepublic void run() {final String result = LoginService.loginByPost(loginName,loginPasswor);if (result != null) {// 在主线程上运行runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this, result, 1).show();}});}}}.start();}}

 

 

3.业务类

 

LoginService .java

 

package com.example.get;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.UnsupportedEncodingException;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.net.URLEncoder;public class LoginService {public static String loginByGet(String name, String password)throws UnsupportedEncodingException {// 拼路径String getpath = "http://10.162.0.171:8080/WebGet/LoginServlet?name="+ URLEncoder.encode(name, "utf-8") + "&password="+ URLEncoder.encode(password, "utf-8");// 提交是得utf-8String result = null;int code;try {URL url = new URL(getpath);// 根据url发送http请求HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 发送提交方式conn.setRequestMethod("GET");// 设置连接时间conn.setConnectTimeout(5000);// 获取服务器返回码code = conn.getResponseCode();if (code == 200) {InputStream is = conn.getInputStream();ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;if ((len = is.read(buffer)) != -1) {baos.write(buffer, 0, len);}is.close();baos.close();byte[] b = baos.toByteArray();String s = new String(b);result = s;} else {System.out.println(code);result = "";}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();result = "";}return result;}public static String loginByPost(String name, String password) {String postpath = "http://10.162.0.171:8080/WebGet/LoginServlet";String result = null;int code;try {URL url = new URL(postpath);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("POST");conn.setConnectTimeout(5000);// name="+name+"&password="+password// 准备数据String data = "name=" + URLEncoder.encode(name, "utf-8")+ "&password=" + URLEncoder.encode(password, "utf-8");// 提交是得utf-8conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");conn.setRequestProperty("Content-Length", data.length() + "");// post 方式实际上是浏览器把数据写个服务器conn.setDoOutput(true);// true 可以写出数据OutputStream os = conn.getOutputStream();os.write(data.getBytes());code = conn.getResponseCode();if (code == 200) {InputStream is = conn.getInputStream();ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;if ((len = is.read(buffer)) != -1) {baos.write(buffer, 0, len);}is.close();baos.close();byte[] b = baos.toByteArray();String s = new String(b);result = s;} else {System.out.println(code);result = "";}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();result = "";}return result;}}