HTTP GET及POST方式

網(wǎng)絡(luò)協(xié)議的知識(shí)湖雹,數(shù)據(jù)在Internet上傳輸,一般通過(guò)三種協(xié)議來(lái)實(shí)現(xiàn)發(fā)送信息和實(shí)現(xiàn):

HTTP協(xié)議程剥,也是在工作中最常用的劝枣,是建立在TCP/IP基礎(chǔ)上實(shí)現(xiàn)的。

FTP協(xié)議织鲸。

TCP/IP協(xié)議舔腾,它也是最低層的協(xié)議,其它的方式必須要通過(guò)它搂擦,但是想要實(shí)現(xiàn)這種協(xié)議必須要實(shí)現(xiàn)socket編程稳诚,這種方法是用來(lái)上傳一些比較大的文件,視頻瀑踢,進(jìn)行斷電續(xù)傳的操作扳还。

HTTP協(xié)議

  下面詳細(xì)講解一下HTTP協(xié)議,因?yàn)镠TTP是無(wú)狀態(tài)的協(xié)議橱夭,所以服務(wù)端并不記錄客戶(hù)端之前發(fā)送信息氨距,一碼歸一碼,所以HTTP協(xié)議使用報(bào)文頭的形式記錄狀態(tài)棘劣,一般分為請(qǐng)求報(bào)文和響應(yīng)報(bào)文俏让。一般用戶(hù)使用瀏覽器訪問(wèn)網(wǎng)頁(yè),是無(wú)需關(guān)心HTTP請(qǐng)求的報(bào)文頭的茬暇,因?yàn)殚_(kāi)發(fā)人員在瀏覽器中已經(jīng)幫忙處理了首昔,但是當(dāng)進(jìn)行開(kāi)發(fā)工作的時(shí)候,這些是必須要了解的糙俗。

  對(duì)于報(bào)文勒奇,一般關(guān)心請(qǐng)求方式,是GET或者是POST巧骚;請(qǐng)求數(shù)據(jù)類(lèi)型赊颠,是文本還是音頻格二;數(shù)據(jù)的編碼格式,一般用utf-8巨税;發(fā)送的數(shù)據(jù)長(zhǎng)度蟋定;響應(yīng)返回碼,一般200為成功草添,其他響應(yīng)碼都是有問(wèn)題驶兜。具體了解還是看看上面推薦的博客。

  HTTP/1.1協(xié)議中一共定義了八種方法(有時(shí)也叫“動(dòng)作”)來(lái)表明Request-URI指定的資源的不同操作方式远寸,但是一般常用的就是GET和POST方式抄淑。

  這里簡(jiǎn)單說(shuō)一下GET方式和POST方式的差別:

GET是從服務(wù)器上獲取數(shù)據(jù),POST是向服務(wù)器傳送數(shù)據(jù)驰后。

在客戶(hù)端肆资,GET方式在通過(guò)URL提交數(shù)據(jù),數(shù)據(jù)在URL中可以看到灶芝;POST方式郑原,數(shù)據(jù)放在HTML HEADER內(nèi)提交。

對(duì)于GET方式夜涕,服務(wù)器端用Request.QueryString獲取變量的值犯犁,對(duì)于POST方式,服務(wù)器用Request.Form獲取提交的數(shù)據(jù)女器。

GET方式提交的數(shù)據(jù)不能大于2KB(主要是URL長(zhǎng)度限制)酸役,而POST則沒(méi)有此限制。

安全性問(wèn)題驾胆。正如2中提到涣澡,使用GET的時(shí)候,參數(shù)會(huì)顯示在地址欄上丧诺,而POST不會(huì)入桂。所以,如果這些數(shù)據(jù)是中文數(shù)據(jù)而且是非敏感數(shù)據(jù)驳阎,那么使用GET事格;如果用戶(hù)輸入的數(shù)據(jù)不是中文字符而且包含敏感數(shù)據(jù),那么還是使用POST為好搞隐。

Java中使用HTTP

  下面通過(guò)兩個(gè)例子來(lái)分別講解一下GET和POST在Java中的使用,如果在Java中需要使用HTTP協(xié)議進(jìn)行訪問(wèn)远搪,一般通過(guò)HttpURLConnection類(lèi)來(lái)實(shí)現(xiàn)劣纲。

  HttpURLConnection繼承了URLConnection,所以在URLConnection的基礎(chǔ)上進(jìn)一步改進(jìn)谁鳍,增加了一些用于操作HTTP資源的便捷方法癞季。Java中HttpURLConnection對(duì)象通過(guò)URL.openConnection()方法來(lái)獲得劫瞳,需要進(jìn)行強(qiáng)制轉(zhuǎn)換。先來(lái)介紹幾個(gè)HttpURLConnection的常用方法:

void?setConnectTimeout(int timeout):設(shè)置連接超時(shí)時(shí)長(zhǎng)绷柒,如果超過(guò)timeout時(shí)長(zhǎng)志于,則放棄連接,單位以毫秒計(jì)算废睦。

void?setDoInput(boolean newValue) :標(biāo)志是否允許輸入伺绽。

void?setDoOutput(boolean newValue):標(biāo)志是否允許輸出。

String getRequestMethod():獲取發(fā)送請(qǐng)求的方法嗜湃。

int getResponseCode():獲取服務(wù)器的響應(yīng)碼奈应。

void setRequestMethod(String method):設(shè)置發(fā)送請(qǐng)求的方法。

void setRequestProperty(String field,String newValue):設(shè)置請(qǐng)求報(bào)文頭购披,并且只對(duì)當(dāng)前HttpURLConnection有效杖挣。

FutureTask可用于異步獲取執(zhí)行結(jié)果或取消執(zhí)行任務(wù)的場(chǎng)景。通過(guò)傳入Runnable或者Callable的任務(wù)給FutureTask刚陡,直接調(diào)用其run方法或者放入線程池執(zhí)行惩妇,之后可以在外部通過(guò)FutureTask的get方法異步獲取執(zhí)行結(jié)果,因此筐乳,F(xiàn)utureTask非常適合用于耗時(shí)的計(jì)算歌殃,主線程可以在完成自己的任務(wù)后,再去獲取結(jié)果哥童。另外挺份,F(xiàn)utureTask還可以確保即使調(diào)用了多次run方法,它都只會(huì)執(zhí)行一次Runnable或者Callable任務(wù)贮懈,或者通過(guò)cancel取消FutureTask的執(zhí)行等匀泊。

因?yàn)榭紤]到連接時(shí)間比較長(zhǎng),采用FutureTask


GET方式

public static String get(final String url) throws Exception {
??????? String r = null;
??????? FutureTask<String> task = new FutureTask<>(new Callable<String>() {
??????????? @Override
??????????? public String call() throws Exception {
??????????????? BufferedReader bufferedReader = null;
??????????????? String result = null;
??????????????? try {
??????????????????? URL realUrl = new URL(url);
??????????????????? HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
??????????????????? if (connection instanceof HttpsURLConnection) {
??????????????????????? SSLContext sslContext = SSLContextUtil.getSSLContext(mContext, "證書(shū)");
??????????????????????? if (sslContext != null) {
??????????????????????????? SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
??????????????????????????? ((HttpsURLConnection) connection).setSSLSocketFactory(sslSocketFactory);
??????????????????????? }
??????????????????? }

connection.connect();

//向本地寫(xiě)入數(shù)據(jù)

??????????????????? bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
??????????????????? String line;
??????????????????? StringBuffer sb = new StringBuffer();
??????????????????? while ((line = bufferedReader.readLine()) != null) {
??????????????????????? sb.append(line);
??????????????????? }
??????????????????? result = sb.toString();
??????????????? } catch (IOException e) {
???????????????????
??????????????? } catch (Exception e) {
??????????????????

//最終要關(guān)閉流

????????????? } finally {
??????????????????? if (bufferedReader != null) {
??????????????????????? try {
??????????????????????????? bufferedReader.close();
??????????????????????? } catch (IOException e) {
???????????????????????????
??????????????????????? }
??????????????????? }
??????????????? }
??????????????? return result;
??????????? }
??????? });
??????? new Thread(task).start();

???? try {
??????????? r = task.get();
??????? } catch (InterruptedException e) {
???????????
??????? } catch (ExecutionException e) {
??????????
??????? }
??????? return r;
??? }


POST方式

public static String post(final String url, final Map<String, Object> params) throws Exception {
??????? String r = null;
??????? final String TAG = "PostTag";
??????? FutureTask<String> task = new FutureTask<>(new Callable<String>() {
??????????? @Override
??????????? public String call() throws Exception {
??????????????? String result = null;
??????????????? BufferedReader bufferedReader = null

??????????????? PrintWriter out = null;
??????????????? LogUtil.d(TAG, "call: start ");
??????????????? try {
???????????????
??????????????????? String line = null;
??????????????????? StringBuffer sb = new StringBuffer();
??????????????????? URL realUrl = new URL(url);
??????????????????? int outTime = 5 * 1000; //超時(shí)設(shè)置
??????????????????? URLConnection connection = realUrl.openConnection();

//添加證書(shū)

??????????????????? if (connection instanceof HttpsURLConnection) {
??????????????????????? SSLContext sslContext = SSLContextUtil.getSSLContext(mContext, "證書(shū)");
??????????????????????? if (sslContext != null) {
??????????????????????????? SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
??????????????????????????? ((HttpsURLConnection) connection).setSSLSocketFactory(sslSocketFactory);
??????????????????????? }
??????????????????? }

//添加證書(shū)

////設(shè)置請(qǐng)求報(bào)文頭朵你,設(shè)定請(qǐng)求數(shù)據(jù)類(lèi)型

??????????????????? connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
??????????????????? connection.setConnectTimeout(outTime);

//設(shè)置允許輸入輸出

??????????????????? connection.setDoOutput(true);
??????????????????? connection.setDoInput(true);
??????????????????? connection.setUseCaches(false);
??????????????????? out = new PrintWriter(connection.getOutputStream());
??????????????????? out.print(getParams(params));
???????????????????
??????????????????? out.flush();

//把服務(wù)端返回的輸入流轉(zhuǎn)換成字符串格式

??????????????????? bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
??????????????????? while ((line = bufferedReader.readLine()) != null) {
??????????????????????? sb.append(line);
??????????????????????? Log.d(TAG, "call: while ");
??????????????????? }

?????????????????? result = sb.toString(); //結(jié)果返回
??????????????????? Log.d(TAG, "result: " + result);
??????????????? } catch (IOException e) {
??????????????????
??????????????????? throw e;
??????????????? } finally {
??????????????????? if (bufferedReader != null) {
??????????????????????? try {
??????????????????????????? bufferedReader.close();
??????????????????????? } catch (IOException e) {
??????????????????????????? Log.e(TAG, e.getCause(), "");
??????????????????????? }
??????????????????? }
??????????????? }

??????????????? return result;
??????????? }
??????? });

????? new Thread(task).start();
??????? try {
??????????? r = task.get();
??????? } catch (InterruptedException e) {
??????????? Log.e(TAG, e.getCause(), "");
??????????? Log.d(TAG, "post: " + "InterruptedException");
??????? } catch (ExecutionException e) {
??????????? Log.e(TAG, e.getCause(), "");
??????????? Log.d(TAG, "post: " + "ExecutionException");
??????? } catch (Exception e) {
??????????? Log.e(TAG, e.getCause(), "");
??????????? Log.d(TAG, "post: " + "");
??????? }
??????? return r;
??? }

//將請(qǐng)求參數(shù)轉(zhuǎn)換格式各聘,//請(qǐng)求的參數(shù)之間使用&分割。

?? private static String getParams(Map<String, Object> params) {
??????? StringBuffer sb = new StringBuffer();
??????? if (params != null) {
??????????? for (String key : params.keySet()) {
??????????????? sb.append(key).append("=").append(params.get(key).toString()).append("&");
??????????? }
??????????? if (sb.indexOf("&") == sb.length() - 1) {
??????????????? sb.deleteCharAt(sb.length() - 1);
??????????? }
??????? }
??????? return sb.toString();
??? }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抡医,一起剝皮案震驚了整個(gè)濱河市躲因,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忌傻,老刑警劉巖大脉,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異水孩,居然都是意外死亡镰矿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)俘种,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秤标,“玉大人绝淡,你說(shuō)我怎么就攤上這事〔越” “怎么了牢酵?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)衙猪。 經(jīng)常有香客問(wèn)我馍乙,道長(zhǎng),這世上最難降的妖魔是什么屈嗤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任潘拨,我火速辦了婚禮,結(jié)果婚禮上饶号,老公的妹妹穿的比我還像新娘铁追。我一直安慰自己,他們只是感情好茫船,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布琅束。 她就那樣靜靜地躺著,像睡著了一般算谈。 火紅的嫁衣襯著肌膚如雪涩禀。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天然眼,我揣著相機(jī)與錄音艾船,去河邊找鬼。 笑死高每,一個(gè)胖子當(dāng)著我的面吹牛屿岂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鲸匿,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼爷怀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了带欢?” 一聲冷哼從身側(cè)響起运授,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乔煞,沒(méi)想到半個(gè)月后吁朦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渡贾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年喇完,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锦溪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出府怯,到底是詐尸還是另有隱情刻诊,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布牺丙,位于F島的核電站则涯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏冲簿。R本人自食惡果不足惜粟判,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望峦剔。 院中可真熱鬧档礁,春花似錦、人聲如沸吝沫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惨险。三九已至羹幸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辫愉,已是汗流浹背栅受。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恭朗,地道東北人屏镊。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像冀墨,于是被迫代替她去往敵國(guó)和親闸衫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,031評(píng)論 0 2
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理诽嘉,服務(wù)發(fā)現(xiàn)蔚出,斷路器,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法虫腋,類(lèi)相關(guān)的語(yǔ)法骄酗,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法悦冀,異常的語(yǔ)法趋翻,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,632評(píng)論 18 399
  • 中醫(yī)所說(shuō)的“神志”,包括了精神盒蟆、意識(shí)踏烙、思維活動(dòng)师骗、情緒、性格讨惩、人格等等的總稱(chēng)辟癌。而情志,則是短期的情緒荐捻,還有長(zhǎng)期穩(wěn)定的...
    大中醫(yī)戴戴閱讀 821評(píng)論 0 3
  • 早上我拿著早就準(zhǔn)備好的文件袋黍少,一路小跑奔到大使館簽證處。預(yù)約的7點(diǎn)半处面,本應(yīng)提前半個(gè)小時(shí)到的厂置,但我5點(diǎn)半起床已經(jīng)是極...
    郭舒簡(jiǎn)閱讀 1,447評(píng)論 0 0