zoukankan      html  css  js  c++  java
  • HttpURLConnection提交数据

    使用GET方式向服务器端提交数据

    * 原理:把要提交的数据组拼到Url后面

    * http协议规定数据长度不超过4kb,IE浏览器超过1kb就会丢弃掉后面的数据

    * 缺点:数据不安全

    * 优点:代码书写简单


    示例代码:
    
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import android.app.Activity;
    import android.os.Bundle;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
       private EditText   etPwd;
       private EditText   etQQ;
       private String     pwd;
       private String     qq;
    
       @Override
       protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          etPwd = (EditText) findViewById(R.id.et_pwd);
          etQQ = (EditText) findViewById(R.id.et_qq);
       }
    
       /**
        * 1. 在子线程中进行网络通讯 2. 获取服务器返回的信息 3. 用Handler去展示服务器返回的信息
        */
       public void login(View v) {
          pwd = etPwd.getText().toString().trim();
          qq = etQQ.getText().toString().trim();
          if (TextUtils.isEmpty(pwd) || TextUtils.isEmpty(qq)) {
             Toast.makeText(this, "亲,请输入QQ号码或者密码! :) ", 0).show();
             return;
          }
          // 开启子线程
          new Thread() {
             public void run() {
                requestNetWork();
             };
          }.start();
       }
    
       /**
        * 网络通信
        */
       private void requestNetWork() {
          //Servlet
          try {
             String path = "http://192.168.25.70:8080/web/LoginServlet?" + "qq="
                    + URLEncoder.encode(qq) + "&pwd=" + URLEncoder.encode(pwd, "utf-8");
             // 1. 创建Url
             URL url = new URL(path);
             // 2. 用Url打开连接
             HttpURLConnection conn = (HttpURLConnection) url.openConnection();
             // 3. 设置请求参
             conn.setRequestMethod("GET");    
             conn.setConnectTimeout(3000);
             conn.setReadTimeout(3000);
             // 4. 获取响应状态码
             int code = conn.getResponseCode();
             if (code == 200) {
                // * 2xxx 请求成 3xxx重定向 4xxx资源错误 5xxx服务器错误
                // 5. 获取服务器返回的二进制输入流
                InputStream is = conn.getInputStream();
                // 把流转成字符串
                String text = StringUtils.parseStream2String(is);
                showToast(text);
             } else {
                showToast(code + "");
             }
          } catch (Exception e) {
             e.printStackTrace();
             showToast("服务器忙!");
          }
       }
    
       /**
        * 在任意线程弹土司
        */
       public void showToast(final String text) {
          this.runOnUiThread(new Runnable() {
             @Override
             public void run() {
                Toast.makeText(MainActivity.this, text, 0).show();
             }
          });
       }
    }
    

    使用POST方式向服务器端提交数据

    * 原理:通过form表单提交数据

    * 缺点:代码书写复杂

    * 优点:数据安全

    示例代码: 
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import android.app.Activity;
    import android.os.Bundle;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
       private EditText   etPwd;
       private EditText   etQQ;
       private String     pwd;
       private String     qq;
       @Override
       protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          etPwd = (EditText) findViewById(R.id.et_pwd);
          etQQ = (EditText) findViewById(R.id.et_qq);
       }
       /**
        * 1. 在子线程中进行网络通讯 
        * 2. 获取服务器返回的信息 
        * 3. 用Handler去展示服务器返回的信息
        */
       public void login(View v) {
          pwd = etPwd.getText().toString().trim();
          qq = etQQ.getText().toString().trim();
          if (TextUtils.isEmpty(pwd) || TextUtils.isEmpty(qq)) {
             Toast.makeText(this, "亲,请输入QQ号码或者密码! :) ", 0).show();
             return;
          }
          // 开启子线程
          new Thread() {
             public void run() {
                requestNetWork();
             };
          }.start();
       }
       /**
        * 网络通信
        */
    
       private void requestNetWork() {
          //(1) 请求的Url不一样
          String path = "http://192.168.3.100:8080/web/LoginServlet";
          try {
             // 1. 创建Url
             URL url = new URL(path);
             // 2. 用Url打开连接
             HttpURLConnection conn = (HttpURLConnection) url.openConnection();
             // 3. 设置请求参数
             //(2)请求的方法不一样
             conn.setRequestMethod("POST");
             conn.setConnectTimeout(3000);
             conn.setReadTimeout(3000);
             //(3)多了两个请求头
             String data = "qq="+URLEncoder.encode(qq)+"&pwd="+URLEncoder.encode(pwd, "utf-8");
             conn.setRequestProperty("Content-Length", String.valueOf(data.length()));
             conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
             //(4)以二进制流的方式把数据提交给服务器
             //重要,声明要给服务器提交数据
             conn.setDoOutput(true);
             conn.getOutputStream().write(data.getBytes());
             // 4. 获取响应状态码
             int code = conn.getResponseCode();
             if (code == 200) {
                // * 2xxx 请求成 3xxx重定向 4xxx资源错误 5xxx服务器错误
                // 5. 获取服务器返回的二进制输入流
               InputStream is = conn.getInputStream();
               // 把流转成字符串
                String text = StringUtils.parseStream2String(is);
                showToast(text);
             } else {
                showToast(code + "");
            }
        } catch (Exception e) {
             e.printStackTrace();
             showToast("服务器忙!");
          }
       }
    
       /*
        * 在任意线程弹土司
        */
       public void showToast(final String text) {
          this.runOnUiThread(new Runnable() {
             @Override
             public void run() {
                Toast.makeText(MainActivity.this, text, 0).show();
             }
          });
       }
    }
    

    import java.io.ByteArrayOutputStream;
    import java.io.InputStream; 
    
    /**
     * 操作字符串
     */
    public class StringUtils {
    
       /**
        * 从流中转成字符串
        * @param is
        *            输入流
        * @return null表示失败
        */
       public static String parseStream2Str(InputStream is) {
          //内存输出流
          ByteArrayOutputStream baos = new ByteArrayOutputStream();
          int len = -1;
          byte[] buffer = new byte[1024*8];
          try {
             while((len = is.read(buffer)) != -1){
                baos.write(buffer, 0, len);
             }
             return new String(baos.toByteArray());
          } catch (Exception e) {
             e.printStackTrace();
             return null;
          }
       }
    }
    

    Getpost的请求的区别:

    URL不一样

    提交的数据方式不一样

    Post多了二个请求头: ContentLength ContentType

    Post用二进制输出提交数据

  • 相关阅读:
    网站如何知道浏览器的用户在使用什么语言?
    安装 Couchbase 服务器
    windows Phone 浏览器窗口的尺寸
    【leetcode】 9. palindrome number
    Android Notification实现推送消息过程中接受到消息端有声音及震动及亮屏提示
    UVA 12487 Midnight Cowboy(LCA+大YY)(好题)
    Jenkins——应用篇——插件使用——Publish over SSH
    Linux经常使用命令(三)
    c++引用总结
    quickcocos2dx framework环境变 fatal error C1083: 无法打开源文件:“.Box2D/Dynamics/b2World.h”: No such file or d
  • 原文地址:https://www.cnblogs.com/loaderman/p/6432413.html
Copyright © 2011-2022 走看看