我试图在不使用外部库的情况下在Java中执行此操作。我无法使用外部库来执行此操作,因为我没有在此项目中使用Maven。
我使用的方法是:
public static String shorten(String longUrl) {
if (longUrl == null) {
return longUrl;
}
StringBuilder sb = null;
String line = null;
String urlStr = longUrl;
try {
URL url = new URL("https://www.googleapis.com/urlshortener/v1/url");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("User-Agent", "toolbar");
OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
writer.write("url=" + URLEncoder.encode(urlStr, "UTF-8"));
writer.close();
BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
sb = new StringBuilder();
while ((line = rd.readLine()) != null) {
sb.append(line + '\n');
}
String json = sb.toString();
return json.substring(json.indexOf("http"), json.indexOf("\"", json.indexOf("http")));
} catch (MalformedURLException e) {
e.printStackTrace();
return longUrl;
} catch (IOException e) {
e.printStackTrace();
return longUrl;
}
}
,我得到的错误是:
[23:30:44 WARN]: java.io.IOException: Server returned HTTP response code: 400 for URL: https://www.googleapis.com/urlshortener/v1/url
[23:30:44 WARN]: at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1838)
[23:30:44 WARN]: at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1439)
[23:30:44 WARN]: at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
是否有一些简单的Java URL缩短替代方案,如果这种方法不起作用,则不需要外部jar?谢谢你的帮助!
修改
api的网址错了。也用新的错误更新了它。
答案 0 :(得分:2)
尝试使用此代码将链接重定向到最终目标。它使用Apache HTTP Client库。这是我成功重定向到每个有效链接的唯一方法。其他方法对我来说准确度很低。
private static String linkCorrector(String link) throws ClientProtocolException, IOException{
HttpClient client = new DefaultHttpClient();
HttpParams params = client.getParams();
HttpClientParams.setRedirecting(params, false);
HttpGet method = new HttpGet(link);
HttpResponse resp = client.execute(method);
String location = null;
Header h = resp.getLastHeader("Location");
if(h == null || h.getValue() == null){
location = "";
}
else{
location = resp.getLastHeader("Location").getValue();
}
return location;
}
答案 1 :(得分:2)
400 Bad Request错误通常是由输入或粘贴错误的URL引起的。 正如我在您的URL中看到的,api密钥丢失了。您可以从此处生成:https://developers.google.com/url-shortener/v1/getting_started
我正在使用随机密钥,请使用您的密钥尝试此代码,它将起作用:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import javax.net.ssl.HttpsURLConnection;
import org.apache.commons.lang.StringUtils;
import flexjson.JSONDeserializer;
import flexjson.JSONSerializer;
public class URLShortnerUtil
{
private static final String GOOGLE_SHORTEN_URL = "https://www.googleapis.com/urlshortener/v1/url?key=AIzaSyDLEgrM8I3N3yn8pNhBaZizY"; //replace key's value with your key
public static String shortURL(String longURL)
{
String shortURL = "";
HttpsURLConnection con = null;
try
{
Map<String, String> valueMap = new HashMap<>();
valueMap.put("longUrl", longURL);
String requestBody = new JSONSerializer().serialize(valueMap);
con = (HttpsURLConnection) new URL(GOOGLE_SHORTEN_URL).openConnection();
con.setDoOutput(true);
con.setDoInput(true);
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.getOutputStream().write(requestBody.getBytes());
if (con.getResponseCode() == 200)
{
StringBuilder sb = new StringBuilder();
try(BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream())))
{
String line;
while((line = br.readLine()) != null)
{
sb.append(line);
}
Map<String, String> map = new JSONDeserializer<Map<String, String>>().deserialize(sb.toString());
if (map != null && StringUtils.isNotEmpty(map.get("id")))
{
shortURL = map.get("id");
return shortURL;
}
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
return shortURL;
}
}
答案 2 :(得分:0)
您需要在调用google api之前添加客户端密钥。就像是 : 网址url =新网址(“https://www.googleapis.com/urlshortener/v1/url?key=my_api_key”);
并且您需要将谷歌证书添加到您的密钥库,因为您将连接到https站点