HttpURLConnection访问网络数据
工具类,使用 GET POST 请求网络数据的工具类
public class HttpURLConnectionUtils {
private String resultGet;
private String resultPost ;
/**
* GET 请求
*
* @param url 这个参数是请求网站的主体部分,例如:https://www.baidu.com/s?
* @param paramsMap 这个参数是请求的具体参数,键值对形式,例如:tn=baidutop10 &rsv_idx=2&wd=宁波天气预报
* @return 返回参数到调用者,然后解析处理
*/
public String requestGet(String url, HashMap<String, String> paramsMap) {
try {
//将集合里面的数据取出来拼接
StringBuilder tempParams = new StringBuilder();
int pos = 0;
for (String key : paramsMap.keySet()) {
if (pos > 0) {
tempParams.append("&");
}
tempParams.append(String.format("%s=%s", key, URLEncoder.encode(paramsMap.get(key), "utf-8")));
pos++;
}
String requestUrl = url + tempParams.toString();
// 新建一个URL对象
URL url1 = new URL(requestUrl);
// 打开一个HttpURLConnection连接
HttpURLConnection conn = (HttpURLConnection) url1.openConnection();
// 设置连接主机超时时间
conn.setConnectTimeout(5 * 1000);
//设置从主机读取数据超时
conn.setReadTimeout(5 * 1000);
// 设置是否使用缓存 默认 true
conn.setUseCaches(true);
//设置请求方式
conn.setRequestMethod("GET");
//设置请求头信息
conn.setRequestProperty("Content-Type", "application/json");
//设置客户端与服务端连接的类型
conn.setRequestProperty("Connection", "Keep-Alive");
//建立连接
conn.connect();
//判断连接成功否
if (conn.getResponseCode() == 200) {
resultGet = streamToString(conn.getInputStream());
Log.e("GET","GET请求成功");
} else {
Log.e("GET","GET请求失败");
}
//关闭连接
conn.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return resultGet;
}
/**
* POST 请求
*
* @param url 这个参数是请求网站的主体部分,例如:https://www.baidu.com/s?
* @param paramsMap 这个参数是请求的具体参数,键值对形式,例如:tn=baidutop10 &rsv_idx=2&wd=宁波天气预报
* @return 返回参数到调用者,然后解析处理
*/
public String requestPost(String url, HashMap<String, String> paramsMap){
try{
StringBuilder tempParams = new StringBuilder();
//将集合里面的数据取出来拼接
int pos = 0 ;
for (String key : paramsMap.keySet()){
if (pos > 0){
tempParams.append("&");
}
tempParams.append(String.format("%s=%s", key , URLEncoder.encode(paramsMap.get(key),"UTF-8")));
pos++ ;
}
String params = tempParams.toString();
// 请求的参数转换为byte数组
byte[] postData = params.getBytes();
//创建 URL 对象
URL url1 = new URL(url);
//建立连接
HttpURLConnection conn = (HttpURLConnection) url1.openConnection();
//设置连接超时时间
conn.setConnectTimeout(5 * 1000);
//设置从主机读取数据超时
conn.setReadTimeout(5 * 1000);
// Post请求必须设置允许输出 默认false
conn.setDoOutput(true);
//设置请求允许输入 默认是true
conn.setDoInput(true);
// Post请求不能使用缓存
conn.setUseCaches(false);
// 设置为Post请求
conn.setRequestMethod("POST");
//设置本次连接是否自动处理重定向
conn.setInstanceFollowRedirects(true);
// 配置请求Content-Type
conn.setRequestProperty("Content-Type", "application/json");
// 开始连接
conn.connect();
// 发送请求参数
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.write(postData);
dos.flush();
dos.close();
// 判断请求是否成功
if (conn.getResponseCode() == 200){
//获取返回的数据
resultPost = streamToString(conn.getInputStream());
Log.e("POST","POST请求成功");
}else {
Log.e("POST","POST请求失败");
}
//断开连接
conn.disconnect();
}catch (Exception e){
e.printStackTrace();
}
return resultPost;
}
//将输入流转换成字符串
private String streamToString(InputStream in) {
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, len);
}
byteArrayOutputStream.close();
in.close();
byte[] bytes = byteArrayOutputStream.toByteArray();
return new String(bytes);
} catch (Exception e) {
return null;
}
}
}
MainActivity 调用
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView tv;
private Button get_btn;
private HttpURLConnectionUtils utils;
private HashMap<String, String> hashMap;
private MyHandler myHandler;
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
myHandler = new MyHandler();
hashMap = new HashMap<String, String>();
hashMap.put("tn", "baidutop10");
hashMap.put("rsv_idx", "2");
hashMap.put("wd", "宁波天气预报");
}
private void init() {
tv = findViewById(R.id.textView2);
get_btn = findViewById(R.id.get_btn);
get_btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.get_btn:
new Thread() {
@Override
public void run() {
utils = new HttpURLConnectionUtils();
//第一个参数是请求网站的主体部分,例如:https://www.baidu.com/s?
//第二个参数是请求的具体参数,键值对形式,例如:tn=baidutop10 &rsv_idx=2&wd=宁波天气预报
// 完整的请求网址是第一个+第二个,例如:https://www.baidu.com/s?tn=baidutop10&rsv_idx=2&wd=宁波天气预报
String s = utils.requestPost("https://www.baidu.com/s?",hashMap);
Message message = new Message();
message.what = 101;
message.obj = s ;
myHandler.sendMessage(message);
}
}.start();
break;
}
}
class MyHandler extends Handler {
@Override
public void handleMessage(@NonNull Message msg) {
if (msg.what == 101) {
//此处需要将数据进行解析(xml 或者 json)
tv.setText(msg.obj.toString());
}
}
}
}