【问题标题】:How to use API in Android?如何在 Android 中使用 API?
【发布时间】:2012-03-12 19:38:03
【问题描述】:

我正在尝试在我的 Android 应用中使用 this API。很简单,你给它一个tiny URL,它就会返回原来的。

这是我第一次使用 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");
}

我的问题是:

  • 使用HttpGet 是处理 API 的正确方法吗?
  • 如果是,那么我在那里犯了什么错误?我的 TextView 中总是出现“异常”。

【问题讨论】:

  • 添加 e.printStackTrace();到你的 catch 块。然后查看你的日志输出,看看抛出了什么异常。
  • 没有出现。我的 LogCat 没有显示任何内容!!你是说我处理 API 的方式是正确的?
  • 不,如果您的 TextView 显示“异常”,则说明出现问题。您需要添加 e.printStackTrace();调用你的 catch 块,这样你就可以看到实际抛出了什么异常。在您这样做之前,您的日志猫中不会出现任何内容。
  • 我们没有您显示的代码的任何上下文。这是在单独的线程上吗?如果是这样,您无法从非 UI 线程中触摸 UI 元素(您的文本视图)。如果您遇到错误,您应该发布您遇到的错误,以便我们帮助追查问题
  • @Tim:我已经添加了。什么都没有出现。

标签: android api httpresponse http-get


【解决方案1】:

确保在转换字符串时将“resEntityget”分配给字符串并重复使用该字符串,而不是再次尝试转换它。这样做会导致错误。

试试这个:

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

【讨论】:

  • 那我不确定。我的代码运行良好,无需修改。
  • 您测试时的目标 API 是什么?
  • 目标 2.2 (API 8)。在运行 2.3.7 的手机上测试
  • 那我为什么不明白呢?我将目标更改为 API 8,但仍然得到相同的结果。
  • 另外,请确保在转换字符串时将 resEntityget 分配给字符串并重复使用该字符串,而不是再次尝试转换它。这样做会导致错误。这样做: String response = EntityUtils.toString(resEntityGet);然后在您的日志中使用变量响应/设置您的文本视图
【解决方案2】:

根据我的检查,执行期间抛出了 UnknownHostException。

【讨论】:

  • 如果你把它放在浏览器中,实际的 URL 确实有效。我在想如果@iturki 使用 URL 编码问题会自行解决
  • @Olek:很奇怪。这对我来说没有出现。你能建议我如何解决这个问题吗?
  • @dymmeh 你说的URL encoding 是什么意思?用 URI 替换 HttpGet 中的字符串?
【解决方案3】:

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

是的

如果是,那么我在那里犯了什么错误?我的 TextView 中总是出现“异常”。

因为您在HttpGet 中传递了错误的网址

正道:

在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,则使用带有参数的 tinyurl 对 URL 进行编码,然后传入 HttpGet() 完成!

【讨论】:

  • 你为什么使用 TinyURL API?我的输入网址已经很小了?
  • 是的 iturki,因为您的完整网址没有使用参数编码。如果您想使用静态 url,则使用 TinyURL API 使用参数对 url 进行编码。
  • 您的 tinyURL 代码无法编译。它有一些错误。例如,HttpMethod 无法解析为类型。
猜你喜欢
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多