應(yīng)聘職位:Android開發(fā)工程師
復(fù)習(xí)概要
1.Java
-
類(class)
在Java中,類文件是以.java為后綴的代碼文件,在每個類文件中最多只允許出現(xiàn)一個public類,當(dāng)有public類的時候,類文件的名稱必須和public類的名稱相同,若不存在public,則類文件的名稱可以為任意的名稱(當(dāng)然以數(shù)字開頭的名稱是不允許的)。
在類內(nèi)部,對于成員變量,如果在定義的時候沒有進行顯示的賦值初始化,則Java會保證類的每個成員變量都得到恰當(dāng)?shù)某跏蓟?br>
1)對于 char、short、byte、int、long、float、double等基本數(shù)據(jù)類型的變量來說會默認初始化為0(boolean變量默認會被初始化為false);
2)對于引用類型的變量,會默認初始化為null。
如果沒有顯示地定義構(gòu)造器,則編譯器會自動創(chuàng)建一個無參構(gòu)造器,但是要記住一點,如果顯示地定義了構(gòu)造器,編譯器就不會自動添加構(gòu)造器。注意,所有的構(gòu)造器默認為static的。
3) 類的加載順序
static 代碼塊->類屬性->類構(gòu)造函數(shù)
-
面向?qū)ο笕筇匦?/h6>
封裝:簡單的說就是將一個類針對屬性和操作進行封裝。
繼承:extends ,子類繼承父類。
<pre><code>
public class Person {
private String username;//不可繼承
private String password;//不可繼承
protected String description;//可繼承
public void eat(){ //可繼承
System.out.print("start eat")
}
}
public class Man extends Person{
@override
public void eat(){//覆蓋override
System.out.print("start man eat")
}
//1 和2 屬于重載,其中3 返回值為int 不屬于。
public void run(int mis){//1
}
public void run(int mis,String name){//2
}
public int run(){//3
}
}
</code>
</pre>
- 所有類隱示繼承Object類
- 只允許單繼承,同時屬于統(tǒng)一package 下才能繼承
- 繼承public ,protected 關(guān)鍵字修飾的method 和屬性, private 屬于私有,無法繼承
- 如果子類與父類出現(xiàn)屬性和方法同名,需要利用super.method/屬性,才能進行調(diào)用父類的屬性和method,不然只能調(diào)用this 類的屬性和method。
5)子類不能繼承父類的構(gòu)造函數(shù)。如果構(gòu)造函數(shù)有參數(shù),子類需要利用super(參數(shù)) 進行調(diào)用。 - final 修飾的類,無法重載,其中String
多態(tài):允許不同類的對象對同一消息作出響應(yīng)(多種動物,都可以eat)
1)覆蓋 override(子類的方法和父類的方法一樣) - 父類引用指向子類
<pre><code>Person person=new Man() </code></pre> - 重載 overload 一個類中的多個同名方法(參數(shù)個數(shù),類型) 注意:返回類型不同,不屬于重載。
-
Collection 和Map 集合
- collection三大分類:List(有序)和Set(無序),Queue(隊列)
- List 常見子類:ArrayList(線程不同步,線程不安全,數(shù)組的形式實現(xiàn)),Vector(線程安全,線程同步),LinkedList(線程不安全,鏈表的形式實現(xiàn))
3)Set 常見集合:HashSet,TreeSet,EnumSet, 利用迭代器(Iterator)進行遍歷
4)map<K,V>常見類:HashMap(線程不安全),HashTable(線程安全)
-
線程(Runnable,Thread)
線程:程序執(zhí)行的最小單元,有五種狀態(tài):新建,就緒,執(zhí)行,等待,死亡。
- 接口Runnable
<pre><code>public void run() 方法 執(zhí)行線程</code></pre> - 線程生命周期
<pre><code>new->start()->run()->阻塞(join(),sleep(),wait())->死亡</code></pre>
- 創(chuàng)建線程
<pre><code>
//方式1
new Thread(){
public void run(){
//code
}
}.start();
//方式2
public class MyThread implements Runnable{
public void run(){
//code
}
}
MyThread mythread=new MyThread();
new Thread(mythread).start();
</code></pre>
-
系統(tǒng)線程池
ExecutorService接口(java 自帶)- CachedThreadPool 緩沖的線程池,
- FixedThreadPool 自定線程數(shù)的線程池
- SingleThreadExecutor 單線程池
- ScheduledThreadPool 定時線程池
線程與進程的區(qū)別
線程像是進程的單元細胞。一個進程至少有一個線程,進程有單獨的地址空間,然后線程沒有。
-
異常(Throwable)
- 異常分類:Error 和Exception
<pre><code> Error : StackOverFlowError(棧溢出),OutOfMemoryError(內(nèi)存溢出)</pre></code>
Exception:
<pre><code>
RuntimeException(ArrayIndexOutOf,NullPointer,Arrithmetic,
ClassNotFound,IIlegalArgument,UnkownType)
非運行時異常 (IO, SQL)</code>
</pre> - 異常處理
關(guān)鍵字 try catch finally
<pre><code>
try{
// code
}catch(異常類){
// code
}finally{
//無論發(fā)生何種異常最后都會走finally 代碼塊中
}
</code></pre> - throws 關(guān)鍵字 和throw 關(guān)鍵字
throws 用得最多的是將dao 層中的異常拋到service 中進行處理
<pre><code>
dao層: public void getUser() throws Exception
service層:
try{
dao.getUser();
}catch(Exception e){
//code;
}
</code></pre>
throw 關(guān)鍵字主要用于代碼塊
<pre><code>
if(條件){
throw new CustomException("message");
}
</code></pre> - 自定義異常
自定義異常,CustonException extends Exception
-
String 類
- 為何定義為不變類
String 為何為final 類,需要從幾個方法進行討論
1.字符串常量池的需要
引用->內(nèi)存->常量池
<pre><code>
String a="abc";
String b="abc";
String c= new String("abc")
if (a==b) // true
if (a==c) // false
if (a==c.intern()) //true
</code></pre>
2.運行緩存HashCode
能夠保證hashCode的唯一性,保證String在java 中頻繁使用的高性能。
3.安全性
不變模式可以挺高多線程程序的性能,降低多線程程序復(fù)雜度,保證多線程下的安全性。 - StringBuffer ,StringBuilder String 三者的區(qū)別
<pre><code>
String a="abc"+"def"+"yes"; //1
StringBuffer b="abc".append("def").append("yes");//2 性能高于1
</code></pre>StringBuffer 線程安全
StringBuilder 線程不安全,單線程下StringBuilder 多字符串操作性能最好。
3)==與equals方法 區(qū)別
<pre><code>
String a="abc";
String b=new String("abc")
if(a==b) //false 比較的是引用所指向的對象內(nèi)存地址
if(a.equals(b)) //true 比較兩者的value
</code></pre>
-
JVM
- 內(nèi)部結(jié)構(gòu)
Runtime Data Area(運行區(qū)):
1.程序計數(shù)器:線程私有
2.本地方法棧:線程私有
3.虛擬機棧:線程私有
4.方法區(qū):線程共享
5.堆區(qū):線程共享
ClassLoader(類加載器):將class 文件裝載到方法區(qū)
Execution Engine(執(zhí)行引擎) :執(zhí)行.class文件指令
NativeInterface(本地接口):與native libraries交互
-
四大引用
1)強引用: 一直不會回收,內(nèi)存不足時,出現(xiàn)OOM
2)軟引用: 當(dāng)內(nèi)存不足時,GC進行回收
3)弱引用: 無論內(nèi)存是否足夠,只要看點是弱引用,都進行回收
4)虛引用: 只是跟蹤對象回收活動的一個監(jiān)視隊列
-
設(shè)計模式
1)單例模式(最優(yōu)方式:內(nèi)部類方式)
<pre><code>
public class Singleton{
private Singleton(){
}
private static class SingletonHodler{
private static Singleton instance=newSingleton();
public static Singleton getInstance(){
return SingletonHodler.instance;
}
}
}
</code></pre>
2)工廠模式
3)觀察者模式
-
常見陷進
- if-else
<pre><code>
if(true) System.out.println("if");
else System.out.println("else");
//編譯,執(zhí)行,打印輸出 if 。可見else 并沒有執(zhí)行
</code></pre> - static ,final
<pre><code>
class Ideone
{ static int i=10;
final static int a=10;
public void run(){
i++;
}
public void run1(){
//a++;出現(xiàn)編譯錯誤,因為final 修飾的是不可以進行更改的
//static int i=0; 在方法中定義static 變量,IntellijIDEA 中直接報錯,所有在方法定義是不被允許的。
}
public static void main (String[] args)
{ Ideone ido=new Ideone();
ido.run();
//ido.run1();
System.out.println(i);
}
}
//打印輸出為11. 其實一直都認為static 是保持不變,但是打印出來一直是一種錯覺。
</code></pre> - 引用傳值
<pre><code>
/Created by Darker on 15/8/11. /
public class Test360_2 {
int x=6;
int y=7;
public static void main(String[] args){
Test360_2 test360_2=new Test360_2();
print(test360_2.x,test360_2.y);
System.out.println(test360_2.x);
System.out.println(test360_2.y);
}
static void print(int x,int y){
x++;
y++;
System.out.println(x);
System.out.println(y);
}
}
//打印輸出7 8 , 6 7 可以看出,類屬性的值x.y并沒有改變
</code></pre> - break;return;continue;finally
<pre><code>
/** * Created by Darker on 15/8/11. */
public class Test360_2 {
public static void main(String[] args){
print();
}
static void print(){
try {
return ;
}
catch (Exception e){
}
finally {
System.out.println("yes");
}
}
}
//這行代碼打印出yes,也就證明無論如何return也好,都要執(zhí)行finally 代碼塊
</code></pre>break 則是直接跳出循環(huán)
continue 則是跳出本次循環(huán),進行下一次循環(huán) - ++i;i++
- 函數(shù)執(zhí)行順序
- for循環(huán)中的表達式
- 其他題目見到了再總結(jié)出來
2.Android
-
Android 四個組件
1)Activity:活動
1.生命周期
<pre><code>
onCreate() //1 創(chuàng)建activity
onStart() //2 啟動activity
onResume() //3 可見
onPause() //4 可見
onStop() //5 停止
onDestory() //6 銷毀
onRestart() //7 stop()->onRestart()再次onStart()
</code></pre>

2.context
Activity Context上下文,生命周期與activity一致,兩者共存亡,用于加載獲取資源,而Application Context 生命周期與整個應(yīng)用一致,頻繁的使用App-Context 容易造成OOM。
3.注冊方式
在AndroidManifest.xml 中進行注冊
<pre><code>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xxx.com.xxx" >
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
</activity>
</application>
</manifest>
</code></pre>
2)Service:服務(wù)
1.生命周期
其生命周期與其啟動方式密不可分。startService()和bindService() 啟動方式,start 方式:其生命周期與應(yīng)用無關(guān),bind 方式:則是與應(yīng)用共存亡。

2.與其他組件交互方式
與Activity 通信:binder方式,handlerMessage方式,AIDL方式,static方式
3)BroadcastReceiver:廣播
用于異步接收廣播Intent,便于各應(yīng)用/組件進行交互。
基本屬性
<pre><code>
1.繼承BroadcastReceiver 實現(xiàn) onReceive 方法
2.指定 action 一種是manifast文件中設(shè)置,一直是intent 設(shè)置
3.注冊
</code></pre>
注冊兩種方式
<pre><code>
1.AndroidManifest.xml 中靜態(tài)注冊
在應(yīng)用推出之后依然可以接受到廣播消息,造成耗電量,cpu等損耗。
2.代碼中 intent.registerReceiver(自定義的Receiver,filter);
這種方式,隨著注冊的方式,以及靈動性。應(yīng)用退出,
必須進行unregisterReceiver(自定義的Receiver) 取消綁定
</code></pre>
4)ContentProvider:內(nèi)容提供器
維護應(yīng)用數(shù)據(jù),方便應(yīng)用本身或其它應(yīng)用訪問
-
Handler機制
在為了避免Android ANR (Application Not Response 超過5s ,未響應(yīng)), 一般出現(xiàn)網(wǎng)絡(luò)請求或者加載大量數(shù)據(jù)的時候,都會開啟子線程,去完成這些任務(wù),UI線程繼續(xù)加載view,接受用戶操作。 等待(子線程)網(wǎng)絡(luò)請求結(jié)束,這時候需要進行對UI線程通信,進行頁面刷新,于是就需要用到handler。
1.首先闡述一下handler 機制:Thread,Looper,MessageQueue
Looper 為一個循環(huán),接收handler 發(fā)送的message,然后放到MessageQueue中, 等待條件(線程結(jié)束),handler 再通過looper從messageQueue中取出message ,處理對應(yīng)的handler 刷新UI線程。
- 創(chuàng)建方式
<pre><code>
//創(chuàng)建
Handler handler=new Handler(){
public void handlerMessage(Message msg){
//code
}
};
//發(fā)送消息,方式1 ,此方式性能上來說比方式2要高效,
//原因是由于此方式從Message池獲取message 對象,避免了重復(fù)分配新對象
Message msg=handler.obtainMessage();
msg.what=1;
msg.obj=xxx;
msg.sendToTarget();
//發(fā)送消息,方式2
Message msg=new Message();
msg.what=1;
msg.obj=xxx;
handler.sendMessage(msg);
</code></pre>
-
AsyncTask 機制
其實這也是一種異步加載的方式,由于在之前的項目中使用不是太多,具體了解不是很夠。然后應(yīng)用asyncTask必須記住幾條準(zhǔn)則
<pre><code>
1.Task的實例必須在UI thread中創(chuàng)建;
2.execute方法必須在UI thread中調(diào)用;
3.不要手動的調(diào)用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個方法;
4.該task只能被執(zhí)行一次,否則多次調(diào)用時將會出現(xiàn)異常;
</code></pre>代碼實現(xiàn)
<pre><code>
public class MyAsyncTask extends AsyncTask{
@override
onPreExecute(){
//操作前
}
@override
onPostExecute(){
//再次刷新UI
}
@override
doinBackground(){
//后臺代碼執(zhí)行
}
@override
onProgressUpdate(){
//進度更新
}
@override
onCancelled(){
//用戶取消操作
}
}
//UI thread
MyAsyncTask task=new MyAsyncTask();
task.execute();
</code></pre>
-
數(shù)據(jù)存儲
1)輕量級數(shù)據(jù)庫sqlite
1.創(chuàng)建數(shù)據(jù)庫
<pre><code>
public class MYSQLiteHelper extends SQLiteOpenHelper {
//構(gòu)造函數(shù) parm:context
@override
onCreate() //創(chuàng)建
@override
onUpgrade() //更新版本
}
//調(diào)用數(shù)據(jù)庫
MYSQLiteHelper helper=new MYSQLiteHelper(this)
SQLiteDatabase db=helper.getWritableDatabase();//可寫
//操作數(shù)據(jù)庫,有很多封裝好的方法,可以調(diào)用這里就不一一說明
String sql="sql語句";
db.execSQL(sql);
</code></pre>
2.曾經(jīng)使用XUtils 工具類中對object 完成ORM 印射到數(shù)據(jù)庫,使用效率,操作都是很方便的,不凡拿來試用一下。
2)SharedPreference
這個簡單的存儲<code>用戶設(shè)置級</code>數(shù)據(jù)。
3)File
1.內(nèi)存卡
2.外置SD卡
-
網(wǎng)絡(luò)請求
網(wǎng)絡(luò)請求在應(yīng)用中是一塊很重要的組成部分。
1)com.net.HttpConnection
//post方式, get方式
<pre><code>
public void httpRequestWithPost(URL url){
//1 打開鏈接,接下來可以寫一下簡單的屬性設(shè)置
httpConnection=url.openConnection();
httConnection.setRequestMethod("Post");//默認為get
//2 建立鏈接
httpConnection.connect();
//3 發(fā)送請求,記得關(guān)閉數(shù)據(jù)流
DataOutputStream dos = new DataOutputStream(httpConnection.getOutputStream());
dos.write(postData);
dos.flush();
dos.close();
//4 數(shù)據(jù)處理
httpConnection.getResponseCode ==200 {
//code 處理獲取流
}
}
</code></pre>
2)org.apache.http.HttpPost/HttpGet
1.HttpPost
<pre><code>
HttpPost post=new HttpPost(url);
//添加參數(shù)
List<NameValuePair> params =newArrayList<NameValuePair>();
params.add(new BasicNameValuePair("id", "helloworld"));
//設(shè)置字符集
HttpEntity entity = new UrlEncodedFormEntity(params, HTTP.UTF_8);
//設(shè)置參數(shù)實體
httpPost.setEntity(entity);
//獲取HttpClient對象
HttpClient httpClient = new DefaultHttpClient();
// 獲取HttpResponse實例
HttpResponse httpResp = httpClient.execute(httpPost);
//最后進行判斷 code==200 處理數(shù)據(jù)
String result = EntityUtils.toString(httpResp.getEntity(), "UTF-8");
</code></pre>
2.HttpGet
<pre><code>
HttpGet httpGet = new HttpGet(url);
// 獲取HttpClient對象
HttpClient httpClient = new DefaultHttpClient();
// 獲取HttpResponse實例
HttpResponse httpResp = httpClient.execute(httpGet);
// 判斷是夠請求成功
if(httpResp.getStatusLine().getStatusCode() == HTTP_200)
{
//獲取返回數(shù)據(jù)
String result = EntityUtils.toString(httpResp.getEntity(), "UTF-8");
}
</code></pre>
- 其他網(wǎng)絡(luò)請求方式
1.其實用得最多的就是Google 出得第三方Volley,原因是由于項目中經(jīng)常用到j(luò)son 數(shù)據(jù)格式,volley 封裝的很好,針對請求線程處理封裝,回調(diào)很不錯,我也將其封裝到自己的框架中作為網(wǎng)絡(luò)處理模塊的utils。
2.ImageLoader 用于加載圖片的一個工具類,其實功能上還是很強大的。但是由于之前的項目中加載多張圖片,出現(xiàn)閃爍的情況。所以決定放棄使用這個第三方,最后還是用Volley加載圖片的方式進行解決。
3.當(dāng)然還有一些處理FTP 網(wǎng)絡(luò)請求的。具體不記得了。
-
數(shù)字簽名
之所以寫這個問題,是因為在平時發(fā)布apk 的時候,是需要一個簽名,但是并沒有研究這個簽名,在android系統(tǒng)中的作用和幾個要點。
1)所有應(yīng)用都需要數(shù)字證書,android系統(tǒng)不會接受一個沒有數(shù)字證書的應(yīng)用
2)Android 程序包有自帶的數(shù)字簽名,不需要一個有權(quán)威的認證機構(gòu)
3)發(fā)布android需要一個合適的私鑰來生成數(shù)字簽名,不能利用打ant等插件進行發(fā)布
4)數(shù)字簽名的有效期,android系統(tǒng)只會在安裝應(yīng)用的時候,檢查數(shù)字簽名的有效期,當(dāng)安裝之后,應(yīng)用到期依然可以在系統(tǒng)中使用。
-
Activity 啟動4 種方式
之所以出來總結(jié)一下這幾個點,是因為在平時做項目中要用到。在注冊activity 時候,需要在AndroidManifast.xml去配置 android:lanuchMode="xxx"
- Standared 模式,也是默認模式。一旦activity被創(chuàng)建都會進入到工作棧中。
- SingleTop模式,需要判斷當(dāng)前activity 是否到棧頂,如果在則不需要重新產(chǎn)生實例,不在則重新創(chuàng)建實例。
- SingleTask模式,這個模式相當(dāng)霸道,如果本身存在在工作棧中,則將其他處于他之上的activity 全部移除,使自己處于棧頂,沒有存在工作棧中,則重新創(chuàng)建,push 到棧頂。
4)SingleInstance模式,保證工作棧中只有一個實例存在,在調(diào)用時會移動到棧頂。
-
XML布局中常見模糊的屬性
- magin 和padding 的區(qū)別
<pre><code>
Padding 為內(nèi)邊框,指該控件內(nèi)部內(nèi)容,如文本/圖片距離該控件的邊距
Margin 為外邊框,指該控件距離邊父控件的邊距
</code></pre> - ListView item 分割線
<pre><code>
android:divider="#fffff" 分割線顏色 value="@null" 為去掉分割線
android:dividerHeight="1px" 分割線高度
</code></pre> - ImageView 中的android:scaleType 屬性
<pre><code>
CENTER:超過布局,圖片裁剪中心,填充布局。
CENTER_CROP:按比例放大,填充整個布局居中顯示。
CENTER_INSIDE:按比例縮小,內(nèi)容完全顯示。
FIT_CENTER:把圖片按比例擴大/縮小到View的寬度,居中顯示
FIT_XY:不按比例縮放,顯示填充整個布局。
</code></pre>
-
Android 推送
之前項目中也是用到推送(極光推送),推送有兩種方式.
- pull 方式:客戶端輪詢發(fā)送請求,檢查服務(wù)器數(shù)據(jù)是否更新從而實現(xiàn)推送的效果,這種方式由于客戶端進行輪詢,所以耗資源,電量,流量都很多,但是這個方式,實現(xiàn)起來相對簡單。
- push方式:服務(wù)器進行推送數(shù)據(jù),基于tcp 長連接的方式,客戶端利用AlarmManager 進行定時發(fā)送心跳包,來維持與服務(wù)器的連接。
-
常見Android 異常,及其優(yōu)化
經(jīng)過兩年多的android開發(fā),大大小小的異常以及bug,見過很多.
- 忘記在AndroidManifest.xml 中 注冊activity, service,user-permission 等
- 生命周期應(yīng)用不準(zhǔn)確,導(dǎo)致activity 或者service 銷毀,出現(xiàn)處理異常
- 多線程處理數(shù)據(jù)的時候,造成數(shù)據(jù)紊亂。
- 未獲取view 的id, 使用view 造成空指針錯誤
- listview 加載數(shù)據(jù)的時候出現(xiàn)錯位
- 控件焦點問題
- 手勢沖突
- 圖片處理,緩存
- Touch 事件傳遞
- handler 可能造成內(nèi)存溢出
實在太多,具體情況,還需要在項目中進行總結(jié)。
3.數(shù)據(jù)結(jié)構(gòu)和算法
-
常見排序算法
其實,幾種基本的算法,在平時項目中并沒有使用,經(jīng)常是使用系統(tǒng)封裝好的一些類,來進行操作,如果不去參考源碼,根本不知道里面的原委,也不了解這幾種常見的排序算法,所存在的作用。
- 快速排序
- 選擇排序
- 插入排序
- 冒泡排序
- 希爾排序
- 堆排序
-
鏈表
-
數(shù)組
-
隊列
-
樹
-
圖
-
哈希
4.Linux
5.計算機網(wǎng)絡(luò)
-
IP協(xié)議
生活中,經(jīng)常聽到ip 地址這個概念。這個屬于網(wǎng)絡(luò)層的協(xié)議,那么IP分為哪幾類呢,也是常考選擇題之一。
- A 類
<pre><code>
地址范圍 1.0.0.1-126.255.255.254
</code></pre>2) B 類
<pre><code>
地址范圍 128.1.0.1-191.254.255.254
</code></pre>3) C 類
<pre><code>
地址范圍 192.0.1.1-223.255.255.254
</code></pre>4) D 類
<pre><code>
地址范圍 224.0.0.1-239.255.255.254
</code></pre>5) E 類
<pre><code>
E類地址保留,僅作實驗和開發(fā)用
</code></pre>
-
TCP/UDP協(xié)議
還記得第一次聽到這兩個概念,還是在大三的計算機網(wǎng)絡(luò)的課程上,然而并沒有在意,以至于在大三騰訊實習(xí)生,面試官問到這個問題,表達的一塌糊涂。
- TCP
TCP 屬于計算機網(wǎng)絡(luò)結(jié)構(gòu)中的傳輸層,"三次握手"的基于連接方式,需要消耗的系統(tǒng)資源要求要多一些。 - UDP
UDP 同樣屬于傳輸層,基于無連接的方式,傳遞數(shù)據(jù),以不靠譜的狀態(tài),不保證數(shù)據(jù)的完整,消耗著系統(tǒng)較少的資源。
-
Http協(xié)議
- Http超文本傳輸協(xié)議
在網(wǎng)絡(luò)傳輸過程當(dāng)中,我們用得最多便是http 協(xié)議,如今許多公司已經(jīng)開始支持https,但是我們不由的還是會選擇http,一直也是面試官常常提到的一些問題所在,所以來談?wù)勥@個http協(xié)議。
http請求體
<pre><code>
//請求行
Method URL Version{
Method:GET,POST,DELETE,PUT,HEAD 等
URL:請求的url
Version:http 的版本(目前1.1)
}
//請求頭
Headers{
Accept-Language: 語言
Accept-Charset: 支持字符編碼
Accept: 請求類型(image/txt等)
Accept-Encoding: 瀏覽器支持的壓縮類型
User-Agent: 代理(瀏覽器等)
Host: 域名
Connection: Keep-Alive(持久鏈接)
}
//請求體
Message Body{
//發(fā)送的一些請求數(shù)據(jù)
}
</code></pre>
http響應(yīng)體
<pre><code>
//狀態(tài)行
Version Status-Code Description{
version:http的版本(1.1)
Status-Code:響應(yīng)狀態(tài)碼{
常見:200(請求成功),500(服務(wù)器錯誤),404(文件不存在)
1xx:
2xx:
3xx:
4xx:
5xx:
}
Description{
描述
}
}
//消息報頭{
Date:
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
.
}
//響應(yīng)正文
MessageBody{
一些xml格式,或者json格式
}
</code></pre>
-
Get和Post 區(qū)別
- GET 方式:在剛剛進入到it 界的時候,那時,只會get 方式,也只會將參數(shù)放在url 上面進行傳遞,后面發(fā)現(xiàn)參數(shù)過多,get方式(MAX=2048個字符,雖然這個數(shù)字網(wǎng)上大部分這么說,但是不能保證,必須自己求情服務(wù)器的時候去測一測)無法滿足需求的時候,才研究到了post(人呆板),當(dāng)然get 也可以在http 種的cookie 中進行傳參。
<pre><code>
host:port/test/test.do?name1=value1&name2=value2</code></pre> - POST 方式:直觀上講,post 方式,是將參數(shù)內(nèi)容,放到了http 請求體的body 里面,這樣來說參數(shù)內(nèi)容并沒有保留在瀏覽器的請求鏈接上,從安全性來講是略勝一籌。然后無論是post 多少參數(shù)都可以,是沒有參數(shù)大小限制。
<pre><code>
POST /test/test.do
HTTP/1.1
Host: xxx.xxx.xxx.xx
data={
json 串
}
</code></pre>