HTTP通信

2018-07-11  本文已影响0人  Summer_27d1
image.png
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();

}

}

···
效果图:

QQ图片20180711161552.png
上一篇下一篇

猜你喜欢

热点阅读