2010-09-21 79 views
2

阿帕奇HTTP客戶端表單提交正確編碼百分號(%)這似乎是一個非常簡單的問題,但很可惜,我不能弄明白也不是找到一個解決辦法其他地方。我連接了一個內部有%的字符串,並且由於某種原因它在%之後添加了25。任何人都知道解決這個簡單的問題?使用以UrlEncode

String buttonCheck = "%26" + DATABASE.getValue("buttonCheck") + "%26"; 

就出來

"%2526value%2526" 

編輯:這已經很明顯,這個問題實際上是URL編碼中,我會更多的相關數據添加到這個問題。

我正在開發一款Android應用,從現場解析HTML,並允許用戶通過Android UI與它進行交互。我正在將%編碼爲表單的參數。

public class CLASS extends Activity 
{ 
    DefaultHttpClient client = new DefaultHttpClient; 
    String url = "http://www.url.com" 
    HttpRequestBase method = new HttpPost(url); 
    List<NameValuePair> nvps = new ArrayList<NameValuePair>(); 
    nvps.add("buttoncheck", "%26" + DATABASE.getValue("buttonCheck") + "%26"); 
    //DATABASE is simply a class that handles a HashMap 

    HttpPost methodPost = (HttpPost) method; 
    methodPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); 
    execute(method); 
} 

而不是發送的

buttoncheck=%26value%26 

形式的價值,我得到

buttoncheck=%2526value%2526 
+0

不能再現。請給出所有相關的代碼。 – Bozho 2010-09-21 06:38:41

+1

我不知道爲什麼它現在是這樣,但只是想指出'%'是ASCII'0x25'。所以至少在那裏它與字符串中的某些東西有關。 – 2010-09-21 06:40:43

+0

@ org.life.java我非常懷疑,因爲25之前出現26.我可以理解,如果它後,但事實並非如此。 DATABASE只是一個具有哈希映射訪問方法的類,沒什麼特別。然後我將buttonCheck添加到另一個用於HttpClient發佈的地圖。嗯,我還應該補充說,我通過Http發送後發送了字符串。我會研究一下。 – 2010-09-21 06:50:09

回答

1

顯然串通過「編碼百分比」,當它變成URI的一部分去。

如果是那樣的話,你不應該做百分號編碼這麼早。代替

String buttonCheck = "&" + DATABASE.getValue("buttonCheck") + "&"; 

將在URI最終成爲

"%26value%26" 
+0

這正是我調查URLEncoding如何工作後發現的問題。我正在查看從瀏覽器發送的數據。 – 2010-09-21 20:42:19

5

它不會在buttonCheck出來爲 「%2526value%2526」。我強烈懷疑你稍後正在尋找一個值 - 例如,在URI編碼之後。弄清楚什麼是編碼,以及實際上是想要編碼。

只要是明確的,25是從26完全不同你會看到同樣的事情,如果你擺脫26完全的,有

String buttonCheck = "%" + DATABASE.getValue("buttonCheck") + "%"; 

在這一點上,我懷疑你會得到

%25value%25 

基本上,只是編碼%爲%25。例如,這將做到這一點:

import java.net.*; 

public class Test { 
    public static void main(String[] args) throws Exception { 
     String input = "%value%"; 
     String encoded = URLEncoder.encode(input, "utf-8"); 
     System.out.println(encoded); // Prints %25value%25 
    } 
} 
+0

我不是100%確定URLEncodedFormEntity是如何工作的。 methodPost.setEntity(new UrlEncodedFormEntity(nvps,HTTP.UTF_8));是相關代碼,nvps是從中讀取buttonCheck的BasicNameValuePair。我沒有看到它會出錯的地方。 – 2010-09-21 06:56:23

+0

我將相關代碼添加到我的OP中。我相信你對這個問題是正確的。知道補救措施? – 2010-09-21 07:01:26

+0

@Alejandro:這是使用Apache HTTP Client嗎?恐怕我有一段時間沒有使用過。這也不完全清楚你實際想要達到什麼。我建議你開始一個新的問題,非常清楚地說明更大的圖片是什麼,你使用的是什麼代碼等。如果你可以把它做成一個簡短但完整的程序,其他人可以運行,那將是理想的。 – 2010-09-21 07:08:43

1

基礎上回答問題this,我猜想,字面%被編碼到%25在您的字符串。這解釋了添加的25。沒有看到相關的代碼,我們將無法知道爲什麼它首先到達那裏。

+0

你發佈的問題確實具有完全相同的問題,但是基於javascript。我試圖在apache網站上找到解決方案。 – 2010-09-21 07:08:02