Java - HttpUrlConnection 包含 HTTP 文档而不是 JSON

Java - HttpUrlConnection contains HTTP document instead of JSON

我正在尝试从 Youtubeinmp3.com

下载给定 youtube 文件的 MP3 文件

有时它的工作非常好,有时 api returns 一个 HTTP 文档而不是 JSON 对象。我尝试借助 foreach 循环和 getAudioLink 函数向 API 发送不同的请求,如下面的代码所示。 我的 musicTitle 对象包含三个字符串(VideoID、VideoTitle 和 ThumbnailURL)。所有这些都存储在我每次开始搜索时创建的列表中。

但我不知道为什么 API 有时 returns 一个 HTTP 文档而不是 JSON 对象。我得到的错误代码是由解析 HTTP 文档触发的,也可以在下面看到。

public static void main(String[] args) 
{
    ....

    for (MusicTitle musicTitle : myList) 
    {
        System.out.println(getAudioLink(YOUTUBE_URL_C + musicTitle.getVideoID()));
    }
}

public static String getAudioLink(String inputLink) 
{
    String result = null;
    HttpURLConnection request = null;
    URL url = null;

    try 
    {
        url = new URL("http://YoutubeInMP3.com/fetch/?format=JSON&video=" + inputLink);
        System.out.println(url.toString());
        request = (HttpURLConnection) url.openConnection();
        request.connect();

        InputStreamReader reader = new InputStreamReader((InputStream)request.getContent());

        JsonParser jsonParser = new JsonParser(); // GSON-Library


        JsonObject youtubeInMP3 = (JsonObject)jsonParser.parse(reader).getAsJsonObject();

        if (youtubeInMP3 != null) 
        {
            result = youtubeInMP3.get("link").getAsString();
        }
        request.disconnect();
        reader.close();
    } 
    catch (MalformedURLException e) 
    {
        e.printStackTrace();
    }
    catch (IOException e) 
    {
        e.printStackTrace();
    }

    return result;
}

错误代码:

Exception in thread "main" com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 12 path $
at com.google.gson.JsonParser.parse(JsonParser.java:65)
at Main.getAudioLink(Main.java:51)
at Main.main(Main.java:30)
Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 12 path $
at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1573)
at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1423)
at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:546)
at com.google.gson.stream.JsonReader.peek(JsonReader.java:429)
at com.google.gson.JsonParser.parse(JsonParser.java:60)
... 2 more

编辑 1

例如,如果我搜索乐队 "Volbeat" 它 returns HTTP 文档如下所示。

<!DOCTYPE HTML>
<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Your MP3 Is Ready</title>
<meta name="description" content="Download and alternatively edit your YouTube video before saving the MP3 on your device." />
<meta name="keywords" content="edit, download, convert, youtube, mp3" />
<meta name="author" content="YouTube In MP3" />
<meta name="distribution" content="global">
<meta name="language" content="en" />

<link rel="stylesheet" type="text/css" href="/css/style.css?v=1.2.2">
<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,400italic|Roboto' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-awesome.min.css"> 

<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

<meta name="viewport" content="width=device-width, initial-scale=1">

</head>

<body class="home">

<div id="fb-root"></div>
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.5";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

<header>
<p><a href="/"><img src="/images/icon.png" class="verticalAlign" alt="YouTube In MP3 Icon"> <span class="logoText">YouTubeInMP3.com</span></a></p>
<nav>
    <ul>
                    <li><a><i class="fa fa-bars fa-2x verticalAlign"></i> Menu</a>
            <ul>
                <li><a href="/blog/">Blog</a></li>
                <li><a href="/faq/">FAQ</a></li>
                <li><a href="/tos/">Terms of Service</a></li>
                <li><a href="/privacy/">Privacy Policy</a></li>
            </ul>
        </li>
        <li><a href="/api/"><i class="fa fa-cog fa-2x verticalAlign"></i> API</a></li>
        <li><a href="/"><i class="fa fa-home fa-2x verticalAlign"></i> Home</a></li>
                </ul>
</nav>
</header>   
    <div id="contain-160" class="ad ad-160 loader"></div>

<div class="link-popup" id="linkpopup">

    <div class="popup">

        <h2>Link to this MP3</h2>

        <p><i class="fa fa-link fa-2x verticalAlign"></i> Direct Link:</p>
        <code>http://www.youtubeinmp3.com/download/?video=https://www.youtube.com/watch?v=-2Y4t9elm_A</code>


        <p><i class="fa fa-comment fa-2x verticalAlign"></i> Forum:</p>
        <code>[url=http://www.youtubeinmp3.com/download/?video=https://www.youtube.com/watch?v=-2Y4t9elm_A]Download MP3 - Volbeat - Mary Ann's Place (Official Video)[/url]</code>


        <p><i class="fa fa-code fa-2x verticalAlign"></i> HTML:</p>
        <code>&lt;a href="http://www.youtubeinmp3.com/download/?video=https://www.youtube.com/watch?v=-2Y4t9elm_A"&gt;Download MP3 - Volbeat - Mary Ann's Place (Official Video)&lt;/a&gt;</code>

        <a onclick="toggle_visibility('linkpopup');" class="close">&times;</a>

</div>

</div>

<div class="link-popup" id="editShow">

    <div class="popup">

        <div class="paddingBottomOptions">

             <h2><i class="fa fa-scissors"></i> Cut MP3</h2>

            <input placeholder="Cut From" class="cutMP3Slider" type="text" id="slider-margin-value-min" /> - 
            <input placeholder="Cut To" class="cutMP3Slider" type="text" id="slider-margin-value-max" /><br />

        </div>

        <div class="paddingBottomOptions">

             <h2><i class="fa fa-eye"></i> Show video editor</h2>
            <div class="checkBoxDiv">

                Display Video Editor: <input class="checkBoxRight" type="checkbox" id="displayEditor"><br />
                Always display Video Editor: <input class="checkBoxRight" type="checkbox" id="permanentDisplay">

            </div>

         </div>

        <div class="paddingBottomOptions">

            <h2><i class="fa fa-tag"></i> ID3 Tags</h2>
            <div class="checkBoxDiv">

                Identify ID3 Tags Automatically: <input checked="checked" disabled class="checkBoxRight" type="checkbox" id="autoID3">

            </div>

        </div>

        <h2><i class="fa fa-font"></i> Change MP3 name</h2>
        <input class="fullWidth" value="Volbeat - Mary Ann's Place (Official Video).mp3" placeholder="MP3 Name" type="text" id="customMP3Name" />

         <a onclick="toggle_visibility('editShow');" class="close">&times;</a>

    </div>

</div>

<div class="link-popup" id="shareShow">

     <div class="popup">

        <h2>Spread the word</h2>

        <div class="socialButtons">

            <a target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://www.facebook.com/YouTubeInMP3com"><i class="fa fa-facebook-square fa-3x verticalAlign"></i></a>
            <a target="_blank" href="https://twitter.com/intent/tweet?text=Simple way to extract audio and download MP3s from YouTube:&url=http://www.youtubeinmp3.com"><i class="fa fa-twitter-square fa-3x verticalAlign"></i></a>
            <a target="_blank" href="http://pinterest.com/pin/create/button/?url=http://www.youtubeinmp3.com&description=Simple way to extract audio and download MP3s from YouTube&media=http://www.youtubeinmp3.com/images/icon.png"><i class="fa fa-pinterest-square fa-3x verticalAlign"></i></a>
            <a target="_blank" href="https://plus.google.com/share?url=http://www.youtubeinmp3.com"><i class="fa fa-google-plus-square fa-3x verticalAlign"></i></a>
            <a target="_blank" href="http://www.tumblr.com/share?v=3&u=http://www.youtubeinmp3.com&s=Simple way to extract audio and download MP3s from YouTube"><i class="fa fa-tumblr-square fa-3x verticalAlign"></i></a> 


        </div>

        <h2>Facebook</h2>

         <div class="facebookMargin">

            <div id="fb-root"></div>
            <script>(function(d, s, id) {
              var js, fjs = d.getElementsByTagName(s)[0];
              if (d.getElementById(id)) return;
              js = d.createElement(s); js.id = id;
              js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.5";
              fjs.parentNode.insertBefore(js, fjs);
            }(document, 'script', 'facebook-jssdk'));</script>

            <div class="fb-page" data-href="http://www.facebook.com/YouTubeInMP3com" data-small-header="false" data-adapt-container-width="true" data-hide-cover="false" data-show-facepile="false" data-show-posts="false"><div class="fb-xfbml-parse-ignore"><blockquote cite="http://www.facebook.com/YouTubeInMP3com"><a href="http://www.facebook.com/YouTubeInMP3com">YouTubeInMP3.com - Download MP3 Files From Youtube</a></blockquote></div></div>

         </div>

        <a onclick="toggle_visibility('shareShow');" class="close">&times;</a>

     </div>

</div>

<section class="video">

     <form id="form" action="" method="GET">

        <input id="video" type="search" name="video" placeholder="Paste A Link Or Search For A Video Title" />

        <!-- Small screen search results -->
        <div id="searchResultMobile" class="searchResultMobile loader"></div>

        <button id="searchButton" onclick="search()" type="submit"><i class="fa fa-search"></i> Convert To MP3</button>

        <!-- Large screen search results -->
        <div id="searchResultLarge" class="searchResultLarge loader"></div>

    </form>

            <link rel="stylesheet" property="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/noUiSlider/8.0.2/nouislider.min.css">
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/noUiSlider/8.0.2/nouislider.js"></script>

     <div class="embed loader">

         <div id="player"></div>
         <div id="slider"></div>

    </div>

    <div class="infoBox">   
        <h1 class="titleVideo"><img class="thumbnailTitle" alt="YouTube Thumbnail" src="http://img.youtube.com/vi/-2Y4t9elm_A/default.jpg"> Volbeat - Mary Ann's Place (Official Video)</h1>
                    <p class="floatLeft"><i class="fa fa-clock-o"></i> Length: <span class="bold">
| 
            <a target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=https://www.facebook.com/YouTubeInMP3com"><i class="fa fa-facebook-square fa-2x verticalAlign"></i></a>
            <a target="_blank" href="https://twitter.com/intent/tweet?text=Simple way to extract audio and download MP3s from YouTube:&amp;url=http://www.youtubeinmp3.com"><i class="fa fa-twitter-square fa-2x verticalAlign"></i></a>
            <a target="_blank" href="http://pinterest.com/pin/create/button/?url=http://www.youtubeinmp3.com&amp;description=Simple way to extract audio and download MP3s from YouTube&media=http://www.youtubeinmp3.com/images/icon.png"><i class="fa fa-pinterest-square fa-2x verticalAlign"></i></a>
            <a target="_blank" href="https://plus.google.com/share?url=http://www.youtubeinmp3.com"><i class="fa fa-google-plus-square fa-2x verticalAlign"></i></a>
            <a target="_blank" href="http://www.tumblr.com/share?v=3&u=http://www.youtubeinmp3.com&amp;s=Simple way to extract audio and download MP3s from YouTube"><i class="fa fa-tumblr-square fa-2x verticalAlign"></i></a> 

            <script src="/js/social.js" type="text/javascript"></script>

        </p>    

                    <div id="status">

        </div>

        <p class="download-buttons fullWidth">

                            <a class="button fullWidth" id="download" href="get/?i=6%2FARY3w4SlqKhP7hMpnw8skpb2vhQEwDg9rFg6URKpAEbyz736HFUpKqz6uO8TSy5YETAnmYwF995a0lNbbZLw%3D%3D"><i class="fa fa-download"></i> Convert &amp; Download MP3</a>
                            <a onclick="toggle_visibility('editShow');" class="button button-gray"><i class="fa fa-cogs"></i> Settings</a><a rel="nofollow" href="http://www.youtubeinmp4.com/youtube.php?video=http://www.youtube.com/watch?v=-2Y4t9elm_A" class="button button-gray"><i class="fa fa-television"></i> Download in MP4 format</a><a rel="nofollow" href="http://www.saveitoffline.com/go/?l=http://www.saveitoffline.com/#http://www.youtube.com/watch?v=-2Y4t9elm_A" class="button button-gray"><i class="fa fa-file-o"></i> Other Formats</a>
                        </p>


        <div id="contain-300" class="ad ad-300 loader"></div>

        <div class="floatRight">

            <div class="firstBlock">

                <h2 class="firstBlockHeader">How do I download my MP3?</h2>

                Your video has been prepared and is ready to be downloaded.<br />
                To continue, simply press <strong>"Convert &amp; Download MP3"</strong>.<br /><br />

                Your MP3 has been converted to the highest quality possible and ID3 tags have been automatically identified and added.<br />
                You can customize your download by changing the <a class="green" onclick="toggle_visibility('editShow');">Options</a>.<br />

            </div>

            <div class="secondBlock">

                <h2 class="secondBlockHeader">How do I edit my MP3?</h2>

                You can edit your MP3 by clicking "Settings" (grey button, found above on the left side) button.<br>
                There are two ways of editing an MP3 before downloading it:<br>
                <br>
                1) Specify the start and end time manually, in the Settings menu.<br>
                2) Enable the video editor from the Settings menu and use the sliders to set the start and end time.            
            </div>

        </div>          


    </div>

    <span class="messagePage" id="message"></span>

    <link rel="stylesheet" property="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/tooltipster/3.3.0/css/tooltipster.min.css">
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/tooltipster/3.3.0/js/jquery.tooltipster.min.js"></script>

    <script type="text/javascript" src="/js/client.js?v=1.2.1"></script>
    <script type="text/javascript" src="//apis.google.com/js/client.js?onload=init" onload="externalLoad()"></script>       
</section>


    <div id="contain-728" class="ad ad-728 loader"></div>

<script type="text/javascript">
    var durationSeconds = 184;
    var videoId = "-2Y4t9elm_A";
    var editMin = '';
    var editMax = '';
    var convert = 1;
</script>
<script src="/js/process.js?v=1.2.1" type="text/javascript"></script>



<footer>
    <p>Want to forbid downloading a file? <a href="/privacy/">Contact us</a>.<br>
    By downloading content from this site, you agree with the <a href="/tos/">Terms of Service</a>.</p>
</footer>



<div class="loader" id="load-160">

    <!-- Conversant Media 120x600 and 160x600 SkyScraper CODE for YouTubeInMP3 -->
    <script type="text/javascript">var vclk_options = {sid:80572,media_id:3,media_type:7,version:"1.4"};</script><script class="vclk_pub_code" type="text/javascript" src="http://cdn.fastclick.net/js/adcodes/pubcode.min.js?sid=80572&media_id=3&media_type=7&version=1.4&exc=1"></script><noscript><a href="http://media.fastclick.net/w/click.here?sid=80572&m=3&c=1" target="_blank"><img src="http://media.fastclick.net/w/get.media?sid=80572&m=3&tp=7&d=s&c=1&vcm_acv=1.4" width="160" height="600" border="1"></a></noscript>
    <!-- Conversant Media 120x600 and 160x600 SkyScraper CODE for YouTubeInMP3 -->

</div>

<div class="loader" id="load-300">

    <!-- ValueClick Media 300x250 Medium Rectangle CODE for YouTubeInMP3 -->
    <script type="text/javascript">var vclk_options = {sid:80572,media_id:6,media_type:8,version:"1.4"};</script><script class="vclk_pub_code" type="text/javascript" src="http://cdn.fastclick.net/js/adcodes/pubcode.min.js?sid=80572&media_id=6&media_type=8&version=1.4&exc=1"></script><noscript><a href="http://media.fastclick.net/w/click.here?sid=80572&m=6&c=1" target="_blank"><img src="http://media.fastclick.net/w/get.media?sid=80572&m=6&tp=8&d=s&c=1&vcm_acv=1.4" width="300" height="250" border="1"></a></noscript>
    <!-- ValueClick Media 300x250 Medium Rectangle CODE for YouTubeInMP3 -->

</div>  

<div class="loader" id="load-728">

    <!-- Conversant Media 468x60 and 728x90 Banner CODE for YouTubeInMP3 -->
    <script type="text/javascript">var vclk_options = {sid:80572,media_id:1,media_type:5,version:"1.4"};</script><script class="vclk_pub_code" type="text/javascript" src="http://cdn.fastclick.net/js/adcodes/pubcode.min.js?sid=80572&media_id=1&media_type=5&version=1.4&exc=1"></script><noscript><a href="http://media.fastclick.net/w/click.here?sid=80572&m=1&c=1" target="_blank"><img src="http://media.fastclick.net/w/get.media?sid=80572&m=1&tp=5&d=s&c=1&vcm_acv=1.4" width="728" height="90" border="1"></a></noscript>
    <!-- Conversant Media 468x60 and 728x90 Banner CODE for YouTubeInMP3 -->

</div>

<script type="text/javascript" src="/js/loader.js?v=1.2.2"></script>
<script data-cfasync="false" type="text/javascript" src="http://www.onclicktop.com/a/display.php?r=439235"></script>




<!-- Start of StatCounter Code for Default Guide -->
<script type="text/javascript">
var sc_project=8077308; 
var sc_invisible=1; 
var sc_security="6b707000"; 
</script>
<script type="text/javascript"
src="http://www.statcounter.com/counter/counter.js"></script>
<noscript><div class="statcounter"></div></noscript>
<!-- End of StatCounter Code for Default Guide -->

</body>
</html>

编辑 2

如果我搜索流行曲目或乐队,我会收到 15 个有效结果中的 12 个。但是,如果我搜索没人愿意听的曲目,我会收到 15 个有效结果中的 ~1 个。

如果管理 YoutubeInMp3 信息的网络服务器 API 如果它(网络服务器)不知道曲目和相应的下载 link 是否可以使用 HTTP 文档回答?

编辑 3

如我所料,问题是网络服务器不知道轨道。如果我手动访问收到的HTML文档的link,我需要确认曲目是否转换。之后我可以在我的程序的帮助下手动下载它。

所以我猜 HTML 响应是网络服务器对我的请求没有有效答案的线索。

... i dont know why the API sometimes returns a HTTP document

HTTP 文档很可能是某种错误报告。如果是这种情况,它(HTML 文档)应该会为您提供一些关于真正问题所在的线索。

打印出来HTML。如果您不明白报告的含义,请将其添加到您的问题中,以便我们为您提供帮助。