URISyntaxException:查询中存在非法字符

12

我想在默认浏览器中打开一个链接,我使用了以下代码。

String myUrl = "http://www.example.com/engine/myProcessor.jsp?Type=A Type&Name=1100110&Char=!"; 

        try {
            Desktop.getDesktop().browse(new URI(myUrl));
        } catch (IOException err) {
            setTxtOutput("Error: "+err.getMessage());
        } catch (URISyntaxException err) {      
            setTxtOutput("Error: "+err.getMessage());
        } catch (Exception err) {
            setTxtOutput("Error: "+err.getMessage());
        }

我收到了URISyntaxException错误信息,显示查询中存在非法字符。

我认为这是由于我的URL中包含?, &, 和!等特殊字符造成的。我尝试使用:

URLEncoder.encode(myUrl, "UTF-8");

但这给了我另一个错误。

Failed to open http%3A%2F%2Fwww.example.com%2F........... 
The system cannot find the file specified.
请问您能告诉我如何纠正“URISyntaxException 非法字符”错误吗?
6个回答

15

不应编码整个URL,因为URI类需要有效的协议。只需编码参数即可。

String params = URLEncoder.encode("Type=A Type&Name=1100110&Char=!", "UTF-8");
myUrl = "http://www.example.com/engine/myProcessor.jsp?" + params;

实际上只需要值而不是变量名和分隔符。但是,根据您放置URL的位置(即在HTML或XML中),可能还需要对&分隔符进行编码。在上述情况下,问题恰好是空格字符。 - Caleryn
@Caleryn 对的。这是第一个“URISyntaxException”的问题。对于第二个问题,它正在尝试对完整的URL进行编码。 - Sotirios Delimanolis
只编码参数。我对自己找了这么久这个短语感到惭愧。我试图编码一切,但结果都是错的。 - rado

11

这是因为空格在这里 ...jsp?Type=A Type&...,你可以用 + 替换它。

http://www.example.com/engine/myProcessor.jsp?Type=A+Type&Name=1100110&Char=!"

2
您可以使用以下代码片段。
public static String encode(String queryParameter) {
    try {
        String encodedQueryParameter = URLEncoder.encode(queryParameter, "UTF-8");
        return encodedQueryParameter;
    } catch (UnsupportedEncodingException e) {
        return "Issue while encoding" + e.getMessage();
    }
}

0
以下代码对我有效:
MultivaluedMap<String, String> params = new MultivaluedMapImpl();
            params.add("filter", URLEncoder.encode(filter));

_webResource.path(MessageFormat.format(this._methodName,this._params))
                        .queryParams((MultivaluedMap<String, String>) this._params)
                        .type("application/x-www-form-urlencoded")
                        .accept("application/json")
                        .get(ClientResponse.class); 

-1

如果您正在使用任何过滤参数,请不要在过滤表达式之间使用空格。请使用%20代替空格。例如,我的过滤器是这样的: _filter = Number_field eq 15 因此,在JMeter中无法正常工作,因为数字字段和eq之间有空格。 请像这样使用: _filter = Number_field%20eq%2015


-1

将URL中的空格替换为+,例如如果URL包含category=Adult Care,则将其替换为category=Adult+Care。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接