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

标签 java json youtube httprequest

我正在尝试从 Youtubeinmp3.com 下载给定 youtube 文件的 MP3 文件

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

但我不知道为什么 API 有时会返回 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”,它会返回如下所示的 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

如果我搜索流行轨道或乐队,我会收到大约 12 个有效结果(共 15 个)。但是,如果我搜索没人会听的轨道,我会收到大约 15 个有效结果中的 1 个。

如果管理 YoutubeInMp3 API 信息的网络服务器(网络服务器)不知道轨道和相应的下载链接,是否有可能用 HTTP 文档进行应答?

编辑3

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

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

最佳答案

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

HTTP 文档很可能是某种错误报告。如果是这种情况,它(HTML 文档)应该为您提供一些线索,让您了解真正的问题是什么。

打印出 HTML。如果您无法弄清楚该报告的含义,请将其添加到您的问题中,以便我们为您提供帮助。

关于Java - HttpUrlConnection 包含 HTTP 文档而不是 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34652441/

相关文章:

javascript - 如何在隐藏 Div 时停止 YouTube 视频

java - 有没有一种有效的方法可以用 Java 将多个 HTML 字符串写入 PDF 文档?

Javascript数组推送和显示

ios - NSJSONSerialization 无法解析有效的 JSON - "Garbage at End"

java - Jersey Web 应用程序类似 cron 的任务

youtube - 如何使用API​​ v3检测YouTube付费视频

java - 使用方法来寻求 y/n 答案

java - 配置没有二级缓存的查询缓存

java - Spring Boot 应用程序 - 在 tomcat 上找不到 404

objective-c - YouTube URL 方案 tvOS