Android中使用Post请求的方法
一、引言
在现代移动应用开发中,网络通信是一个至关重要的环节,Android平台提供了多种方式来实现HTTP请求,其中POST方法常用于向服务器提交数据,本文将详细介绍如何在Android中使用POST请求,并通过示例代码展示其实现过程。
二、基础知识介绍
HTTP协议简介
超文本传输协议(HTTP)是互联网上应用最为广泛的一种网络协议,所有的Web文件都必须遵守这个标准,HTTP协议包括了HTTP/1.0和HTTP/1.1两个版本,其中HTTPS是HTTP协议的安全版本,通过SSL加密来保护数据传输安全。
GET与POST的区别
GET:从服务器获取数据,参数通过URL传递,长度有限制(通常不超过1024字节),安全性较低,因为参数暴露在URL中。
POST:向服务器发送数据,参数包含在请求体中,没有长度限制,安全性较高,适合传输大量数据或敏感信息。
三、准备工作
添加网络权限
在AndroidManifest.xml
文件中添加以下权限:
<uses-permission android:name="android.permission.INTERNET" />
创建布局文件
创建一个用户界面,包含一个按钮和一个TextView用于显示结果。
<!-res/layout/activity_main.xml --> <RelativeLayout 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" tools:context=".MainActivity"> <TextView android:id="@+id/lblPostResult" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/butPost" android:layout_centerHorizontal="true" android:text="提交结果" /> <Button android:id="@+id/butPost" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="25dp" android:text="提交测试" /> </RelativeLayout>
初始化控件
在MainActivity
中初始化按钮和TextView。
import android.os.Bundle; import android.widget.Button; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.Date; import java.text.SimpleDateFormat; public class MainActivity extends AppCompatActivity { private Button mButPost; private TextView mLblPostResult; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButPost = findViewById(R.id.butPost); mLblPostResult = findViewById(R.id.lblPostResult); mButPost.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { butPost_OnClick(v); } }); } // 提交按钮点击事件处理函数 private void butPost_OnClick(View v) { String strRecSmsMsg = "收短信测试"; RecSmsToPost(strRecSmsMsg); openToast("提交测试完成"); } // 收到短信后提交数据到服务器 private void RecSmsToPost(String strRecSmsMsg) { String strNowDateTime = getNowDateTime("yyyy-MM-dd|HH:mm:ss"); // 当前时间 Map<String, String> params = new HashMap<>(); params.put("RECSMSMSG", strRecSmsMsg); String strUrlPath = "http://192.168.1.9:80/JJKSms/RecSms.php" + "?DateTime=" + strNowDateTime; String strResult = HttpUtils.submitPostData(strUrlPath, params, "utf-8"); mLblPostResult.setText(strResult); } // 获取当前时间 private String getNowDateTime(String strFormat) { if (strFormat == null || strFormat.equals("")) { strFormat = "yyyy-MM-dd HH:mm:ss"; } Date now = new Date(); SimpleDateFormat df = new SimpleDateFormat(strFormat); // 设置日期格式 return df.format(now); // new Date()为获取当前系统时间 } // 显示消息提示框 private void openToast(String strMsg) { Toast.makeText(this, strMsg, Toast.LENGTH_LONG).show(); } }
四、使用HttpURLConnection进行POST请求
创建URL对象并打开连接
import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.Map; import java.util.Scanner; public class HttpUtils { public static String submitPostData(String urlPath, Map<String, String> params, String encode) { StringBuilder result = new StringBuilder(); String resultStr = ""; try { // 创建URL对象并打开连接 URL url = new URL(urlPath); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); // 设置请求方法为POST connection.setDoOutput(true); // 允许输出流写入数据 connection.setDoInput(true); // 允许输入流读取响应数据 connection.setUseCaches(false); // 不使用缓存 connection.setConnectTimeout(5000); // 设置连接超时时间为5秒 connection.setReadTimeout(5000); // 设置读取超时时间为5秒 connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // 设置内容类型为表单数据 // 构建请求参数字符串 StringBuilder postParams = new StringBuilder(); for (Map.Entry<String, String> entry : params.entrySet()) { postParams.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } postParams.deleteCharAt(postParams.length() 1); // 删除最后一个多余的'&'字符 byte[] postData = postParams.toString().getBytes(encode); // 将请求参数转换为字节数组 connection.getOutputStream().write(postData); // 向输出流写入数据 connection.getOutputStream().flush(); // 刷新输出流确保所有数据都被发送出去 // 读取响应数据 InputStream is = connection.getInputStream(); Scanner scanner = new Scanner(is); while (scanner.hasNextLine()) { result.append(scanner.nextLine()); } scanner.close(); resultStr = result.toString(); connection.disconnect(); // 断开连接 } catch (Exception e) { e.printStackTrace(); } finally { return resultStr; // 返回响应结果字符串 } } }
上述代码演示了如何使用HttpURLConnection
类来进行POST请求,首先创建了一个URL
对象,然后打开连接并配置相关参数,接下来构建请求参数字符串并将其转换为字节数组,最后通过输出流写入数据并读取响应,注意在实际应用中需要处理异常情况以确保程序的稳定性。
import okhttp3.*; import java.io.IOException; import java.util.concurrent.TimeUnit; import okhttp3.MediaType; import okhttp3.RequestBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import java.util.HashMap; import java.util.Map; public class OkHttpTool { private static final String url = "http://127.0.0.1/userInfo/add"; // 服务器地址 private static final OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) // 设置连接超时时间 .readTimeout(10, TimeUnit.SECONDS) // 设置读取超时时间 .build(); // 创建OkHttpClient实例 public static void main(String[] args) throws IOException { // 创建用户信息对象 UserInfo userInfo = new UserInfo(null, 1, "张三"); // 调用postUser方法发送POST请求 postUser(userInfo); } // 发送POST请求的方法一:使用FormBody构建表单数据 public static void postUser(UserInfo userInfo) throws IOException { RequestBody requestBody = new FormBody.Builder() .add("name", userInfo.getName()) // 添加姓名字段 .add("age", String.valueOf(userInfo.getAge())) // 添加年龄字段 .build(); // 构建请求体对象 Request request = new Request.Builder() .url(url) // 设置URL地址 .post(requestBody) // 设置请求方法为POST并传入请求体对象 .build(); // 构建请求对象 try (Response response = okHttpClient.newCall(request).execute()) { // 发送请求并接收响应结果 if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); // 如果响应不成功则抛出异常 System.out.println(response.body().string()); // 打印响应结果字符串形式的内容 } } // 发送POST请求的方法二:直接构建JSON字符串作为请求体内容(适用于复杂数据结构) public static void postUserJson(UserInfo userInfo) throws IOException { MediaType JSON = MediaType.parse("application/json;charset=utf-8"); // 指定媒体类型为JSON格式且编码为UTF-8 String jsonString = "{"name":"" + userInfo.getName() + "", "age":" + userInfo.getAge() + "}"; // 手动构造JSON字符串(注意转义字符) RequestBody requestBody = RequestBody.create(jsonString, JSON); // 创建请求体对象并指定媒体类型为JSON格式且编码为UTF-8 Request request = new Request.Builder() .url(url) // 设置URL地址 .post(requestBody) // 设置请求方法为POST并传入请求体对象(此时已经是JSON格式) .build(); // 构建请求对象 try (Response response = okHttpClient.newCall(request).execute()) { // 发送请求并接收响应结果 if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); // 如果响应不成功则抛出异常 System.out.println(response.body().string()); // 打印响应结果字符串形式的内容 } } }
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1257531.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复