4

我是 Groovy 的新手,我正在尝试从我的 REST 服务响应中解析标头。字符串如下:

[http://localhost:4545/third-party-web?code=IVJZw1]

我正在尝试编码IVJZw1

这很容易,我希望我能尽快得到帮助。

阿祖

4

3 回答 3

7

如果你想要快速而肮脏的东西,你可以使用正则表达式:

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'
于 2012-05-11T00:11:10.030 回答
6

如果去掉方括号,它只是一个 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'
于 2012-05-10T23:07:05.223 回答
0

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

http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/utils/URLEncodedUtils.html

是一个众所周知的库,您可以使用

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

于 2014-08-08T09:19:43.413 回答