HTTP通信
image.png
GET与POST的区别
image.png
http:上传:
image.png
Http:下载
image.png
image.png
HttpURLConnection使用详解:
https://blog.csdn.net/fightingXia/article/details/71775516
如何使用HTTPURLConnetion 访问接口:
https://blog.csdn.net/huaduotongtong/article/details/51076253
在Android开发中常常需要访问接口来获取数据,这个时候可以使用HttpURLConnection来连接服务器并获取返回字符串。
这样,该函数返回回来的字符串就是接口返回的字符串,如果该字符串为json格式的,那么按照json去解析便可以了。
GET请求:
布局:
xml
···
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.lenovo.test_01.MainActivity"
>
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Get"
/>
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="POST" />
<Button
android:id="@+id/button3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
···
*****MainActivity:**********************
···
package com.example.lenovo.test_01;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
Button btGet,btPost ,btDownLoad;
TextView tx;
//安卓4.0之后规定联网的操作必须在子线程中完成
//主线程中联网报错:android.os.NetworkOnMainThreadException
//创建Hander
Handler handler =new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what==0x111){
tx.setText(msg.obj.toString());
}
if(msg.what==0x112){
tx.setText(msg.obj.toString());
}
}
};
//创建联网对象
HttpURLConnection con;
//地址对象
URL url;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
void init() {
btGet = (Button) findViewById(R.id.button);
btGet.setOnClickListener(this);
btPost = (Button) findViewById(R.id.button2);
btPost.setOnClickListener(this);
btDownLoad = (Button) findViewById(R.id.button3);
btDownLoad.setOnClickListener(this);
tx = (TextView) findViewById(R.id.textView);
}
void getMothed(){
new Thread(){
public void run(){
//封装网络地址
//网址跟数据之间应?关联
try {
url =new URL("http://op.juhe.cn/onebox/movie/video?" +
"dtype=&q="+"复仇者联盟3: 无限战争"+"&key=d6c3131e11deddfd0bef9deadfa05334");
//创建连接对象
con= (HttpURLConnection) url.openConnection();
// 设置连接对象属性
con.setDoOutput(true);//允许发送 接收数据
con.setDoInput(true);
//设置请求方式
con.setRequestMethod("GET");
//设置请求超时和接收超时
con.setConnectTimeout(10000);
con.setReadTimeout(10000);
//开始连接
con.connect();
//读取数据 获取输入流对象接收数据
InputStream is=con.getInputStream();
if (con.getResponseCode()==200){//获得的请求码 200 代表请求成功
ByteArrayOutputStream bos= new ByteArrayOutputStream();
int length=-1;//标记最后一次搬运的长度
byte buffer[] =new byte[1024];
while ((length=is.read(buffer))!=-1){
bos.write(buffer,0,length);
bos.flush();
}
is.close();
bos.close();
Message message=handler.obtainMessage();
message.obj=bos.toString();
message.what=0x111;
handler.sendMessage(message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
@Override
public void onClick(View view) {
switch (view.getId()){
//联网 4.0以后不允许主线程联网
case R.id.button:
//get请求 将地址和请求数据绑在一起 安全系数低 请求数据不能大于2kb
getMothed();
break;
case R.id.button2:
//post请求 地址对象中不需要数据
getPost();
break;
case R.id.button3:
getDownLoad(); //从服务器下载文件
break;
}
}
//从服务器下载文件
void getDownLoad(){
new Thread() {
public void run() {
try {
//1.通过URL对象封装网址
url = new URL("http://169.254.195.164:8080/a3.jpg");
//2.通过URL对象获取连接对象
con = (HttpURLConnection) url.openConnection();
// 3. 设置连接对象属性
con.setDoOutput(true);//允许上传
con.setDoInput(true);//允许下载
con.setRequestMethod("POST"); //设置请求方式
//设置请求超时和读取超时
con.setConnectTimeout(10000);
con.setReadTimeout(10000);
con.connect();
//4.判断是否请求成功
if (con.getResponseCode() == 200) {//获得的请求码 200 代表请求成功
//读取数据 获取输入流对象接收数据
InputStream is = con.getInputStream();
//判断SD卡是否存在
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File file =new File(Environment.getExternalStorageDirectory()+"/my1710.jpg");
FileOutputStream fos=new FileOutputStream(file);
byte buffer[]=new byte[1024];
int length=-1;
while ((length = is.read(buffer)) != -1) {
fos.write(buffer, 0, length);
fos.flush();
}
is.close();
fos.close();
}else {
handler.sendEmptyMessage(2);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
//post获取
void getPost(){
new Thread() {
public void run() {
//封装网络地址
//网址跟数据之间应?关联
try {
//1.通过URL对象封装网址
url = new URL("http://op.juhe.cn/onebox/movie/video");
//
//2.创建连接对象
con = (HttpURLConnection) url.openConnection();
// 3. 设置连接对象属性
con.setDoOutput(true);//允许上传
con.setDoInput(true);//允许下载
con.setRequestMethod("POST"); //设置请求方式
//设置请求超时和读取超时
con.setConnectTimeout(10000);
con.setReadTimeout(10000);
con.connect();
//4.发送数据
OutputStream os=con.getOutputStream();
byte data[]=( "dtype=&q=" + "复仇者联盟3: 无限战争" + "&key=d6c3131e11deddfd0bef9deadfa05334").getBytes("UTF-8");
os.write(data,0,data.length);
os.flush();
os.close();
//5.判断是否请求成功
if (con.getResponseCode() == 200) {//获得的请求码 200 代表请求成功
//读取数据 获取输入流对象接收数据
InputStream is = con.getInputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int length = -1;//标记最后一次搬运的长度
byte buffer[] = new byte[1024];
while ((length = is.read(buffer)) != -1) {
bos.write(buffer, 0, length);
bos.flush();
}
is.close();
bos.close();
Message message=handler.obtainMessage();
message.obj=bos.toString();
message.what=0x112;
handler.sendMessage(message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
}
···
效果图: