【问题标题】:The "inverse" method of getParameter()getParameter() 的“逆”方法
【发布时间】:2014-03-10 09:56:07
【问题描述】:

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

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

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

getParameter(param1);

在接收端。

我试过了

setRequestProperty("param1","value1"); 

HttpURLConnection。但是,getParameter() 在请求中找不到它们。

我正在尝试将它们发送到 URL 之外,以便它们不可见。

【问题讨论】:

    标签: java servlets httpurlconnection


    【解决方案1】:

    您只有两种可能:在 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 时,这些库可以让您的生活变得轻松。

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

    您可以在此处阅读许多关于 SO 的问题,其中错误是它们没有正确编码参数名称或值。

    【讨论】:

    • 有没有直接从体内提取的方法?如果不是,为什么要将它们与附加到 url 的形式相同?
    • 看看getParameter。您可以分辨出参数是来自查询字符串还是来自 POST 正文。
    猜你喜欢
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    相关资源
    最近更新 更多