首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用goo.gl API缩短URL?

使用goo.gl API缩短URL?
EN

Stack Overflow用户
提问于 2014-06-27 06:18:29
回答 3查看 8.8K关注 0票数 2

我试图在不使用外部库的情况下用Java实现这一点。我不能使用外部库来完成这个任务,因为我没有在这个项目中使用Maven。

我使用的方法是:

代码语言:javascript
复制
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;
    }
}

和我遇到的错误是:

代码语言:javascript
复制
[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缩短替代方案不需要外部jar?谢谢你的帮助!

编辑

api的url是错误的。用新的错误来更新它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-27 06:38:08

尝试使用此代码将链接重定向到最终目的地。不过,它使用Apache客户端库。这是唯一可以成功地重定向到每个有效链接的方法。其他方法对我来说准确度很低。

代码语言:javascript
复制
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;
    }
票数 3
EN

Stack Overflow用户

发布于 2018-03-21 06:46:27

400坏请求错误通常是由于输入或粘贴错误的URL造成的。正如我在您的URL中看到的那样,api键丢失了。您可以从这里生成它:started

我正在使用一个随机密钥,用您的密钥尝试这段代码,它会工作的:

代码语言:javascript
复制
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;

    }

}
票数 3
EN

Stack Overflow用户

发布于 2014-06-27 08:06:08

在调用google之前,您需要添加客户端密钥。类似: URL = new (“key”);

当您连接到https站点时,您需要将google证书添加到keystore中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24445170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档