編輯:Android開發實例
前言
說到HTTP協議,那必須要說說WWW了,WWW是環球信息網(World Wide Web )的縮寫,也可以簡稱為Web,中文名字為“萬維網”。簡單來說,WWW是以Internet作為傳輸媒介的一個應用系統,WWW網上基本的傳輸單位是Web網頁。WWW的工作是基於B/S模型,由Web浏覽器和Web服務器構成,兩者之間采用超文本傳輸協議HTTP協議進行通信。
HTTP協議是基於TCP/IP協議之上的協議,是Web浏覽器和Web服務器之間的應用層的協議,是通用的、無狀態的面向對象的協議。這裡主要是說明HTTP在Java中的應用,為從其他技術下轉向Android開發打好基礎。
首先普及一下網絡協議的知識,數據在Internet上傳輸,一般通過三種協議來實現發送信息和實現:
HTTP協議
下面詳細講解一下HTTP協議,因為HTTP是無狀態的協議,所以服務端並不記錄客戶端之前發送信息,一碼歸一碼,所以HTTP協議使用報文頭的形式記錄狀態,一般分為請求報文和響應報文。一般用戶使用浏覽器訪問網頁,是無需關心HTTP請求的報文頭的,因為開發人員已經浏覽器已經幫忙處理了,但是當進行開發工作的時候,這些是必須要了解的。
對於報文,一般關心請求方式,是GET或者是POST;請求數據類型,是文本還是音頻;數據的編碼格式,一般用utf-8;發送的數據長度;響應返回碼,一般200為成功,其他響應碼都是有問題。具體了解還是看看上面推薦的博客。
HTTP/1.1協議中一共定義了八種方法(有時也叫“動作”)來表明Request-URI指定的資源的不同操作方式,但是一般常用的就是GET和POST方式。
這裡簡單說一下GET方式和POST方式的差別:
Java中使用HTTP
下面通過兩個例子來分別講解一下GET和POST在Java中的使用,如果在Java中需要使用HTTP協議進行訪問,一般通過HttpURLConnection類來實現。
HttpURLConnection繼承了URLConnection,所以在URLConnection的基礎上進一步改進,增加了一些用於操作HTTP資源的便捷方法。Java中HttpURLConnection對象通過URL.openConnection()方法來獲得,需要進行強制轉換。先來介紹幾個HttpURLConnection的常用方法:
GET方式
這個例子通過GET方式從服務端獲取一張圖片的信息,並把其保存在本地磁盤中。服務器為本機上的IIS,一張靜態圖片,直接通過URL訪問。
直接上Java代碼,注釋已經解釋的很清楚了。
- package com.http.get;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.HttpURLConnection;
- import java.net.MalformedURLException;
- import java.net.URL;
- public class HttpUtils {
- private static String URL_PATH = "http://192.168.1.106:8080/green.jpg";
- /**
- * @param args
- */
- public static void main(String[] args) {
- // 調用方法獲取圖片並保存
- saveImageToDisk();
- }
- /**
- * 通過URL_PATH的地址訪問圖片並保存到本地
- */
- public static void saveImageToDisk()
- {
- InputStream inputStream= getInputStream();
- byte[] data=new byte[1024];
- int len=0;
- FileOutputStream fileOutputStream=null;
- try {
- //把圖片文件保存在本地F盤下
- fileOutputStream=new FileOutputStream("F:\\test.png");
- while((len=inputStream.read(data))!=-1)
- {
- //向本地文件中寫入圖片流
- fileOutputStream.write(data,0,len);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- finally
- {
- //最後關閉流
- if(inputStream!=null)
- {
- try {
- inputStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if(fileOutputStream!=null)
- {
- try {
- fileOutputStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- /**
- * 通過URL獲取圖片
- * @return URL地址圖片的輸入流。
- */
- public static InputStream getInputStream() {
- InputStream inputStream = null;
- HttpURLConnection httpURLConnection = null;
- try {
- //根據URL地址實例化一個URL對象,用於創建HttpURLConnection對象。
- URL url = new URL(URL_PATH);
- if (url != null) {
- //openConnection獲得當前URL的連接
- httpURLConnection = (HttpURLConnection) url.openConnection();
- //設置3秒的響應超時
- httpURLConnection.setConnectTimeout(3000);
- //設置允許輸入
- httpURLConnection.setDoInput(true);
- //設置為GET方式請求數據
- httpURLConnection.setRequestMethod("GET");
- //獲取連接響應碼,200為成功,如果為其他,均表示有問題
- int responseCode=httpURLConnection.getResponseCode();
- if(responseCode==200)
- {
- //getInputStream獲取服務端返回的數據流。
- inputStream=httpURLConnection.getInputStream();
- }
- }
- } catch (MalformedURLException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return inputStream;
- }
- }
POST方式
這個例子通過POST方式訪問一個登陸頁面,需要輸入用戶名(username)和密碼(password)。雖然這裡使用的Java在講解問題,但是服務端是使用.Net的框架,一個很簡單的HTML頁面加一個表單傳送的一般處理程序,輸入為admin+123為登陸成功,這裡不累述了。
Java代碼:
- package com.http.post;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.io.UnsupportedEncodingException;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.net.URLEncoder;
- import java.util.HashMap;
- import java.util.Map;
- public class postUtils {
- private static String PATH = "http://192.168.222.1:1231/loginas.ashx";
- private static URL url;
- public postUtils() {
- }
- static {
- try {
- url = new URL(PATH);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 通過給定的請求參數和編碼格式,獲取服務器返回的數據
- * @param params 請求參數
- * @param encode 編碼格式
- * @return 獲得的字符串
- */
- public static String sendPostMessage(Map<String, String> params,
- String encode) {
- StringBuffer buffer = new StringBuffer();
- if (params != null && !params.isEmpty()) {
- for (Map.Entry<String, String> entry : params.entrySet()) {
- try {
- buffer.append(entry.getKey())
- .append("=")
- .append(URLEncoder.encode(entry.getValue(), encode))
- .append("&");//請求的參數之間使用&分割。
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- }
- buffer.deleteCharAt(buffer.length() - 1);
- System.out.println(buffer.toString());
- try {
- HttpURLConnection urlConnection = (HttpURLConnection) url
- .openConnection();
- urlConnection.setConnectTimeout(3000);
- //設置允許輸入輸出
- urlConnection.setDoInput(true);
- urlConnection.setDoOutput(true);
- byte[] mydata = buffer.toString().getBytes();
- //設置請求報文頭,設定請求數據類型
- urlConnection.setRequestProperty("Content-Type",
- "application/x-www-form-urlencoded");
- //設置請求數據長度
- urlConnection.setRequestProperty("Content-Length",
- String.valueOf(mydata.length));
- //設置POST方式請求數據
- urlConnection.setRequestMethod("POST");
- OutputStream outputStream = urlConnection.getOutputStream();
- outputStream.write(mydata);
- int responseCode = urlConnection.getResponseCode();
- if (responseCode == 200) {
- return changeInputStream(urlConnection.getInputStream(),
- encode);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return "";
- }
- /**
- * 把服務端返回的輸入流轉換成字符串格式
- * @param inputStream 服務器返回的輸入流
- * @param encode 編碼格式
- * @return 解析後的字符串
- */
- private static String changeInputStream(InputStream inputStream,
- String encode) {
- ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
- byte[] data = new byte[1024];
- int len = 0;
- String result="";
- if (inputStream != null) {
- try {
- while ((len = inputStream.read(data)) != -1) {
- outputStream.write(data,0,len);
- }
- result=new String(outputStream.toByteArray(),encode);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return result;
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- //通過Map設置請求字符串。
- Map<String, String> params = new HashMap<String, String>();
- params.put("username", "admin");
- params.put("password", "123");
- String result=sendPostMessage(params, "utf-8");
- System.out.println(result);
- }
- }
示例代碼下載
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
再看文章之前,希望大家先打開自己的微信點到朋友圈中去,仔細觀察是不是發現朋友圈裡的有個“九宮格”的圖片區域,點擊圖片又會跳到圖片的詳細查看頁面,並且支持圖片的滑動
文件main.java代碼如下:package com.HHBrowser.android;import android.app.Activity;import
打開packages\apps\PackageInstaller下的清單文件XML/HTML代碼