目录
1 Http网络请求方法
Http
的请求方法代表了客户端想对服务器进行的操作,比如:
POST
、
GET
、
HEAD
、
PUT
、
DELETE
、TRACE、
OPTIONS
。
常用的不过于
CRUD
四个。
增:
PUT
;
删:
DELETE
;改:
POST
;查:
GET
。
1.1 GET 与 POST
GET
向服务器请求数据,获取资源,在大部分网络请求中,
GET
方法非常常见,并且它具有幂等性。
GET
请求没有请求体,对于
GET
请求的请求参数在
URL
后面加上一个
"?"
的后面,参数以
key=value的形式。参数与参数之间使用"&"
进行连接。
GET
请求是通过
URL
传输参数的,所以
GET
请求可以传输的参数是有限的。
POST
用于向表单提交数据,传送的数据放在请求体中。
在
POST
请求中,请求参数放在请求体中,服务器会根据
POST
请求体中的参数创建一个页面,然后返回给客户端。POST
不具有幂等性。
2 HttpURLConnection
2.1Android设置网络权限
<uses-permission android:name="android.permission.INTERNET" />
2.2 HttpURLConnection简介
在
JDK
的
java.net
包中已经提供了访问
HTTP
协议的基本功能的类:
HttpURLConnection
。
HttpURLConnection
是
Java
的标准类,它继承自
URLConnection
,可用于向指定网站发送
GET
请求、POST请求。
它在
URLConnection
的基础上提供了如下便捷的方法:
int getResponseCode(); // 获取服务器的响应代码。String getResponseMessage(); // 获取服务器的响应消息。String getResponseMethod(); // 获取发送请求的方法。void setRequestMethod(String method); // 设置发送请求的方法。
3 JSON
Json(Javascript Object notation)作为一种轻量级的数据传输格式,在现代软件开发中广泛使用,采用完全独立于语言的文本格式,具有可读性强、编写容易,更利于机器的解析与生成。
3.1 JSON的结构
JSON
具有以下这些表现形式
对象
(JSONObject)
:
对象是一个无序的
“‘
名称
/
值
’
对
”
集合。一个对象以
“{”(
左括号
)
开始,
“}”(
右括号
)
结束。每个
“
名称
”
后跟一个 “:”(冒号
)
;
“‘
名称
/
值
’
对
”
之间使用
“,”(
逗号
)
分隔。
数组
(JSONArray)
:
数组是值
(value)
的有序集合。一个数组以
“[”(
左中括号
)
开始,
“]”(
右中括号
)
结束。值之间使用
“,”(
逗号
)
分隔。
4 网络请求过程(从网上获取图片与文字)
4.1 在主页面添加RecyclerView
<?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"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_news"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
4.2 添加子布局
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="150dp">
<ImageView
android:id="@+id/iv_news"
android:layout_width="160dp"
android:layout_height="match_parent"
android:scaleType="fitXY"
app:srcCompat="@drawable/ic_launcher_background" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_toEndOf="@+id/iv_news"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
android:text="text"/>
<TextView
android:id="@+id/tv_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
android:text="text"/>
</LinearLayout>
</RelativeLayout>
</androidx.cardview.widget.CardView>
4.3 创建实体类
public class News {
private String title;
private String desc;
private String imgurl;
public News(String title, String desc, String imgurl) {
this.title = title;
this.desc = desc;
this.imgurl = imgurl;
}
public String getTitle() {
return title;
}
public String getDesc() {
return desc;
}
public String getImgurl() {
return imgurl;
}
@Override
public String toString() {
return "News{" +
"title='" + title + '\'' +
", desc='" + desc + '\'' +
", imgurl='" + imgurl + '\'' +
'}';
}
}
4.4 创建适配器
public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHold> {
private List<News> list;
public NewsAdapter(List<News> list) {
this.list = list;
}
@NonNull
@Override
public ViewHold onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_item, parent, false);
ViewHold viewHold=new ViewHold(view);
return viewHold;
}
@Override
public void onBindViewHolder(@NonNull ViewHold holder, int position) {
News news = list.get(position);
holder.tv_tital.setText(news.getTitle());
holder.tv_desc.setText(news.getDesc());
Glide.with(holder.view).load(news.getImgurl()).into(holder.iv_news);
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHold extends RecyclerView.ViewHolder{
TextView tv_tital;
TextView tv_desc;
ImageView iv_news;
View view;
public ViewHold(@NonNull View itemView) {
super(itemView);
this.view=itemView;
tv_tital=itemView.findViewById(R.id.tv_title);
tv_desc=itemView.findViewById(R.id.tv_desc);
iv_news=itemView.findViewById(R.id.iv_news);
}
}
}
4.5 编写网络通信工具类
public class NetworkUtils {
public static String etworkUtils(String urls) {
String result="";
try {
URL url=new URL(urls);
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
connection.setDoOutput(false);
connection.setDoInput(true);
connection.setRequestMethod("GET");
connection.setUseCaches(true);
connection.setInstanceFollowRedirects(true);
connection.setConnectTimeout(3000);
connection.connect();
int code = connection.getResponseCode();
if (code==200){
BufferedReader br=new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line="";
while ((line=br.readLine())!=null){
result += line;
}
br.close();
}
connection.disconnect();
Log.i("网络数据",result);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}
4.6 声明RecyclerView
public class MainActivity extends AppCompatActivity {
private RecyclerView rv_news;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rv_news=findViewById(R.id.rv_news);
}
}
4.7 开始进行网络编程
public class MainActivity extends AppCompatActivity {
private RecyclerView rv_news;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rv_news=findViewById(R.id.rv_news);
initDate();
}
private void initDate() {
new Thread(new Runnable() {
@Override
public void run() {
result=NetworkUtils.etworkUtils("https://api.vvhan.com/api/hotlist?type=36Ke");
handler.sendEmptyMessage(0x111);
}
}).start();
}
}
4.8 数据解析,给RecycleView设置适配器
public class MainActivity extends AppCompatActivity {
private RecyclerView rv_news;
private String result;
private List<News> list=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rv_news=findViewById(R.id.rv_news);
initDate();
}
private void initDate() {
new Thread(new Runnable() {
@Override
public void run() {
result=NetworkUtils.etworkUtils("https://api.vvhan.com/api/hotlist?type=36Ke");
handler.sendEmptyMessage(0x111);
}
}).start();
}
private Handler handler=new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what==0x111){
try {
JSONObject jsonObject=new JSONObject(result);
JSONArray jsonArray=jsonObject.getJSONArray("data");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject object= jsonArray.getJSONObject(i);
String title = object.getString("title");
String desc = object.getString("desc");
String pic = object.getString("pic");
News news=new News(desc,title,pic);
list.add(news);
}
NewsAdapter adapter=new NewsAdapter(list);
LinearLayoutManager layoutManager=new LinearLayoutManager(MainActivity.this);
rv_news.setLayoutManager(layoutManager);
rv_news.setAdapter(adapter);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
};
}