[英]How can I change an algorithm returning a String type to return a List type in Spring?
這個片段的工作是:當我以列表的形式給出一個長的唯一 url 時,它將它轉換為一個短的 url。
@Slf4j
@Service
public class ShortUrlService {
private static final String SERVICE_URL = "http://mysite.co/example-api.php";
private static final String SIGNATURE = "45abc12345";
private static final String ACTION = "shorturl";
private static final String FORMAT = "simple";
private static final String SERVICE_CALL_FAIL = "SERVICE_CALL_FAIL";
private Random random = new Random();
@Autowired
private HttpClient httpClient;
public String shortenUrl(String url, String pCache) {
String shortUrl = null;
String longUrl = url;
if (!StringUtils.isEmpty(pCache)) {
longUrl = addCacheParameter(url, pCache);
}
longUrl = longUrl.replace("&", "%26");
try {
shortUrl = httpClient.getRequest(buildServiceUrl(longUrl));
} catch (IOException e) {
log.error("Service call failed: " + e.getMessage());
shortUrl = SERVICE_CALL_FAIL;
}
log.info("Short URL: " + shortUrl);
if (shortUrl.contains("-")) {
int rand = random.nextInt(999999);
return shortenUrl(url, String.valueOf(rand));
}
return shortUrl;
}
private String addCacheParameter(String url, String pCache) {
if (url.contains("?")) {
return url + "&pCache=" + pCache;
} else {
return url + "?pCache=" + pCache;
}
}
private String buildServiceUrl(String url) {
StringBuilder sb = new StringBuilder();
sb.append(SERVICE_URL);
sb.append("?signature=");
sb.append(SIGNATURE);
sb.append("&action=");
sb.append(ACTION);
sb.append("&url=");
sb.append(url);
sb.append("&format=");
sb.append(FORMAT);
log.info("Built URL: " + sb.toString());
return sb.toString();
}
}
我有如下服務。 這個服務的返回值就是我要改成的List。 我在這里的幾個地方都遇到了問題,你能幫我修復代碼嗎?
@Slf4j
@Service
public class ShortUrlService {
private static final String SERVICE_URL = "http://mysite.co/example-api.php";
private static final String SIGNATURE = "45abc12345";
private static final String ACTION = "shorturl";
private static final String FORMAT = "simple";
private static final String SERVICE_CALL_FAIL = "SERVICE_CALL_FAIL";
private Random random = new Random();
@Override
public List<String> shortenUrl(List<String> url, String pCache) {
List<String> shortUrl = null;
List<String> longUrl = url;
if (!StringUtils.isEmpty(pCache)) {
longUrl = Collections.singletonList(addCacheParameter(url, pCache));
}
**longUrl = longUrl.replace("&", "%26");**
RestTemplate restTemplate = new RestTemplate();
try {
**shortUrl = restTemplate.getForObject(buildServiceUrl(longUrl),List.class);**
} catch (Exception e) {
log.error("Service call failed: " + e.getMessage());
**shortUrl = SERVICE_CALL_FAIL;**
}
log.info("Short URL: " + shortUrl);
if (shortUrl.contains("-")) {
int rand = random.nextInt(999999);
return shortenUrl(url, String.valueOf(rand));
}
return shortUrl;
}
private String addCacheParameter(List<String> url, String pCache) {
if (url.contains("?")) {
return url + "&pCache=" + pCache;
} else {
return url + "?pCache=" + pCache;
}
}
private String buildServiceUrl(List<String> url) {
StringBuilder sb = new StringBuilder();
sb.append(SERVICE_URL);
sb.append("?signature=");
sb.append(SIGNATURE);
sb.append("&action=");
sb.append(ACTION);
sb.append("&url=");
sb.append(url);
sb.append("&format=");
sb.append(FORMAT);
log.info("Built URL: " + sb.toString());
return sb.toString();
}
}
這里 httpClient.getRequest 拋出一個錯誤,因為它仍然是一項舊技術。 我想改用 RestTemplate。 但是我用對了嗎? 我怎樣才能將替換方法寫成 replaceAll?
使用 for 循環,將List
中的每個 URL 縮短,並將它們添加到另一個List
以返回。
List<String> shortUrls = new ArrayList<>(urls.size());
if (!StringUtils.isEmpty(pCache)) {
longUrl = Collections.singletonList(addCacheParameter(url, pCache));
}
RestTemplate restTemplate = new RestTemplate();
for (String url: urls) {
String longUrl = url.replace("&", "%26");
String shortUrl = null;
try {
shortUrl = restTemplate.getForObject(buildServiceUrl(longUrl),List.class);
} catch (Exception e) {
log.error("Service call failed: " + e.getMessage());
shortUrl = SERVICE_CALL_FAIL;
}
log.info("Short URL: " + shortUrl);
if (shortUrl.contains("-")) {
int rand = random.nextInt(999999);
shortUrl = shortenUrl(url, String.valueOf(rand));
}
shortUrls.add(shortUrl);
}
return shortUrls;
@Slf4j
@Service
public class ShortUrlService {
private static final String SERVICE_URL = "http://mysite.co/example-api.php";
private static final String SIGNATURE = "45abc12345";
private static final String ACTION = "shorturl";
private static final String FORMAT = "simple";
private static final String SERVICE_CALL_FAIL = "SERVICE_CALL_FAIL";
private Random random = new Random();
@Override
public List<String> shortenUrl(List<String> urls, String pCache, List<String> shortUrls, List<String> longUrls) {
for(String url:urls){
if (!StringUtils.isEmpty(pCache)) {
longUrl = Collections.singletonList(addCacheParameter(url, pCache));
longUrl = longUrl.replace("&", "%26");
longUrls.add(longUrl);
}
RestTemplate restTemplate = new RestTemplate();
try {
**shortUrl = restTemplate.getForObject(buildServiceUrl(longUrl));**
} catch (Exception e) {
log.error("Service call failed: " + e.getMessage());
**shortUrl = SERVICE_CALL_FAIL;**
}
log.info("Short URL: " + shortUrl);
if (shortUrl.contains("-")) {
int rand = random.nextInt(999999);
return shortenUrl(url, String.valueOf(rand));
}
shortUrls.add(shortUrl);
}
return shortUrls;
}
private String addCacheParameter(String url, String pCache) {
if (url.contains("?")) {
return url + "&pCache=" + pCache;
} else {
return url + "?pCache=" + pCache;
}
}
private String buildServiceUrl(String url) {
StringBuilder sb = new StringBuilder();
sb.append(SERVICE_URL);
sb.append("?signature=");
sb.append(SIGNATURE);
sb.append("&action=");
sb.append(ACTION);
sb.append("&url=");
sb.append(url);
sb.append("&format=");
sb.append(FORMAT);
log.info("Built URL: " + sb.toString());
return sb.toString();
}
}
試試這個。修改了一些部分。
在過程語言中,如果你有一些東西適用於一件事,而你需要支持多件事,那么解決方案在 99% 的情況下都是一個循環。
如果您已經有一個方法來處理一件事,您可以創建一個重載並將實際工作委托給這個方法。 這會起作用,但可能並不總是最有效的解決方案(例如考慮 N+1 select 問題)。 有些事情最好在循環之前完成一次,而不是每次執行循環體時都完成。
對於您的問題,最簡單的方法是提供重載(或類似命名的方法)。 如果您不想再調用單參數方法,可以將其標記為私有。
啟用列表的方法實例化要返回的新列表,調用原始方法並將其結果添加到列表中。 列表最終返回:
public List<String> shortenUrls(final List<String> urls, final String pCache) {
final List<String> shortUrls = new ArrayList<>();
for (final String url : urls) {
shortUrls.add(shortenUrl(url, pCache));
}
return shortUrls;
}
public String shortenUrl(String url, String pCache) {
// nothing to change in this method, except maybe make it `private`
String shortUrl = null;
String longUrl = url;
if (!StringUtils.isEmpty(pCache)) {
longUrl = addCacheParameter(url, pCache);
}
longUrl = longUrl.replace("&", "%26");
try {
shortUrl = httpClient.getRequest(buildServiceUrl(longUrl));
} catch (IOException e) {
log.error("Service call failed: " + e.getMessage());
shortUrl = SERVICE_CALL_FAIL;
}
log.info("Short URL: " + shortUrl);
if (shortUrl.contains("-")) {
int rand = random.nextInt(999999);
return shortenUrl(url, String.valueOf(rand));
}
return shortUrl;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.