安卓中常见的网络请求方式
HttpUrlConnection
1.get请求
2.post请求
3.下载网络视频/音乐/图片到SD卡中
一.概念:
1.http:超文本传输协议(客户端和服务端),应用层协议
2.html:超文本标记语言
3.xml:可扩展标记语言
二.网络七层
应用层:http
表示层:将人看的懂的转成计算器
会话层:发起会话
传输层:tcp协议+udp协议
网络层:ip协议
数据链路层:
物理层:网线
三.http协议:请求协议+响应协议
1.请求协议:客户端向服务端发送的
(1)请求首行:请求方式+地址+版本号
(2)请求头信息:客户端告诉服务端自己的一些信息
(3)空行
(4)请求体:客户端向服务端发送的数据(get请求没有请求体,post请求有请求)
2.响应协议:服务端给客户端响应的
(1)响应首行:版本号+响应码+响应信息
(2)响应头信息:服务器告诉客户端的信息 Content-Length: 4772
(3)空行
(4)响应体:服务器返回给客户端的内容(图片 json xml)
四.2个软件:
fiddler:抓包用的,能够获取http请求协议和响应协议内容
postman:测接口用的,每次直接在这个软件上面测接口
五.技能点:使用httpurlConnection做get请求和post请求
1.get和post的区别:
get将发送的数据暴露在url,不安全的+主要应用向服务器要数据
post将发送的数据放在请求体,安全的+主要应用向服务器提交数据
2.get:下载文件+请求图片+请求json
3.post:登陆+注册+上传文件
六.八种请求方式,常用的get和post
1、OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
2、HEAD
向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
3、GET
向特定的资源发出请求。它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等)返回给客户端。
4、POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。
5、PUT
向指定资源位置上传其最新内容
6、DELETE
请求服务器删除Request-URL所标识的资源
7、TRACE
回显服务器收到的请求,主要用于测试或诊断
8、CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
七.常用响应码:1xx 消息 2xx 成功 3xx重定向 4xx客户端错误 5xx服务器
滚动歌词效果
//主类
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback{
File file = new File("/sdcard/Misc/春风十里");
File file1=new File("/sdcard/Misc/前冲 - 春风十里.mp3");
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
SeekBar seekBar;
MediaPlayer mediaPlayer;
Timer timer;
int positon=0;
TextView textView1,textView2;
ArrayList<Music> list=new ArrayList<>();
@SuppressLint("HandlerLeak")
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what==101){
if (mediaPlayer!=null){
int duration = mediaPlayer.getDuration();
int currentPosition = mediaPlayer.getCurrentPosition();
Date date=new Date(duration);
SimpleDateFormat sdf=new SimpleDateFormat("mm:ss");
String format = sdf.format(date);
seekBar.setMax(duration);
seekBar.setProgress(currentPosition);
textView2.setText(format);
Date date1=new Date(currentPosition);
String format1 = sdf.format(date1);
textView1.setText(format1);
if (list.size()>0){
if (positon<list.size()-1){
if (currentPosition>=list.get(positon+1).getTime()){
positon++;
}
}
}
if (positon-1>0){
if (currentPosition<=list.get(positon).getTime()){
positon--;
}
}
}
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView=findViewById(R.id.surf);
seekBar=findViewById(R.id.seekbar);
textView1=findViewById(R.id.tv1);
textView2=findViewById(R.id.tv2);
timer=new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.sendEmptyMessage(101);
}
},0,1);
mediaPlayer= new MediaPlayer();
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(file1.getPath());
mediaPlayer.prepare();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
} catch (IOException e) {
e.printStackTrace();
}
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { }
@Override
public void onStartTrackingTouch(SeekBar seekBar) { }
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int progress = seekBar.getProgress();
mediaPlayer.seekTo(progress);
}
});
StringBuffer stringBuffer=new StringBuffer();
try {
FileInputStream fileInputStream=new FileInputStream(file);
byte[] bytes=new byte[1024];
int len=0;
while ((len=fileInputStream.read(bytes))!=-1){
stringBuffer.append(new String(bytes,0,len));
}
Gson gson=new Gson();
Bean bean = gson.fromJson(stringBuffer.toString(), Bean.class);
Bean.LrcBean lrc = bean.getLrc();
String lyric = lrc.getLyric();
String[] split = lyric.split("\n");
for (int i = 0; i < split.length; i++) {
// Log.e("###",split[i]+"");
String trim = split[i].trim();
String[] split1 = trim.split("]");
if(split1.length>=2){
String s = split1[0];
String substring1 = s.substring(1, 3);
String substring2 = s.substring(4, 6);
String substring3 = s.substring(7, 9);
// Log.e("###",substring1+":"+substring2+":"+substring3);
int start=Integer.parseInt(substring1)*60*1000+Integer.parseInt(substring2)*1000+Integer.parseInt(substring3);
String text = split1[1];
list.add(new Music(text, start));
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
for (int i = 0; i < list.size(); i++) {
Log.e("###",list.get(i).toString());
}
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
new MyThread().start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
int y=250;
int x=150;
class MyThread extends Thread{
@Override
public void run() {
super.run();
while(true){
Paint paint=new Paint();
paint.setColor(Color.BLACK);
paint.setStrokeWidth(10);
paint.setTextSize(30);
Paint paint1=new Paint();
paint1.setColor(Color.RED);
paint1.setStrokeWidth(10);
paint1.setTextSize(50);
Canvas canvas = surfaceHolder.lockCanvas();
if(canvas==null){
break;
}
canvas.drawColor(Color.WHITE);
if (list.size()>0){
for (int i=positon-1;i>=0;i--){
canvas.drawText(list.get(i).getText(),x,y-50*(positon-i),paint);
}
canvas.drawText(list.get(positon).getText(),x,y,paint1);
for (int i=positon+1;i<list.size();i++){
canvas.drawText(list.get(i).getText(),x,y+50*(i-positon),paint);
}
}
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
//音乐类
public class Music {
private String text;
private int time;
public Music(String text, int time) {
this.text = text;
this.time = time;
}
@Override
public String toString() {
return "Music{" +
"text='" + text + '\'' +
", time=" + time +
'}';
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
}
//解析的Bean类
public class Bean {
private boolean sgc;
private boolean sfy;
private boolean qfy;
private LyricUserBean lyricUser;
private LrcBean lrc;
private KlyricBean klyric;
private TlyricBean tlyric;
private int code;
public boolean isSgc() {
return sgc;
}
public void setSgc(boolean sgc) {
this.sgc = sgc;
}
public boolean isSfy() {
return sfy;
}
public void setSfy(boolean sfy) {
this.sfy = sfy;
}
public boolean isQfy() {
return qfy;
}
public void setQfy(boolean qfy) {
this.qfy = qfy;
}
public LyricUserBean getLyricUser() {
return lyricUser;
}
public void setLyricUser(LyricUserBean lyricUser) {
this.lyricUser = lyricUser;
}
public LrcBean getLrc() {
return lrc;
}
public void setLrc(LrcBean lrc) {
this.lrc = lrc;
}
public KlyricBean getKlyric() {
return klyric;
}
public void setKlyric(KlyricBean klyric) {
this.klyric = klyric;
}
public TlyricBean getTlyric() {
return tlyric;
}
public void setTlyric(TlyricBean tlyric) {
this.tlyric = tlyric;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public static class LyricUserBean {
private int id;
private int status;
private int demand;
private int userid;
private String nickname;
private long uptime;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public int getDemand() {
return demand;
}
public void setDemand(int demand) {
this.demand = demand;
}
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public long getUptime() {
return uptime;
}
public void setUptime(long uptime) {
this.uptime = uptime;
}
}
public static class LrcBean {
private int version;
private String lyric;
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
public String getLyric() {
return lyric;
}
public void setLyric(String lyric) {
this.lyric = lyric;
}
}
public static class KlyricBean {
/**
* version : 0
* lyric : null
*/
private int version;
private Object lyric;
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
public Object getLyric() {
return lyric;
}
public void setLyric(Object lyric) {
this.lyric = lyric;
}
}
public static class TlyricBean {
/**
* version : 0
* lyric : null
*/
private int version;
private Object lyric;
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
public Object getLyric() {
return lyric;
}
public void setLyric(Object lyric) {
this.lyric = lyric;
}
}
}
断点续传效果
//主类
public class MainActivity extends AppCompatActivity {
VideoView videoView;
SeekBar seekBar;
Button button;
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what==102){
videoView.setVideoPath("/sdcard/Misc/a.mp4");
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
videoView.start();
}
});
}else if (msg.what==103){
videoView.setVideoPath("/sdcard/Misc/a.mp4");
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
videoView.start();
}
});
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
videoView=findViewById(R.id.vv);
seekBar=findViewById(R.id.seek);
button=findViewById(R.id.sta);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new MyGetThread("http://uvideo.spriteapp.cn/video/2019/0719/cc6b8cea-a97a-11e9-a3f8-90b11c479401_wpd.mp4",MainActivity.this,seekBar).start();
}
});
}
}
//线程
public class MyGetThread extends Thread{
private String url_str;
private MainActivity activity;
private SeekBar seekBar;
int start;
int end;
int count=0;
File file =new File("/sdcard/Misc/a.mp4");
public MyGetThread(String url_str, MainActivity activity,SeekBar seekBar) {
this.url_str = url_str;
this.activity = activity;
this.seekBar = seekBar;
}
@Override
public void run() {
super.run();
try {
URL url=new URL(url_str);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
if (urlConnection.getResponseCode()==200){
int contentLength = urlConnection.getContentLength();
end=contentLength;
seekBar.setMax(contentLength);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
URL url2=new URL(url_str);
HttpURLConnection urlConnection2 = (HttpURLConnection) url2.openConnection();
if (file.exists()){
start= (int) file.length();
count+=start;
if (start==end){
activity.handler.sendEmptyMessage(102);
}
}
urlConnection2.setRequestProperty("Range","bytes="+start+"-"+end);
if (urlConnection2.getResponseCode()==206){
InputStream inputStream = urlConnection2.getInputStream();
RandomAccessFile randomAccessFile=new RandomAccessFile(file,"rw");
randomAccessFile.seek(start);
byte[] bytes=new byte[1024];
int len=0;
while((len=inputStream.read(bytes))!=-1){
count+=len;
randomAccessFile.write(bytes,0,len);
seekBar.setProgress(count);
if (count==end){
activity.handler.sendEmptyMessage(103);
}
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}