getParameter()的“逆”方法

时间:2014-03-10 09:56:08

标签: java servlets httpurlconnection

发送用户参数的一种方法是将它们附加到URL:

URLAddress+="?param1=value1+param2=value2"

我还能如何将用户参数发送到服务器?这些是HttpServletRequest方法

要读取的参数
getParameter(param1);
接收器端的

我试过

setRequestProperty("param1","value1"); 
HttpURLConnection

。但是, getParameter()无法在请求中找到它们。

我正在尝试将它们发送到URL之外,以便它们不会被显示。

1 个答案:

答案 0 :(得分:0)

您只有两种可能性:在GET请求的情况下将它们附加到URL,然后它们是可见的,或者在POST请求的情况下将它们写为正文:

/**
 * Convert a Map to a query string.
 * @param values the map with the values
 *               <code>null</code> will be encoded as empty string, all other
 *               objects are converted to
 *               String by calling its <code>toString()</code> method.
 * @return e.g. "key1=value&key2=&email=max%40example.com"
 */
public static String queryString(Map<String, Object> values) {
    StringBuilder sbuf = new StringBuilder();
    String separator = "";

    for (Map.Entry<String, Object> entry : values.entrySet()) {
        String value = entry.getValue() == null
                ? "" : String.valueOf(entry.getValue());
        sbuf.append(separator);
        sbuf.append(urlEncode(entry.getKey()));
        sbuf.append('=');
        sbuf.append(urlEncode(value));
        separator = "&";
    }

    return sbuf.toString();
}

static String urlEncode(String value) {
    try {
        return URLEncoder.encode(value, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        return value;
    }
}

如果是POST,您必须将标题Content-Type设置为application/x-www-form-urlencoded。我建议使用'UTF-8'作为编码。如果这不适合你,你必须挖掘如何处理不同的编码。

所以而不是

http://www.example.com/path/resource?abc=124&xyz=John+Doe

你写的是身体:

abc=124&xyz=John+Doe

不应该将参数设置为标题(addRequestHeader()),因为大多数中间件(例如Web应用程序防火墙,代理,负载平衡器)会解析标头,您可能会与预定义的标头发生冲突。

上述代码取自DavidWebb。在那里,您可以看到一个库列表,当您必须处理HTTP请求并且不想本地使用HttpURLConnection时,这些库可以减轻您的生活。

为什么我要添加用于构建查询字符串的代码?

您可以在此处阅读很多问题,其中错误在于他们没有正确编码参数名称或值。