网络——使用HTTP 协议访问网络
来源:互联网 发布:java 预测算法 编辑:程序博客网 时间:2024/06/11 00:26
发送HTTP 请求的方式:HttpURLConnection 和HttpClient
HTTP 请求所使用的方法:GET 和POST。GET 表示希望从服务器那里获取数据,POST 表示希望提交数据给服务器。
使用HttpURLConnection
1. new 出一个URL 对象,并传入目标的网络地址;
URL url = new URL("https://www.baidu.com"); //此处的"/"必须是两个
2. 调用openConnection()方法,获取HttpURLConnection对象;
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
3. 设置HTTP 请求所使用的方法等属性;
connection.setRequestMethod("GET");
4. 调用getInputStream()方法获取到服务器返回的输入流;
InputStream in = connection.getInputStream();
5. 读取输入流;
InputStream in = connection.getInputStream();
6. 调用disconnect()方法将这个HTTP 连接关闭;
connection.disconnect();
例子:使用HttpURLConnection获取网页的html源代码
布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.a.MainActivity"> <Button android:id="@+id/btn_send" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Send Request" /> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="wrap_content" /> </ScrollView></LinearLayout>
MainActivity.java
第一种方式:
public class MainActivity extends AppCompatActivity { Button btnSend; TextView textView; private int SHOW_RESPONSE = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnSend = (Button) findViewById(R.id.btn_send); textView = (TextView) findViewById(R.id.tv); btnSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendRequestWithHttpURLConnection(); btnSend.setVisibility(View.GONE); //点击之后,移除Button } }); } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == SHOW_RESPONSE) { String response = (String) msg.obj; textView.setText(response); //对UI进行操作,将结果显示在界面上 } } }; private void sendRequestWithHttpURLConnection() { new Thread(new Runnable() { //开启子线程发起网络请求 @Override public void run() { HttpURLConnection connection = null; try { URL url = new URL("http://www.qq.com"); //此处必须是2个"/" connection = (HttpURLConnection) url.openConnection(); //获取HttpURLConnection实例 connection.setRequestMethod("GET"); //设置HTTP请求所用的方法 GET为从服务器获取数据,POST为提交数据到服务器 connection.setConnectTimeout(8000); //设置连接超时的毫秒数 connection.setReadTimeout(8000); //设置读取超时的毫秒数 InputStream inputStream = connection.getInputStream(); //获取输入流 InputStreamReader isr = new InputStreamReader(inputStream); //读取输入流 BufferedReader reader = new BufferedReader(isr); //使用BufferedReader读取返回的流 StringBuilder responseStringBuilder = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { responseStringBuilder.append(line); } Message message = new Message(); //将读取的流的结果存放到Message对象,使用Handler发送,因为子线程无法操作UI message.what = SHOW_RESPONSE; message.obj = responseStringBuilder.toString(); //将服务器返回的结果放到Message handler.sendMessage(message); } catch (Exception e) { e.printStackTrace(); } finally { if (connection != null) { connection.disconnect(); //关闭HTTP连接 } } } }).start(); }}
第二种方式(比第一种简单):
public class MainActivity extends AppCompatActivity implements View.OnClickListener { Button btn; TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (Button) findViewById(R.id.btn); tv = (TextView) findViewById(R.id.tv); btn.setOnClickListener(this); } @Override public void onClick(View v) { new Thread(new Runnable() { //网络请求在子线程 @Override public void run() { try { URL url = new URL("http://www.qq.com"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); InputStream is = connection.getInputStream(); //字节流 int len; byte[] buf = new byte[1024]; final StringBuffer sb = new StringBuffer(); while ((len = is.read(buf)) != -1) { sb.append(new String(buf, 0, len)); } runOnUiThread(new Runnable() { //在子线程中嵌入主线程,以更新UI @Override public void run() { tv.setText(sb.toString()); btn.setVisibility(View.GONE); } }); } catch (Exception e) { e.printStackTrace(); } } }).start(); }}
第三种方式(异步任务):
public class MainActivity extends AppCompatActivity implements View.OnClickListener { TextView tv; Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (Button) findViewById(R.id.btn); tv = (TextView) findViewById(R.id.tv); btn.setOnClickListener(this); } @Override public void onClick(View v) { new MyAsyncTask().execute("http://www.qq.com"); } private class MyAsyncTask extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { try { URL url = new URL(params[0]);//?? HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); InputStream is = url.openStream(); ByteArrayOutputStream os = new ByteArrayOutputStream(); int len; //字节流 byte[] buf = new byte[1024]; while ((len = is.read(buf)) != -1) { os.write(buf, 0, len); } String result = new String(os.toByteArray(), "utf-8"); return result; } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { tv.setText(s); } }}
若要提交数据给服务器:将HTTP 请求的方法改成POST,并在获取输入流之前把要提交的数据写出即可每条数据都以键值对的形式存在,数据与数据之间用 & 符号隔开例如说向服务器提交用户名和密码:
connection.setRequestMethod("POST");DataOutputStream out = new DataOutputStream(connection.getOutputStream());out.writeBytes("username=admin&password=123456");
0 0
- Android—使用Http协议访问网络
- 网络——使用HTTP 协议访问网络
- 使用HTTP协议访问网络
- 使用HTTP协议访问网络
- 使用HTTP协议访问网络
- 使用HTTP协议访问网络
- 使用Http协议访问网络
- 使用http协议访问网络
- 使用HTTP协议访问网络
- 使用 HTTP协议访问网络
- 使用Http协议访问网络—使用HttpURLConnection
- Android使用Http协议访问网络——HttpConnection
- Android使用HTTP协议访问网络——HttpClient
- HTTP协议访问网络——HttpURLConnection
- HTTP 协议访问网络
- Http协议访问网络
- Android学习使用HTTP协议访问网络
- Android之使用HTTP协议访问网络
- centos下安装jdk1.8
- 历届试题 最大子阵
- makefile部分1
- Java String.split()用法小结
- Zookeeper的ACL控制探讨
- 网络——使用HTTP 协议访问网络
- 教你解决虚拟机CentOS 7"线缆被拔出"
- 听指挥的小孩——项目拾金(一)
- LintCode : 链表排序
- JAVA 线程池
- 如何利用session在页面中调用
- 图像处理与计算机视觉基础相关领域的经典书籍以及论文
- 转行做游戏(2) Kbengine serverapp结构初步解析
- FindBug异常总结