【问题标题】:How do I use the Simple HTTP client in Android? [closed]如何在 Android 中使用 Simple HTTP 客户端? [关闭]
【发布时间】:2011-05-26 08:13:37
【问题描述】:

如何使用AndroidHttpClient 作为HTTP 客户端连接到远程服务器?我无法在文档或互联网上找到好的示例。

【问题讨论】:

  • 这实际上是一个有用的问题。关于如何使用 AndroidHttpClient 的例子并不多。也许这个问题应该更具体。
  • 我更新了这个,让它成为一个真正的问题。请重新打开它,因为如您所见,这对很多人来说都是一个有用的问题。
  • 我们要重新打开这个还是什么?
  • 为什么?这对我来说是零意义。有时 SO 完全让我感到困惑和沮丧。
  • 我通过谷歌搜索 android http 客户端示例 到达这里。看来以上一般程序员的问题是真实的。

标签: android http


【解决方案1】:
public static void connect(String url)
{

    HttpClient httpclient = new DefaultHttpClient();

    // Prepare a request object
    HttpGet httpget = new HttpGet(url); 

    // Execute the request
    HttpResponse response;
    try {
        response = httpclient.execute(httpget);
        // Examine the response status
        Log.i("Praeda",response.getStatusLine().toString());

        // Get hold of the response entity
        HttpEntity entity = response.getEntity();
        // If the response does not enclose an entity, there is no need
        // to worry about connection release

        if (entity != null) {

            // A Simple JSON Response Read
            InputStream instream = entity.getContent();
            String result= convertStreamToString(instream);
            // now you have the string representation of the HTML request
            instream.close();
        }


    } catch (Exception e) {}
}

    private static String convertStreamToString(InputStream is) {
    /*
     * To convert the InputStream to String we use the BufferedReader.readLine()
     * method. We iterate until the BufferedReader return null which means
     * there's no more data to read. Each line will appended to a StringBuilder
     * and returned as String.
     */
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line = null;
    try {
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return sb.toString();
}

【讨论】:

  • 您的 lmgtfy 吸引了许多“攻击性”标志。我强烈建议不要这样做。
  • 知道了。下次我会尽量避免。
  • 要使用 GZIP、分块流等,请改用 HttpClient 和 entity.writeTo()。
  • Honeycomb 和更新版本如果您尝试在不使用 AsyncTask 的情况下执行此操作,则会抛出 NetworkOnMainThreadException
  • HttpClient 现在是一个遗产。从 Android SDK 23 Marshmallow 开始,你最好使用 OkHttp。
【解决方案2】:

你可以这样使用:

public static String executeHttpPost1(String url,
            HashMap<String, String> postParameters) throws UnsupportedEncodingException {
        // TODO Auto-generated method stub

        HttpClient client = getNewHttpClient();

        try{
        request = new HttpPost(url);

        }
        catch(Exception e){
            e.printStackTrace();
        }


        if(postParameters!=null && postParameters.isEmpty()==false){

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(postParameters.size());
            String k, v;
            Iterator<String> itKeys = postParameters.keySet().iterator();
            while (itKeys.hasNext()) 
            {
                k = itKeys.next();
                v = postParameters.get(k);
                nameValuePairs.add(new BasicNameValuePair(k, v));
            }     

            UrlEncodedFormEntity urlEntity  = new  UrlEncodedFormEntity(nameValuePairs);
            request.setEntity(urlEntity);

        }
        try {


            Response = client.execute(request,localContext);
            HttpEntity entity = Response.getEntity();
            int statusCode = Response.getStatusLine().getStatusCode();
            Log.i(TAG, ""+statusCode);


            Log.i(TAG, "------------------------------------------------");





                try{
                    InputStream in = (InputStream) entity.getContent(); 
                    //Header contentEncoding = Response.getFirstHeader("Content-Encoding");
                    /*if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) {
                        in = new GZIPInputStream(in);
                    }*/
                    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                    StringBuilder str = new StringBuilder();
                    String line = null;
                    while((line = reader.readLine()) != null){
                        str.append(line + "\n");
                    }
                    in.close();
                    response = str.toString();
                    Log.i(TAG, "response"+response);
                }
                catch(IllegalStateException exc){

                    exc.printStackTrace();
                }


        } catch(Exception e){

            Log.e("log_tag", "Error in http connection "+response);         

        }
        finally {

        }

        return response;
    }

【讨论】:

    【解决方案3】:

    您可以使用此代码:

    int count;
                try {
                    URL url = new URL(f_url[0]);
                    URLConnection conection = url.openConnection();
                    conection.setConnectTimeout(TIME_OUT);
                    conection.connect();
                    // Getting file length
                    int lenghtOfFile = conection.getContentLength();
                    // Create a Input stream to read file - with 8k buffer
                    InputStream input = new BufferedInputStream(url.openStream(),
                            8192);
                    // Output stream to write file
                    OutputStream output = new FileOutputStream(
                            "/sdcard/9androidnet.jpg");
    
                    byte data[] = new byte[1024];
                    long total = 0;
                    while ((count = input.read(data)) != -1) {
                        total += count;
                        // publishing the progress....
                        // After this onProgressUpdate will be called
                        publishProgress("" + (int) ((total * 100) / lenghtOfFile));
                        // writing data to file
                        output.write(data, 0, count);
                    }
                    // flushing output
                    output.flush();
                    // closing streams
                    output.close();
                    input.close();
                } catch (SocketTimeoutException e) {
                    connectionTimeout=true;
                } catch (Exception e) {
                    Log.e("Error: ", e.getMessage());
                }
    

    【讨论】:

    • 欢迎来到 Stack Overflow!感谢您发布您的答案!请务必仔细阅读FAQ on Self-Promotion。另请注意,每次链接到自己的网站/产品时,都要求发布免责声明。
    猜你喜欢
    • 2012-01-13
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多