http://api.linkedin.com/people-search?search-param1=val1&search-param2=val2...
由于我打算在我的应用程序中使用这么多次,我试图创建一个这样的Search
对象,我们可以为不同的搜索参数设置值,然后创建一个名为generateQueryUrl
的方法来生成以上格式的网址。
public class Search {
private String searchParam1;
private String searchParam2;
public void setSearchParam1(String val) { this.searchParam1 = val; }
public void setSearchParam2(String val) { this.searchParam2 = val; }
//Form the query url
public String generateQueryUrl(){
String url = "";
if(searchParam1 != null) {
url += "search-param1=" + searchParam1 + "&";
}
if(searchParam2 != null) {
url += "search-param2=" + searchParam2 + "&";
}
return url;
}
我的问题是,有没有更好的模式/设计来做到这一点?如果有很多参数,检查NULL
然后附加相应的参数名称,值似乎会为我添加冗余代码。
如果这种方法没问题,也请告诉我。
答案 0 :(得分:3)
您可以将带有键的Map维护为param名称和值作为值。您的setter方法可以将键和值放在Map中。或者,您可以拥有一个接受名称&的通用setter。价值。 在generateQueryUrl方法中,您可以迭代Map。
如果没有在稍后阶段完成,您可能还想对这些值进行URLEncode。
答案 1 :(得分:3)
我认为你所设计的实际上是一个“构建器”,因为你正在构建最后会返回的URL。想想StringBuilder
,或者Apache的EqualsBuilder
,HashCodeBuilder
等等。
有关更多理论解释,请查看http://sourcemaking.com/design_patterns/builder。
现在,至于你的代码,为了正确构建URL,我会像你一样使用“set”方法,但在其中我会使用Apache的HttpComponents (ex HttpClient)来正确附加URL的参数。
考虑一下,如果插入“&”在其中一个参数的值中,您的查询参数将被搞砸,因为您通常必须转义此字符(并且您似乎没有在此处执行此操作)。我更喜欢让测试和已知的API(UriUtils)为我做这件事。
所以,我的类看起来像使用Apache的HttpComponents:
public class SearchBuilder {
private URI baseUri;
private List<NameValuePair> parameters;
public SearchBuilder (URI baseUri) {
this.baseUri= baseUri;
this.parameters = new ArrayList<NameValuePair>();
}
public void addSearchParam1(String val) {
if(!StringUtils.isBlank(val)) {
parameters.add(new BasicNameValuePair("SearchParam1", val));
}
}
//Form the query url
public URI toURI(){
URI uri = URIUtils.createURI(baseUri.getScheme(), baseUri.getHost(), baseUri.getPort(), baseUri.getPath(), URLEncodedUtils.format(parameters, "UTF-8"), null);
return uri;
}
编辑:我添加了“isBlank”检查,以确保没有空白的只有空格的字符串的参数将不会添加到查询中。现在,您可以将其更改为仅检查null,但我确信您有了这个想法。