博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家,
点击跳转到网站
前言:下面使用HttpURLConnection进行POST的请求,GET请求不需要传递参数自然你也就会使用了。
一、创建UrlConnManager类,提供getHttpURLConnection()方法,配置默认参数,并返回HttpURLConnection的实例。
之后再写一个postParams方法,组织一下请求参数 并将请求参数写入输出流。
代码如下:
public class UrlConnManager {
//配置默认参数,返回HttpURLConnection的实例
public static HttpURLConnection getHttpURLConnection(String url) {
HttpURLConnection httpURLConnection = null;
try {
URL mUrl = new URL(url);
httpURLConnection = (HttpURLConnection) mUrl.openConnection();
//设置连接超时时间
httpURLConnection.setConnectTimeout(15000);
//设置读取超时时间
//开始读取服务器端数据,到了指定时间还没有读到数据,则报超时异常
httpURLConnection.setReadTimeout(15000);
//设置请求参数
httpURLConnection.setRequestMethod("POST");
//添加Header
httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
//接收输入流
httpURLConnection.setDoInput(true);
//传递参数时,需要开启
httpURLConnection.setDoOutput(true);
} catch (Exception e) {
e.printStackTrace();
}
return httpURLConnection;
}
//将请求参数写入到输出流,写出到服务器
public static void postParams(OutputStream output, List<NameValuePair> paramsList) {
BufferedWriter bufferedWriter = null;
try {
StringBuilder stringBuilder = new StringBuilder();
for (NameValuePair pair : paramsList) {
if (!TextUtils.isEmpty(stringBuilder)) {
stringBuilder.append("&");
}
stringBuilder.append(URLEncoder.encode(pair.getName(), "UTF-8"));
stringBuilder.append("=");
stringBuilder.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
bufferedWriter = new BufferedWriter(new OutputStreamWriter(output, "UTF-8"));
bufferedWriter.write(stringBuilder.toString());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedWriter != null) {
bufferedWriter.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
二、接下来创建一个Activity和对应的xml文件,点击按钮进行网络请求。
1、activity_http_u_r_l_connection.xml 代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".activity.HttpURLConnectionActivity">
<Button
android:id="@+id/btn_post"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="HttpURLConnection的Post请求" />
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
2.HttpURLConnectionActivity代码如下:
public class HttpURLConnectionActivity extends AppCompatActivity {
private Button btn_post;
private TextView textView;
//响应状态码
private int responseCode;
//请求结果
private String response;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_http_u_r_l_connection);
btn_post = findViewById(R.id.btn_post);
textView = findViewById(R.id.textView);
btn_post.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
//使用HttpURLConnection的post请求
useHttpUrlConnectionPost("https://ip.taobao.com/service/getIpInfo.php");
}
}).start();
}
});
}
private void useHttpUrlConnectionPost(String url) {
InputStream inputStream = null;
//获取HttpURLConnection的实例
HttpURLConnection httpURLConnection = UrlConnManager.getHttpURLConnection(url);
try {
List<NameValuePair> postParams = new ArrayList<>();
//添加请求参数
postParams.add(new NameValuePair("ip", "59.108.54.37"));
UrlConnManager.postParams(httpURLConnection.getOutputStream(), postParams);
//建立实际的连接
httpURLConnection.connect();
inputStream = httpURLConnection.getInputStream();
//服务器返回的响应状态码
responseCode = httpURLConnection.getResponseCode();
response = convertStreamToString(inputStream);
//状态码200:表示客户端请求成功
if (responseCode == HttpURLConnection.HTTP_OK) {
//在子线程中不能操作UI线程,通过handler在UI线程中进行操作
handler.sendEmptyMessage(0x00);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
if (msg.what == 0x00) {
textView.setText("响应状态码:" + responseCode + "\n" + "请求结果:" + "\n" + response);
}
return true;
}
});
//读取服务器返回的字符串
private String convertStreamToString(InputStream inputStream) {
BufferedReader bufferedReader = null;
StringBuffer stringBuffer = new StringBuffer();
String line;
try {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
while ((line = bufferedReader.readLine()) != null) {
stringBuffer.append(line).append("\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return stringBuffer.toString();
}
}
具体注释已经在代码中给出,效果如下: