2010-09-21 46 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