在Android开发中,POST请求是一种HTTP方法,用于向服务器提交数据。与GET请求不同,POST请求将数据放在请求体中而非URL中,适合传输较大或敏感的数据。
public class HttpPostExample {
public static String postData(String urlString, String postData) throws IOException {
URL url = new URL(urlString);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
// 设置请求方法为POST
urlConnection.setRequestMethod("POST");
urlConnection.setDoOutput(true);
// 设置请求头
urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
urlConnection.setRequestProperty("charset", "utf-8");
// 写入数据
OutputStream outputStream = urlConnection.getOutputStream();
outputStream.write(postData.getBytes(StandardCharsets.UTF_8));
outputStream.close();
// 读取响应
InputStream inputStream = urlConnection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
return response.toString();
} finally {
urlConnection.disconnect();
}
}
}
首先在build.gradle中添加依赖:
implementation 'com.squareup.okhttp3:okhttp:4.9.3'
示例代码:
public class OkHttpPostExample {
private final OkHttpClient client = new OkHttpClient();
public String postJson(String url, String json) throws IOException {
RequestBody body = RequestBody.create(json, MediaType.parse("application/json; charset=utf-8"));
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
public String postForm(String url, Map<String, String> formData) throws IOException {
FormBody.Builder builder = new FormBody.Builder();
for (Map.Entry<String, String> entry : formData.entrySet()) {
builder.add(entry.getKey(), entry.getValue());
}
Request request = new Request.Builder()
.url(url)
.post(builder.build())
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
}
添加依赖:
implementation 'com.android.volley:volley:1.2.1'
示例代码:
public class VolleyPostExample {
public void postRequest(Context context, String url, Map<String, String> params) {
RequestQueue queue = Volley.newRequestQueue(context);
StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
response -> {
// 处理响应
Log.d("Response", response);
},
error -> {
// 处理错误
Log.e("Error", error.toString());
}) {
@Override
protected Map<String, String> getParams() {
return params;
}
};
queue.add(stringRequest);
}
}
原因:Android不允许在主线程执行网络操作
解决方案:
原因:服务器证书不受信任或自签名
解决方案:
// 创建信任所有证书的OkHttpClient(仅用于测试环境)
OkHttpClient unsafeClient = new OkHttpClient.Builder()
.hostnameVerifier((hostname, session) -> true)
.sslSocketFactory(createSSLSocketFactory(), createTrustAllManager())
.build();
private static SSLSocketFactory createSSLSocketFactory() {
try {
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, new TrustManager[]{createTrustAllManager()}, new SecureRandom());
return sslContext.getSocketFactory();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static X509TrustManager createTrustAllManager() {
return new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
};
}
解决方案:
// OkHttp设置超时
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.build();
解决方案:
urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
Alluxio Day 2021
Alluxio Day 2021
Alluxio Day 2021
云+社区开发者大会(杭州站)
云+社区技术沙龙 [第30期]
云+社区沙龙online[新技术实践]
北极星训练营
Elastic 中国开发者大会
2023腾讯技术创作特训营