Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android Webkit 解決重定向 之 通過URL判斷 網頁是否是重定向的CODE 3XX

android Webkit 解決重定向 之 通過URL判斷 網頁是否是重定向的CODE 3XX

編輯:關於Android編程

要解決重定向導致浏覽器,無法goback問題一直困擾著我

最後,解決方案為,判斷3xx重定向 url,自己維護一個 返回的list歷史記錄即可實現。


代碼比較簡單直接上代碼。

前面一直得到code 200,原來是 用get請求的,直接返回重定向後的 code 。

package com.example.chongdingxiang;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.DefaultRedirectHandler;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {
private Button button1;
private TextView textView;
private  EditText editText1;
public static final String TAG="MainActivity";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		button1=(Button)findViewById(R.id.button1);
		textView=(TextView)findViewById(R.id.textView1);
		editText1=(EditText)findViewById(R.id.editText1);
		button1.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				new MyTask().execute(editText1.getText().toString());
			}

			
		});
	}
	
	
	
	public int getPost(String string) {
		// TODO Auto-generated method stub
		int code=0;
		 HttpGet getMethod = new HttpGet(string);  
	     DefaultHttpClient loginClient = new DefaultHttpClient();
	     MyRedirectHandler redirectHandler=new MyRedirectHandler();
	     loginClient.setRedirectHandler(redirectHandler);
		try {  
			HttpResponse response=loginClient.execute(getMethod);
		    code= response.getStatusLine().getStatusCode();
		    Log.i(TAG, "resCode = " + response.getStatusLine().getStatusCode()); //獲取響應碼  
		    Log.i(TAG, "result = " + EntityUtils.toString(response.getEntity(), "utf-8"));//獲取服務器響應內容  
		} catch (ClientProtocolException e) {  
		    // TODO Auto-generated catch block  
		    e.printStackTrace();  
		} catch (IOException e) {  
		    // TODO Auto-generated catch block  
		    e.printStackTrace();  
		}
		return code;  
	}
	
	
	public class MyTask extends AsyncTask{

		@Override
		protected Integer doInBackground(String... params) {
			// TODO Auto-generated method stub
			String url=params[0];
			return getPost(url);
		}

		@Override
		protected void onPostExecute(Integer result) {
			// TODO Auto-generated method stub
			textView.setText("code:"+result);
		}
		
	}

	public class MyRedirectHandler extends DefaultRedirectHandler{

		@Override
		public boolean isRedirectRequested(HttpResponse response,
		HttpContext context) {
		// TODO Auto-generated method stub
		return false;
		}

		}
}
以下重定向狀態代碼,來自其他博客:

一些常見的狀態代碼為:

  • 200 - 服務器成功返回網頁
  • 404 - 請求的網頁不存在
  • 503 - 服務器暫時不可用

以下提供了 HTTP 狀態代碼的完整列表。點擊鏈接可了解詳細信息。您也可以訪問有關 HTTP 狀態代碼的 W3C 頁來了解詳細信息。

1xx(臨時響應) 用於表示臨時響應並需要請求者執行操作才能繼續的狀態代碼。

代碼說明100(繼續)請求者應當繼續提出請求。服務器返回此代碼則意味著,服務器已收到了請求的第一部分,現正在等待接收其余部分。101(切換協議)請求者已要求服務器切換協議,服務器已確認並准備進行切換。

2xx(成功)

用於表示服務器已成功處理了請求的狀態代碼。

代碼說明200(成功)服務器已成功處理了請求。通常,這表示服務器提供了請求的網頁。如果您的 robots.txt 文件顯示為此狀態,那麼,這表示 Googlebot 已成功檢索到該文件。201(已創建)請求成功且服務器已創建了新的資源。202(已接受)服務器已接受了請求,但尚未對其進行處理。203(非授權信息)服務器已成功處理了請求,但返回了可能來自另一來源的信息。204(無內容)服務器成功處理了請求,但未返回任何內容。205(重置內容)服務器成功處理了請求,但未返回任何內容。與 204 響應不同,此響應要求請求者重置文檔視圖(例如清除表單內容以輸入新內容)。206(部分內容)服務器成功處理了部分 GET 請求。

3xx(已重定向)  要完成請求,您需要進一步進行操作。通常,這些狀態代碼是永遠重定向的。Google 建議您在每次請求時使用的重定向要少於 5 個。您可以使用網站管理員工具來查看 Googlebot 在抓取您已重定向的網頁時是否會遇到問題。診斷下的抓取錯誤頁中列出了 Googlebot 由於重定向錯誤而無法抓取的網址。

代碼說明300(多種選擇)服務器根據請求可執行多種操作。服務器可根據請求者 (User agent) 來選擇一項操作,或提供操作列表供請求者選擇。301(永久移動)請求的網頁已被永久移動到新位置。服務器返回此響應(作為對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。您應使用此代碼通知 Googlebot 某個網頁或網站已被永久移動到新位置。302(臨時移動)服務器目前正從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求。此代碼與響應 GET 和 HEAD 請求的 301 代碼類似,會自動將請求者轉到不同的位置。但由於 Googlebot 會繼續抓取原有位置並將其編入索引,因此您不應使用此代碼來通知 Googlebot 某個頁面或網站已被移動。303(查看其他位置)當請求者應對不同的位置進行單獨的 GET 請求以檢索響應時,服務器會返回此代碼。對於除 HEAD 請求之外的所有請求,服務器會自動轉到其他位置。304(未修改)

自從上次請求後,請求的網頁未被修改過。服務器返回此響應時,不會返回網頁內容。

如果網頁自請求者上次請求後再也沒有更改過,您應當將服務器配置為返回此響應(稱為 If-Modified-Since HTTP 標頭)。由於服務器可以告訴 Googlebot 自從上次抓取後網頁沒有更改過,因此可節省帶寬和開銷

。305(使用代理)請求者只能使用代理訪問請求的網頁。如果服務器返回此響應,那麼,服務器還會指明請求者應當使用的代理。307(臨時重定向)服務器目前正從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求。此代碼與響應 GET 和 HEAD 請求的 301 代碼類似,會自動將請求者轉到不同的位置。但由於 Googlebot 會繼續抓取原有位置並將其編入索引,因此您不應使用此代碼來通知 Googlebot 某個頁面或網站已被移動。

4xx(請求錯誤)  這些狀態代碼表示,請求可能出錯,已妨礙了服務器對請求的處理。

代碼說明400(錯誤請求)服務器不理解請求的語法。401(未授權)請求要求進行身份驗證。登錄後,服務器可能會返回對頁面的此響應。403(已禁止)服務器拒絕請求。如果在 Googlebot 嘗試抓取您網站上的有效網頁時顯示此狀態代碼(您可在 Google 網站管理員工具中診斷下的網絡抓取頁面上看到此狀態代碼),那麼,這可能是您的服務器或主機拒絕 Googlebot 對其進行訪問。404(未找到)

服務器找不到請求的網頁。例如,如果請求是針對服務器上不存在的網頁進行的,那麼,服務器通常會返回此代碼。

如果您的網站上沒有 robots.txt 文件,而您在 Google 網站管理員工具診斷標簽的 robots.txt 頁上發現此狀態,那麼,這是正確的狀態。然而,如果您有 robots.txt 文件而又發現了此狀態,那麼,這說明您的 robots.txt 文件可能是命名錯誤或位於錯誤的位置。(該文件應當位於頂級域名上,且應當名為 robots.txt)。

如果您在 Googlebot 嘗試抓取的網址上發現此狀態(位於"診斷"標簽的 HTTP 錯誤頁上),那麼,這表示 Googlebot 所追蹤的可能是另一網頁中的無效鏈接(舊鏈接或輸入有誤的鏈接)。

405(方法禁用)禁用請求中所指定的方法。406(不接受)無法使用請求的內容特性來響應請求的網頁。407(需要代理授權)此狀態代碼與 401(未授權)類似,但卻指定了請求者應當使用代理進行授權。如果服務器返回此響應,那麼,服務器還會指明請求者應當使用的代理。408(請求超時)服務器等候請求時超時。409(沖突)服務器在完成請求時發生沖突。服務器必須包含有關響應中所發生的沖突的信息。服務器在響應與前一個請求相沖突的 PUT 請求時可能會返回此代碼,同時會提供兩個請求的差異列表。410(已刪除)如果請求的資源已被永久刪除,那麼,服務器會返回此響應。該代碼與 404(未找到)代碼類似,但在資源以前有但現在已經不復存在的情況下,有時會替代 404 代碼出現。如果資源已被永久刪除,那麼,您應當使用 301 代碼指定該資源的新位置。411(需要有效長度)服務器不會接受包含無效內容長度標頭字段的請求。412(未滿足前提條件)服務器未滿足請求者在請求中設置的其中一個前提條件。413(請求實體過大)服務器無法處理請求,因為請求實體過大,已超出服務器的處理能力。414(請求的 URI 過長)請求的 URI(通常為網址)過長,服務器無法進行處理。415(不支持的媒體類型)請求的格式不受請求頁面的支持。416(請求范圍不符合要求)如果請求是針對網頁的無效范圍進行的,那麼,服務器會返回此狀態代碼。417(未滿足期望值)服務器未滿足"期望"請求標頭字段的要求。

5xx(服務器錯誤) 這些狀態代碼表示,服務器在嘗試處理請求時發生內部錯誤。這些錯誤可能是服務器本身的錯誤,而不是請求出錯。

代碼說明500(服務器內部錯誤)服務器遇到錯誤,無法完成請求。501(尚未實施)服務器不具備完成請求的功能。例如,當服務器無法識別請求方法時,服務器可能會返回此代碼。502(錯誤網關)服務器作為網關或代理,從上游服務器收到了無效的響應。503(服務不可用)目前無法使用服務器(由於超載或進行停機維護)。通常,這只是一種暫時的狀態。504(網關超時)服務器作為網關或代理,未及時從上游服務器接收請求。505(HTTP 版本不受支持)服務器不支持請求中所使用的 HTTP 協議版本。



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved