日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android网络通信(HttpURLConnection)和 数据传输格式(JSON)

發(fā)布時(shí)間:2023/12/20 Android 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android网络通信(HttpURLConnection)和 数据传输格式(JSON) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.Http網(wǎng)絡(luò)請(qǐng)求方法

? ? ? Http的請(qǐng)求方法代表了客戶端想對(duì)服務(wù)器進(jìn)行的操作,比如: POSTGETHEADPUTDELETE ? ? ? TRACEOPTIONS 。 常用的不過(guò)于CRUD四個(gè)。 增:PUT;刪:DELETE;改: POST;查: GET

1.1GET POST

???????GET

向服務(wù)器請(qǐng)求數(shù)據(jù),獲取資源,在大部分網(wǎng)絡(luò)請(qǐng)求中,GET方法非常常見,并且它具有冪等性。 GET請(qǐng)求沒(méi)有請(qǐng)求體,對(duì)于GET請(qǐng)求的請(qǐng)求參數(shù)在URL后面加上一個(gè)"?"的后面,參數(shù)以 key=value 的形式。參數(shù)與參數(shù)之間使用"&"進(jìn)行連接。 GET請(qǐng)求是通過(guò) URL 傳輸參數(shù)的,所以GET請(qǐng)求可以傳輸?shù)膮?shù)是有限的。

? ? ? POST

用于向表單提交數(shù)據(jù),傳送的數(shù)據(jù)放在請(qǐng)求體中。 POST請(qǐng)求中,請(qǐng)求參數(shù)放在請(qǐng)求體中,服務(wù)器會(huì)根據(jù)POST請(qǐng)求體中的參數(shù)創(chuàng)建一個(gè)頁(yè)面,然后 返回給客戶端。POST不具有冪等性。

2.HttpURLConnection

2.1Android設(shè)置網(wǎng)絡(luò)權(quán)限

AndroidManifest.xml中添加 <uses-permission android:name="android.permission.INTERNET" />

2.2HttpURLConnection簡(jiǎn)介

JDK java.net 包中已經(jīng)提供了訪問(wèn)HTTP協(xié)議的基本功能的類:HttpURLConnection HttpURLConnectionJava的標(biāo)準(zhǔn)類,它繼承自URLConnection,可用于向指定網(wǎng)站發(fā)送GET請(qǐng)求、 POST請(qǐng)求。 它在URLConnection的基礎(chǔ)上提供了如下便捷的方法: int getResponseCode(); // 獲取服務(wù)器的響應(yīng)代碼。 String getResponseMessage(); // 獲取服務(wù)器的響應(yīng)消息。 String getResponseMethod(); // 獲取發(fā)送請(qǐng)求的方法。 void setRequestMethod(String method); // 設(shè)置發(fā)送請(qǐng)求的方法。

2.3HttpURLConnection說(shuō)明?

●HttpURLConnection對(duì)象不能直接構(gòu)造,需要通過(guò)URL類中的openConnection()方法來(lái)獲? ??得。 ●對(duì)HttpURLConnection對(duì)象的配置都需要在connect()方法執(zhí)行之前完成,因?yàn)?/span>connect()會(huì) ??根據(jù)HttpURLConnection對(duì)象的配置值生成HTTP頭部信息。 ●HttpURLConnection的connect()函數(shù),實(shí)際上只是建立了一個(gè)與服務(wù)器的TCP連接,并沒(méi)? ? 有實(shí)際發(fā)送HTTP請(qǐng)求。**HTTP請(qǐng)求實(shí)際上直到我們獲取服務(wù)器響應(yīng)數(shù)據(jù)(如調(diào) ??用??getInputStream()、getResponseCode()等方法)時(shí)才正式發(fā)送出去** ? HttpURLConnection是基于HTTP協(xié)議的,其底層通過(guò)socket通信實(shí)現(xiàn)。如果不設(shè)置超時(shí) timeout),在網(wǎng)絡(luò)異常的情況下,可能會(huì)導(dǎo)致程序僵死而不繼續(xù)往下執(zhí)行 ●HTTP正文的內(nèi)容是通過(guò)OutputStream流寫入的, 向流中寫入的數(shù)據(jù)不會(huì)立即發(fā)送到網(wǎng)? ? ? ? 絡(luò),而是存在于內(nèi)存緩沖區(qū)中,待流關(guān)閉時(shí),根據(jù)寫入的內(nèi)容生成HTTP正文。?調(diào)用? ? ? ? ? ? ??getInputStream()方法時(shí),返回一個(gè)輸入流,用于從中讀取服務(wù)器對(duì)于HTTP請(qǐng)求的返信息。 ●我們可以使用HttpURLConnection.connect()方法手動(dòng)的發(fā)送一個(gè)HTTP請(qǐng)求,但是如果要? ??獲取HTTP響應(yīng)的時(shí)候,請(qǐng)求就會(huì)自動(dòng)的發(fā)起,HttpURLConnection.getInputStream()方法? ??的時(shí)候,比如我們所以完全沒(méi)有必要調(diào)用connect()方法。

3.?JSON

????????Json(Javascript Object notation)作為一種輕量級(jí)的數(shù)據(jù)傳輸格式,在現(xiàn)代軟件開發(fā)中廣泛使用,采用完 ????????全獨(dú)立于語(yǔ)言的文本格式,具有可讀性強(qiáng)、編寫容易,更利于機(jī)器的解析與生成。

?3.1JSON的結(jié)構(gòu)

JSON具有以下這些表現(xiàn)形式 對(duì)象(JSONObject) ????????對(duì)象是一個(gè)無(wú)序的“‘名稱/對(duì)集合。一個(gè)對(duì)象以“{”(左括號(hào))開始,“}”(右括號(hào))結(jié)束。每個(gè)名稱后跟一個(gè) “:”(冒號(hào))“‘名稱/對(duì)之間使用“,”(逗號(hào))分隔。 JSONObject結(jié)構(gòu)圖 ??? ????????●數(shù)組(JSONArray) ????????數(shù)組是值(value)的有序集合。一個(gè)數(shù)組以“[”(左中括號(hào))開始,“]”(右中括號(hào))結(jié)束。值之間使用“,”(逗號(hào))分隔。

4.從網(wǎng)絡(luò)端獲取新聞,并將新聞放入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>

第二步:創(chuàng)建子布局 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>

第三步:創(chuàng)建實(shí)體類 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;} }

第四步:創(chuàng)建適配器 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();} }

第六步:開始進(jìn)行網(wǎng)絡(luò)編程

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. 得到訪問(wèn)地址的URLURL url=new URL(urls);// 2. 得到網(wǎng)絡(luò)訪問(wèn)對(duì)象java.net.HttpURLConnectionHttpURLConnection connection= (HttpURLConnection) url.openConnection();/* 3. 設(shè)置請(qǐng)求參數(shù)(過(guò)期時(shí)間,輸入、輸出流、訪問(wèn)方式),以流的形式進(jìn)行連接 */// 設(shè)置是否向HttpURLConnection輸出connection.setDoOutput(false);// 設(shè)置是否從HttpUrlConnection讀入connection.setDoInput(true);// 設(shè)置請(qǐng)求方式connection.setRequestMethod("GET");// 設(shè)置是否使用緩存connection.setUseCaches(true);// 設(shè)置此 HttpURLConnection 實(shí)例是否應(yīng)該自動(dòng)執(zhí)行 HTTP 重定向connection.setInstanceFollowRedirects(true);// 設(shè)置超時(shí)時(shí)間connection.setConnectTimeout(3000);// 連接connection.connect();// 4. 得到響應(yīng)狀態(tài)碼的返回值 responseCodeint code = connection.getResponseCode();// 5. 如果返回值正常,數(shù)據(jù)在網(wǎng)絡(luò)中是以流的形式得到服務(wù)端返回的數(shù)據(jù)if (code==200){ // 正常響應(yīng)// 從流中讀取響應(yīng)信息BufferedReader reader=new BufferedReader(new InputStreamReader(connection.getInputStream()));String lin;//循環(huán)從流中讀取while ((lin=reader.readLine())!=null){result+=lin;}// 關(guān)閉流reader.close();}// 6. 斷開連接,釋放資源connection.disconnect();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return result;} }

第七步:傳遞數(shù)據(jù),數(shù)據(jù)解析

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();}}}};

第八步:當(dāng)數(shù)據(jù)完畢后,給RecycleView設(shè)置適配器

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();}}}}; }

復(fù)盤

????????1.HttpURLConnection(線程+Handler)

? ? ? ? ? ? ? ? ? ? ? ? 發(fā)送GET步驟(請(qǐng)求服務(wù)器,并從服務(wù)器接收到信息)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 獲取URL

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 獲取工具

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 設(shè)置參數(shù)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 開始連接

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 處理返回結(jié)果

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 釋放資源

? ? ? ? ? ? ? ? ? ? ? ?發(fā)送POST步驟(請(qǐng)求服務(wù)器,并向服務(wù)器發(fā)送數(shù)據(jù),然后從服務(wù)器接收到信息)? ? ??

????????????????????????????????????????獲取URL

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 獲取工具類

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 設(shè)置參數(shù)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 開始連接

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 發(fā)送數(shù)據(jù)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 處理返回結(jié)果

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 釋放資源

總結(jié)

以上是生活随笔為你收集整理的Android网络通信(HttpURLConnection)和 数据传输格式(JSON)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。