Android HttpURLConnection

有 GET 自然有 POST,通过 openConnection 获取到的 HttpURLConnection 默认是进行 Get 请求的,所以如果要使用 POST 提交数据,应该调用以下方法设置 POST 请求方式

conn.setRequestMethod("POST");

设置允许输入,输出

conn.setDoOutput(true);
conn.setDoInput(true);

POST方法不能缓存,要手动设置为 false

conn.setUseCaches(false);

范例

接下来我们写一个范例来发送 POST 请求吧

我们要数据发送到 https://www.twle.cn/dy/text/getpost 它会输出我们发送的数据


  1. 创建一个 空的 Android 项目 cn.twle.android.HttpPost

  2. 修改 activity_main.xml 添加布局

    <?xml version="1.0" encoding="utf-8" ?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <TextView
            android:text="要发送的数据"
            android:layout_width="wrap_content"
            android:layout_height="44dp" />
    
        <EditText
            android:id="@+id/ms_chat"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="你输入你想说的话"
            android:text="简单教程,简单编程" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <Button
                android:id="@+id/btn_get"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:hint="发送数据" />
    
        </LinearLayout>
    
        <WebView
    
            android:id="@+id/ms_webview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
    
  3. 然后在 MainActivity.java 目录下创建 WebHelper.java

    package cn.twle.android.httppost;
    
    import android.util.Log;
    
    import java.io.ByteArrayOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.util.HashMap;
    
    public class WebHelper {
    
        public static String post(String url,HashMap<String,String> postData)
        {
    
            String msg = "";
            try{
                HttpURLConnection conn = (HttpURLConnection) (new URL(url)).openConnection();
    
                //设置请求方式,请求超时信息
                conn.setRequestMethod("POST");
                conn.setReadTimeout(5000);
                conn.setConnectTimeout(5000);
    
                //设置运行输入,输出:
                conn.setDoOutput(true);
                conn.setDoInput(true);
    
                //Post方式不能缓存,需手动设置为false
                conn.setUseCaches(false);
    
                // 设置请求的数据
                String data = "";
                for ( HashMap.Entry<String,String> entry:postData.entrySet()) {
                    data += entry.getKey() + "=" + URLEncoder.encode(entry.getValue(),"UTF-8");
                }
    
                //获取输出流
                OutputStream out = conn.getOutputStream();
                out.write(data.getBytes());
                out.flush();
    
                if (conn.getResponseCode() == 200) {
                    // 获取响应的输入流对象
                    InputStream is = conn.getInputStream();
                    // 创建字节输出流对象
                    ByteArrayOutputStream message = new ByteArrayOutputStream();
                    // 定义读取的长度
                    int len = 0;
                    // 定义缓冲区
                    byte buffer[] = new byte[1024];
                    // 按照缓冲区的大小,循环读取
                    while ((len = is.read(buffer)) != -1) {
                        // 根据读取的长度写入到os对象中
                        message.write(buffer, 0, len);
                    }
                    // 释放资源
                    is.close();
                    message.close();
                    // 返回字符串
                    msg = new String(message.toByteArray());
    
                }
            }catch(Exception e){e.printStackTrace();}
    
            return msg;
        }
    }
    
  4. 修改 AndroidManifest.xml 加上网络权限

    <uses-permission android:name="android.permission.INTERNET" />
    
  5. 最后修改 MainActivity.java 完善各种逻辑

    package cn.twle.android.httppost;
    
    import android.os.Bundle;
    import android.os.Handler;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.webkit.WebView;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    import java.util.HashMap;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        private WebView ms_webview;
        private Button btn_get;
        private EditText ms_chat;
        private String detail = "";
    
        // 用于刷新界面
        private Handler handler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                    case 0x001:
    
                        // 解决坑死的乱码问题
                        ms_webview.getSettings().setDefaultTextEncodingName("UTF-8");
                        ms_webview.loadData(detail,"text/html;charset=UTF-8",null);
                        Toast.makeText(MainActivity.this, "数据发送完毕", Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        break;
                }
            }
    
            ;
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            bindViews();
        }
    
        private void bindViews() {
    
            btn_get =  (Button) findViewById(R.id.btn_get);
    
            ms_chat = (EditText) findViewById(R.id.ms_chat);
    
            ms_webview = (WebView) findViewById(R.id.ms_webview);
    
            btn_get.setOnClickListener(this);
    
        }
    
        @Override
        public void onClick(View view) {
    
            final HashMap<String,String> postData = new HashMap<String, String>();
    
            postData.put("chat",ms_chat.getText().toString());
    
            new Thread() {
                public void run() {
                    try {
                        detail = WebHelper.post("https://www.twle.cn/dy/text/getpost",postData);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
    
                    handler.sendEmptyMessage(0x001);
                };
            }.start();
        }
    }
    

Android 不允许在非 UI 线程中进行 UI 操作,所以使用 Handler 完成异步更新 UI

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.