如何在Android中使用API?

3

我正在尝试在我的Android应用程序中使用这个API。它非常简单,你只需提供一个短网址,它将返回原始网址。

这是我第一次使用API。所以,我是这样做的:

try {
    HttpClient client = new DefaultHttpClient(); 
    String url = "http://tiny.pl/htk" //The tiny URL 
    String getURL = "http://untiny.me/api/1.0/extract?url="+url+"&format=text"; //The API service URL
    HttpGet get = new HttpGet(getURL);
    HttpResponse responseGet = client.execute(get);  
    HttpEntity resEntityGet = responseGet.getEntity();  
    if (resEntityGet != null) {  
        //do something with the response
        Log.i("GET RESPONSE",EntityUtils.toString(resEntityGet));
        output.setText(EntityUtils.toString(resEntityGet)); //This is a TextView        
    }
    else {
        output.setText("null reponse");
    }
} catch(Exception e) {
    output.setText("exception");
}

我的问题是:

  • 在处理API时,使用HttpGet是否是正确的方法?
  • 如果是,那么我在上面犯了什么错误?我总是在我的TextView中得到“exception”。

在你的catch块中添加e.printStackTrace();,然后查看日志输出以查看抛出的异常。 - FoamyGuy
什么都没有出现。我的LogCat没有显示任何东西!!你是说我的API处理方式是正确的吗? - iTurki
不,如果您的TextView显示“exception”,则表示出现了问题。您需要在catch块中添加e.printStackTrace()调用,以便您可以看到实际抛出的异常是什么。在您执行此操作之前,日志记录器中将不会出现任何内容。 - FoamyGuy
我们没有你展示的代码的任何上下文。这是在单独的线程上吗?如果是这样,你不能从非UI线程触碰UI元素(你的TextView)。如果你遇到错误,你应该发布你得到的错误,这样我们可以帮助追踪问题。 - dymmeh
@Tim:我已经添加了。什么也没显示出来。 - iTurki
@dymmeh:这是在onClick()方法内部。这里没有涉及到单独的线程。关于错误,我没有收到任何错误提示! - iTurki
3个回答

2

确保在转换 "resEntityget" 时将其分配给字符串,并重复使用该字符串,而不是尝试再次进行转换。否则会导致错误。

尝试这样做:

if (resEntityGet != null) {  
        String response = EntityUtils.toString(resEntityGet);
        Log.i("GET RESPONSE",response);
        output.setText(response); //This is a TextView        
    }

那我不确定。我已经使用您的代码进行了调试,而且没有进行任何修改,它可以很好地工作。 - dymmeh
目标版本为2.2(API 8)。在运行2.3.7的手机上进行了测试。 - dymmeh
我在运行4.02的Galaxy Nexus和运行3.1的Galaxy Tab10.1上尝试了它,但两者都失败了。 - iTurki
我有一部Galaxy Nexus手机,我刚刚测试了一下。我仍然收到/GET RESPONSE(1042): http://www.google.com。请调试您的应用程序并查看哪一行出现了问题。 - dymmeh
1
另外,请确保在转换时将resEntityGet分配给一个字符串,并重复使用该字符串,而不是尝试再次进行转换。这样做会导致错误。请执行以下操作:String response = EntityUtils.toString(resEntityGet); 然后在日志/设置文本视图中使用变量response。 - dymmeh
显示剩余4条评论

0

使用 HttpGet 处理 API 是正确的方式吗?

是的。

如果是,那么我在上面犯了什么错误?我总是在我的 TextView 中得到“异常”。

因为您在 HttpGet 中传递了错误的 URL。

正确的方法:

首先将 URL 参数添加到 URL 中:

你的 URL 应该像这样:

String strurl="http://stackoverflow.com/questions/tagged/android?page=5&sort=newest&pagesize=15";

使用 TinyURL “API”:

             HttpClient httpclient = new DefaultHttpClient();
HttpGet httppost = new HttpGet("http://tinyurl.com/api-create.php");
    // Add your data
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    nameValuePairs.add(new BasicNameValuePair("url",strurl));

    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

    // Execute HTTP Post Request
    HttpResponse response = httpclient.execute(httppost);
    HttpEntity resEntityGet = response.getEntity(); 
    tinyUrl=EntityUtils.toString(resEntityGet);  

现在将此URL用作TinyUrl:

try {
    HttpClient client = new DefaultHttpClient(); 

    HttpGet get = new HttpGet(tinyUrl);
    HttpResponse responseGet = client.execute(get);  
    HttpEntity resEntityGet = responseGet.getEntity();  
    if (resEntityGet != null) {  
        //do something with the response
        Log.i("GET RESPONSE",EntityUtils.toString(resEntityGet));
        output.setText(EntityUtils.toString(resEntityGet)); //This is a TextView        
    }
    else {
        output.setText("null reponse");
    }
} catch(Exception e) {
    output.setText("exception");
}

如果您想使用静态URL,则可以使用{{link1:tinyurl}}对URL进行编码,然后在HttpGet()中传递参数

完成!


你为什么要使用 TinyURL API?我的输入网址已经很短了。 - iTurki
是的iturki,因为您的完整URL未使用参数进行编码。如果您想使用静态URL,则可以使用TinyURL API对URL进行参数编码。 - ρяσѕρєя K
你的 tinyURL 代码无法编译,它有一些错误。例如,HttpMethod 无法解析为类型。 - iTurki

0

根据我的检查,在执行过程中抛出了UnknownHostException异常。


如果您在浏览器中输入实际的URL,它确实可以工作。我认为如果@iturki使用URL编码,问题将得到解决。 - dymmeh
@Olek:奇怪,我这里没有出现这个问题。你能建议一下我该如何解决吗? - iTurki
@dymmeh 你所说的 URL编码 是什么意思?是将HttpGet中的字符串替换为URI吗? - iTurki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接