【问题标题】:OkHttp/Android does not returns full resultsOkHttp/Android 不返回完整结果
【发布时间】:2016-05-28 08:02:13
【问题描述】:

我有以下代码,它期望返回从http://developer.android.com 加载的整个html文件内容。

(代码在 Xtend 但我认为没关系)。

var html = try {
        var client = new OkHttpClient()
        var request = new Request.Builder()
                        .url("http://developer.android.com/")
                        .build()
        var response = client.newCall(request).execute()

        response.body.string
    } catch(IOException err) {
        e("HTML error", err.toString)
        return
    }

    Log.d("HTML", html)

几行html后输出被截断。

<!DOCTYPE html>
<html lang="en">
<head>




<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta name="description" content="The official site for Android developers. Provides the Android SDK and documentation for app developers and designers.">
<meta name="xsrf_token" content="A3XCSylWU7AR4OhsL_yhMWlzbNcbh9Hk3Csw0HAUa5E6MTQ2NDQyMTgwNzE1MDQ0MA" />

<link rel="alternate" href="http://developer.android.com/index.html" hreflang="en">
<link rel="alternate" href="http://developer.android.com/index.html?hl=es" hreflang="es">
<link rel="alternate" href="http://developer.android.com/index.html?hl=id" hreflang="id">
<link rel="alternate" href="http://developer.android.com/index.html?hl=ja" hreflang="ja">
<link rel="alternate" href="http://developer.android.com/index.html?hl=ko" hreflang="ko">
<link rel="alternate" href="http://developer.android.com/index.html?hl=pt-br" hreflang="pt-br">
<link rel="alternate" href="http://developer.android.com/index.html?hl=ru" hreflang="ru">
<link rel="alternate" href="http://developer.android.com/index.html?hl=vi" hreflang="vi">
<link rel="alternate" href="http://developer.android.com/index.html?hl=zh-cn" hreflang="zh-cn">
<link rel="alternate" href="http://developer.android.com/index.html?hl=zh-tw" hreflang="zh-tw">

<title>

  Android Developers

</title>

<!-- STYLESHEETS -->
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto+Condensed">
<link rel="stylesheet"
    href="//fonts.googleapis.com/css?family=Roboto:light,regular,medium,thin,italic,mediumitalic,bold"
    title="roboto">





<link href="/static/css/default.css?v=2016052807" rel="stylesheet" type="text/css">
<!-- JAVASCRIPT -->
<script src="//www.google.com/jsapi" type="text/javascript"></script>
<script src="https://developer.android.com/_static/23ecca3dc9/js/android_3p-bundle.js" type="text/javascript"></script>


<script type="text/javascript">
  var toRoot = '/';
  var metaTags = ""; 
  var devsite = true;
  var useUpdatedTemplates = true;
  var devsiteLang = 'en';
  var pageType = 'none';
  var ANDROID_LANGUAGES = [


      'en','es','in','ja','ko','pt-br','ru','vi','zh-cn','zh-tw'

  ];
</script>
<script src="/static/js/docs.js?v=2016052807" type="text/javascript"></script>


<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
  ga('create', 'UA-5831155-1', 'android.com');
  ga('create', 'UA-49880327-2', 'android.com', {'name': 'universal'});  // New tracker);
  ga('send', 'pageview');
  ga('universal.send', 'pageview'); // Send page view for new tracker.
</script>


</head>

<body class="gc-documentation none None full-width" itemscope itemtype="http://schema.org/Article">
  <a href="#top" id="skip-to-main">Skip to content</a>
  <header id="header-wrapper">
    <div class="dac-header" id="header">
      <div class="dac-header-inner">
        <a class="dac-nav-toggle" data-dac-toggle-nav href="" title="Open navigation">
          <span class="dac-nav-hamburger">
            <span class="dac-nav-hamburger-top"></span>
            <span class="dac-nav-hamburger-mid"></span>
            <span class="dac-nav-hamburger-bot"></span>
          </span>
        </a>

        <a class="dac-header-logo" href="https://developer.android.com/index.html">
          <img class="dac-header-logo-image" src="https://developer.android.com/static/images/android_logo.png"
              srcset="https://developer.android.com/static/images/android_logo_2x.png 2x"
              width="32" height="36" alt="Android"> Developers</a>
        <ul class="dac-header-tabs">
          <li>
            <a class="dac-header

我也尝试过使用UrlConnection,但结果并没有什么不同。这是在实际设备(运行非官方 Cyanogen Mod 的三星 Galaxy Note 10.1)和 AVD(带有 Android 6.0 的 Atom x64)上测试的。

我也尝试了一些网址,结果完全一样(响应在某处被切断)。

我真的不知道下一步该怎么做。你能推荐一下吗?

【问题讨论】:

    标签: android okhttp3


    【解决方案1】:

    一些数据是在页面实际加载到浏览器后用javaScript加载的)下载javaScripts并分析它们)

    【讨论】:

    • 是的,有些是 AJAX 并且需要 JS 之后动态加载它们。但是在我的情况下,它甚至没有完全下载页面(并且没有任何错误)。
    【解决方案2】:

    试试这个:

    public static String readResponseBody(Response response) throws IOException {
        BufferedReader reader = new BufferedReader(response.body().charStream());;
        StringBuilder stringBuilder = new StringBuilder();
        while (true) {
            String line = reader.readLine();
            if (line == null)
                break;
            stringBuilder.append(line);
        }
        return stringBuilder.toString();
    }
    

    【讨论】:

    • 结果差不多。
    • 结果不能一样。确保你没有调用 response.body.string。您应该改为调用 readResponseBody(response)
    • 好吧,正如我在下面的回答,我发现该函数实际上返回了完整的正文,但是 ADB 没有打印出完整的结果,所以我认为它被砍掉了一半。是的,结果与此结果不同,因为它没有将换行符放入字符串生成器(因此它变成单行)。
    【解决方案3】:

    向每一位参与者道歉。图书馆/平台似乎按预期工作。问题可能出在 DDMS 上。

    我尝试阅读整个 html,然后在 DDMS 上显示最后几个字符(使用 Log 类),结果发现它是 html &lt;/html&gt; 的结束标记。我很确定结果会作为一个整体返回。

    但是,如果我将整个字符串放入日志函数中,那么它会被截断大约 4000 个字符。可能是 adb 缓冲区限制之类的。

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多