我是 Groovy 的新手,我正在尝试从我的 REST 服务响应中解析标头。字符串如下:
[http://localhost:4545/third-party-web?code=IVJZw1]
我正在尝试编码IVJZw1
。
这很容易,我希望我能尽快得到帮助。
阿祖
如果你想要快速而肮脏的东西,你可以使用正则表达式:
def str = '[http://localhost:4545/third-party-web?code=IVJZw1]'
def code = (str =~ /code=(\w*)/)[0][1]
assert code == 'IVJZw1'
我假设“代码”参数由字母数字字符 ( \w
) 组成。
但是,如果您发现自己经常从 URL 中提取参数值,那么这个解决方案很快就会变得非常肮脏。像ataylor 这样的建议可能更合适,特别是如果您可以提取在单独函数上获取URL 参数的逻辑。甚至可能是 URL 类本身的一个方法:D
import java.net.*
// Retrieves the query parameters of a URL a Map.
URL.metaClass.getQueryParams = { ->
delegate.query.split('&').collectEntries { param ->
param.split('=').collect { URLDecoder.decode(it) }
}.asImmutable()
}
// Then that method can be used directly on URLs :)
def str = '[http://localhost:4545/third-party-web?code=IVJZw1]'
def code = new URL(str[1..-2]).queryParams.code
assert code == 'IVJZw1'
如果去掉方括号,它只是一个 URL。你可以尝试这样的事情:
import java.net.*
def str = '[http://localhost:4545/third-party-web?code=IVJZw1]'
def url = new URL(str.replaceFirst('^\\[', '').replaceFirst(']$', ''))
def paramMap = url.query.split('&').collectEntries { param ->
param.split('=').collect { URLDecoder.decode(it) }
}
assert paramMap['code'] == 'IVJZw1'
Commons Http Client 是 java 中的 HTTP 代理实现,支持客户端身份验证、HTTP 状态管理和 HTTP 连接管理。这需要库 httpclient-4.1.2.jar、httpcore-4.1.2.jar、httpmime-4.1.2.jar、httpclient-cache-4.1.2.jar、commons-codec.jar 和 commons-logging-1.1。 1.jar 在类路径中。以下示例显示如何解析 URI 查询参数。
API
是一个众所周知的库,您可以使用
String url = "http://www.example.com/something.html?one=11111&two=22222&three=33333";
List<NameValuePair> params = URLEncodedUtils.parse(new URI(url), "UTF-8");
for (NameValuePair param : params) {
System.out.println(param.getName() + " : " + param.getValue());
}
输出
一:11111
二:22222
三:33333