乐趣区

关于java:Android-执行-HTTP-POST-请求

与之前的 GET 申请相似,大的区别是传入的参数和输入流:

import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class MainActivity extends AppCompatActivity {
    TextView textView1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView1 = findViewById(R.id.textView1);
        AsyncPostHttp task_post = new AsyncPostHttp();
        task_post.execute("https://www.baidu.com", "text");
    }

    class AsyncPostHttp extends AsyncTask<String, Float, String> {
        HttpURLConnection connection = null;
        BufferedReader reader = null;

        @Override
        protected void onPreExecute() {// 工作刚开始的时候执行}

        @Override
        protected String doInBackground(String... params) {
            try {URL url = new URL(params[0]);
                connection = (HttpURLConnection) url.openConnection();
                // 设置须要输入内容的标识,如果须要传递给服务器表单数据,那么此项需为 true
                connection.setDoOutput(true);
                // 不应用缓存
                connection.setUseCaches(false);
                // 设置 RequestHeader 与 HTTP 的申请形式
                connection.setRequestProperty("content-type", "application/x-www-form-urlencoded");
                connection.setRequestMethod("POST");
                // 应该指的是与服务器建设连贯的最大工夫
                connection.setConnectTimeout(1000);
                // 读取数据的最大工夫,这个不要设置得太短,不然会很容易呈现超时的异样
                connection.setReadTimeout(6000);
                // 应用 DataOutputStream 进行输入操作
                DataOutputStream output = new DataOutputStream(connection.getOutputStream());
                // 传输的内容格局就如同 URL 的标准一样(a=1&b=2),最好进行一次 URL 编码操作
                String content = "param1=" + URLEncoder.encode(params[1], "utf-8");
                output.writeBytes(content);
                // 输入完记得关
                output.flush();
                output.close();
                // 如果不是失常的申请后果则抛出异样,留神获取后果的步骤肯定要在申请内容给完之后
                if (connection.getResponseCode() != 200) {throw new Exception(connection.getResponseCode() + "," + connection.getResponseMessage());
                }
                // 应用 InputStream 进行接管操作
                InputStream input = connection.getInputStream();
                reader = new BufferedReader(new InputStreamReader(input));
                StringBuilder response = new StringBuilder();
                // 这里把 reader 中的内容一行行地读取到 response 中
                String line;
                while ((line = reader.readLine()) != null) {response.append(line);
                }
                // 返回最终的后果
                return response.toString();} catch (Exception ex) {
                // 返回谬误音讯
                return "Http error:" + ex.getMessage();} finally {
                // 申请完结后开释资源
                if (reader != null) {
                    try {reader.close();
                    } catch (Exception ex) {ex.printStackTrace();
                    }
                }
                if (connection != null) {connection.disconnect();
                }
            }
        }

        @Override
        protected void onProgressUpdate(Float... progresses) {// 解决进度报告}

        @Override
        protected void onPostExecute(String result) {
            // 工作实现就会到此
            textView1.setText(result);
        }

        @Override
        protected void onCancelled() {// 被动勾销工作}
    }
}
退出移动版