Android网络通信(HttpURLConnection)和 数据传输格式(JSON)
1.Http網絡請求方法
? ? ? Http的請求方法代表了客戶端想對服務器進行的操作,比如: POST、GET、HEAD、PUT、DELETE、 ? ? ? TRACE、OPTIONS 。 常用的不過于CRUD四個。 增:PUT;刪:DELETE;改: POST;查: GET。1.1GET 與 POST
???????GET
向服務器請求數據,獲取資源,在大部分網絡請求中,GET方法非常常見,并且它具有冪等性。 GET請求沒有請求體,對于GET請求的請求參數在URL后面加上一個"?"的后面,參數以 key=value 的形式。參數與參數之間使用"&"進行連接。 GET請求是通過 URL 傳輸參數的,所以GET請求可以傳輸的參數是有限的。? ? ? POST
用于向表單提交數據,傳送的數據放在請求體中。 在POST請求中,請求參數放在請求體中,服務器會根據POST請求體中的參數創建一個頁面,然后 返回給客戶端。POST不具有冪等性。2.HttpURLConnection
2.1Android設置網絡權限
在AndroidManifest.xml中添加 <uses-permission android:name="android.permission.INTERNET" />2.2HttpURLConnection簡介
在JDK的 java.net 包中已經提供了訪問HTTP協議的基本功能的類:HttpURLConnection。 HttpURLConnection是Java的標準類,它繼承自URLConnection,可用于向指定網站發送GET請求、 POST請求。 它在URLConnection的基礎上提供了如下便捷的方法: int getResponseCode(); // 獲取服務器的響應代碼。 String getResponseMessage(); // 獲取服務器的響應消息。 String getResponseMethod(); // 獲取發送請求的方法。 void setRequestMethod(String method); // 設置發送請求的方法。2.3HttpURLConnection說明?
●HttpURLConnection對象不能直接構造,需要通過URL類中的openConnection()方法來獲? ??得。 ●對HttpURLConnection對象的配置都需要在connect()方法執行之前完成,因為connect()會 ??根據HttpURLConnection對象的配置值生成HTTP頭部信息。 ●HttpURLConnection的connect()函數,實際上只是建立了一個與服務器的TCP連接,并沒? ? 有實際發送HTTP請求。**HTTP請求實際上直到我們獲取服務器響應數據(如調 ??用??getInputStream()、getResponseCode()等方法)時才正式發送出去**。 ? HttpURLConnection是基于HTTP協議的,其底層通過socket通信實現。如果不設置超時 (timeout),在網絡異常的情況下,可能會導致程序僵死而不繼續往下執行。 ●HTTP正文的內容是通過OutputStream流寫入的, 向流中寫入的數據不會立即發送到網? ? ? ? 絡,而是存在于內存緩沖區中,待流關閉時,根據寫入的內容生成HTTP正文。?調用? ? ? ? ? ? ??getInputStream()方法時,返回一個輸入流,用于從中讀取服務器對于HTTP請求的返信息。 ●我們可以使用HttpURLConnection.connect()方法手動的發送一個HTTP請求,但是如果要? ??獲取HTTP響應的時候,請求就會自動的發起,HttpURLConnection.getInputStream()方法? ??的時候,比如我們所以完全沒有必要調用connect()方法。3.?JSON
????????Json(Javascript Object notation)作為一種輕量級的數據傳輸格式,在現代軟件開發中廣泛使用,采用完 ????????全獨立于語言的文本格式,具有可讀性強、編寫容易,更利于機器的解析與生成。?3.1JSON的結構
JSON具有以下這些表現形式 ●對象(JSONObject): ????????對象是一個無序的“‘名稱/值’對”集合。一個對象以“{”(左括號)開始,“}”(右括號)結束。每個“名稱”后跟一個 “:”(冒號);“‘名稱/值’ 對”之間使用“,”(逗號)分隔。 JSONObject結構圖 ??? ????????●數組(JSONArray): ????????數組是值(value)的有序集合。一個數組以“[”(左中括號)開始,“]”(右中括號)結束。值之間使用“,”(逗號)分隔。4.從網絡端獲取新聞,并將新聞放入RecycleView(案列)
第一步:在activity_main.xml中添加RecycleView
<?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=".MainActivity3"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rv_start"android:layout_width="match_parent"android:layout_height="match_parent" /> </LinearLayout>第二步:創建子布局 news_item.xml
<?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="200dp"android:orientation="vertical"android:layout_marginTop="10dp"app:cardElevation="10dp"app:cardCornerRadius="10dp"><RelativeLayoutandroid:padding="6dp"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/news_img"android:layout_width="190dp"android:layout_height="190dp"android:scaleType="fitXY"/><TextViewandroid:layout_marginLeft="30dp"android:textSize="20sp"android:textColor="@color/teal_200"android:layout_toEndOf="@id/news_img"android:id="@+id/news_title"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextViewandroid:textSize="18sp"android:textColor="@color/black"android:layout_marginTop="20dp"android:layout_below="@id/news_title"android:layout_alignStart="@id/news_title"android:id="@+id/news_desc"android:layout_width="wrap_content"android:layout_height="wrap_content"/></RelativeLayout></androidx.cardview.widget.CardView>第三步:創建實體類 News.java
package com.hp.demo.model;public class News {private String title;private String desc;private String pic;public String getTitle() {return title;}public String getDesc() {return desc;}public String getPic() {return pic;}public News(String title, String desc, String pic) {this.title = title;this.desc = desc;this.pic = pic;} }第四步:創建適配器 NewsAdapter.java
package com.hp.demo.adapter;import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView;import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView;import com.bumptech.glide.Glide; import com.hp.demo.R; import com.hp.demo.model.News;import java.util.List;public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> {private List<News> list;public NewsAdapter(List<News> list) {this.list = list;}@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.news_item,parent,false);ViewHolder viewHolder=new ViewHolder(view);return viewHolder;}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {News news=list.get(position);holder.news_title.setText(news.getTitle());holder.news_desc.setText(news.getDesc());Glide.with(holder.view).load(news.getPic()).into(holder.news_img);}@Overridepublic int getItemCount() {return list.size();}public class ViewHolder extends RecyclerView.ViewHolder{ImageView news_img;TextView news_title,news_desc;View view;public ViewHolder(@NonNull View itemView) {super(itemView);this.view=itemView;news_desc=itemView.findViewById(R.id.news_desc);news_img=itemView.findViewById(R.id.news_img);news_title=itemView.findViewById(R.id.news_title);}} }第五步:聲明RecycleView
package com.hp.demo;import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView;import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message;import com.hp.demo.adapter.NewsAdapter; import com.hp.demo.model.News; import com.hp.demo.util.NetWorkUtil;import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject;import java.util.ArrayList; import java.util.List;public class MainActivity3 extends AppCompatActivity {private RecyclerView rv_start;private List<News> list=new ArrayList<>();private String result;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main3);rv_start=findViewById(R.id.rv_start);initData();} }第六步:開始進行網絡編程
package com.hp.demo;import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView;import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message;import com.hp.demo.adapter.NewsAdapter; import com.hp.demo.model.News; import com.hp.demo.util.NetWorkUtil;import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject;import java.util.ArrayList; import java.util.List;public class MainActivity3 extends AppCompatActivity {private RecyclerView rv_start;private List<News> list=new ArrayList<>();private String result;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main3);rv_start=findViewById(R.id.rv_start);initData();}private void initData() {new Thread(new Runnable() {@Overridepublic void run() {result= NetWorkUtil.doGet("https://api.vvhan.com/api/hotlist? type=36Ke");handler.sendEmptyMessage(0x111);}}).start();}NetWorkUtil自定義的工具類:
package com.hp.demo.util;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL;public class NetWorkUtil {public static String doGet(String urls){String result="";try {// 1. 得到訪問地址的URLURL url=new URL(urls);// 2. 得到網絡訪問對象java.net.HttpURLConnectionHttpURLConnection connection= (HttpURLConnection) url.openConnection();/* 3. 設置請求參數(過期時間,輸入、輸出流、訪問方式),以流的形式進行連接 */// 設置是否向HttpURLConnection輸出connection.setDoOutput(false);// 設置是否從HttpUrlConnection讀入connection.setDoInput(true);// 設置請求方式connection.setRequestMethod("GET");// 設置是否使用緩存connection.setUseCaches(true);// 設置此 HttpURLConnection 實例是否應該自動執行 HTTP 重定向connection.setInstanceFollowRedirects(true);// 設置超時時間connection.setConnectTimeout(3000);// 連接connection.connect();// 4. 得到響應狀態碼的返回值 responseCodeint code = connection.getResponseCode();// 5. 如果返回值正常,數據在網絡中是以流的形式得到服務端返回的數據if (code==200){ // 正常響應// 從流中讀取響應信息BufferedReader reader=new BufferedReader(new InputStreamReader(connection.getInputStream()));String lin;//循環從流中讀取while ((lin=reader.readLine())!=null){result+=lin;}// 關閉流reader.close();}// 6. 斷開連接,釋放資源connection.disconnect();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return result;} }第七步:傳遞數據,數據解析
private Handler handler= new Handler(Looper.getMainLooper()){@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);if (msg.what==0x111){try {JSONObject object=new JSONObject(result);JSONArray data = object.getJSONArray("data");for (int i = 0; i < data.length(); i++) {JSONObject object1 = data.getJSONObject(i);News news=new News(object1.getString("title"),object1.getString("desc"),object1.getString("pic"));list.add(news);}NewsAdapter adapter=new NewsAdapter(list);LinearLayoutManager layoutManager=new LinearLayoutManager(MainActivity3.this);rv_start.setLayoutManager(layoutManager);rv_start.setAdapter(adapter);} catch (JSONException e) {e.printStackTrace();}}}};第八步:當數據完畢后,給RecycleView設置適配器
package com.hp.demo;import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView;import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message;import com.hp.demo.adapter.NewsAdapter; import com.hp.demo.model.News; import com.hp.demo.util.NetWorkUtil;import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject;import java.util.ArrayList; import java.util.List;public class MainActivity3 extends AppCompatActivity {private RecyclerView rv_start;private List<News> list=new ArrayList<>();private String result;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main3);rv_start=findViewById(R.id.rv_start);initData();}private void initData() {new Thread(new Runnable() {@Overridepublic void run() {result= NetWorkUtil.doGet("https://api.vvhan.com/api/hotlist? type=36Ke");handler.sendEmptyMessage(0x111);}}).start();}private Handler handler= new Handler(Looper.getMainLooper()){@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);if (msg.what==0x111){try {JSONObject object=new JSONObject(result);JSONArray data = object.getJSONArray("data");for (int i = 0; i < data.length(); i++) {JSONObject object1 = data.getJSONObject(i);News news=new News(object1.getString("title"),object1.getString("desc"),object1.getString("pic"));list.add(news);}NewsAdapter adapter=new NewsAdapter(list);LinearLayoutManager layoutManager=new LinearLayoutManager(MainActivity3.this);rv_start.setLayoutManager(layoutManager);rv_start.setAdapter(adapter);} catch (JSONException e) {e.printStackTrace();}}}}; }復盤
????????1.HttpURLConnection(線程+Handler)
? ? ? ? ? ? ? ? ? ? ? ? 發送GET步驟(請求服務器,并從服務器接收到信息)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 獲取URL
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 獲取工具
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 設置參數
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 開始連接
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 處理返回結果
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 釋放資源
? ? ? ? ? ? ? ? ? ? ? ?發送POST步驟(請求服務器,并向服務器發送數據,然后從服務器接收到信息)? ? ??
????????????????????????????????????????獲取URL
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 獲取工具類
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 設置參數
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 開始連接
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 發送數據
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 處理返回結果
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 釋放資源
總結
以上是生活随笔為你收集整理的Android网络通信(HttpURLConnection)和 数据传输格式(JSON)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle分析函数-first_val
- 下一篇: 【开源掌机】百问网DShanMCU-Mi