【问题标题】:404 with youtube-mp3.org api404 与 youtube-mp3.org api
【发布时间】:2013-10-14 14:23:50
【问题描述】:

我正在尝试制作一个可以通过 youtube url 下载 mp3 文件的应用。

我对 youtube-mp3.org api 做了一些研究,我认为应该这样做:

  1. 获取http://www.youtube-mp3.org/api/pushItem/?item=http://www.youtube.com/watch?v=xo9EV3A4oaA&xy=yx
  2. 第 1 步返回一个 ID,您必须在以下请求中使用该 ID:"http://www.youtube-mp3.org/api/itemInfo/?video_id=" + ID
  3. 第 2 步返回另一个代码,您必须在此请求中使用该代码:"http://www.youtube-mp3.org/get?video_id=xo9EV3A4oaA&h=" + <code from step 2>
  4. 第 3 步重新运行 mp3。

很遗憾,我的代码在第 1 步已经失败:我收到 404,找不到页面。

这是我的代码(仅用于第 1 步):

private DefaultHttpClient createHttpClient() {
    HttpParams my_httpParams = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(my_httpParams, 3000);
    HttpConnectionParams.setSoTimeout(my_httpParams, 15000);
    SchemeRegistry registry = new SchemeRegistry();
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    ThreadSafeClientConnManager multiThreadedConnectionManager = new ThreadSafeClientConnManager(my_httpParams, registry);
    DefaultHttpClient httpclient = new DefaultHttpClient(multiThreadedConnectionManager, my_httpParams);
    return httpclient;
}

private class DownloadVid extends AsyncTask<Void, Void, Void> {

    int mStatusCode = 0;
    String content = "";

    @Override
    protected Void doInBackground(Void... args) {

        String url = "http://www.youtube-mp3.org/api/pushItem/?item=http://www.youtube.com/watch?v=xo9EV3A4oaA&xy=yx";

        DefaultHttpClient httpclient = createHttpClient();
        HttpGet httpget = new HttpGet(url);
        httpget.addHeader("Accept-Location", "*");

        try {
            HttpResponse response = httpclient.execute(httpget);
            StatusLine statusLine = response.getStatusLine();
            mStatusCode = statusLine.getStatusCode();

            if (mStatusCode == 200){
                content = EntityUtils.toString(response.getEntity());
            }

        } catch (ClientProtocolException e) {
            e.printStackTrace();
            mStatusCode = 0;
        } catch (IOException e) {
            e.printStackTrace();
            mStatusCode = 0;
        } catch (IllegalStateException e){
            e.printStackTrace();
            mStatusCode = 0;
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void arg) {

        mProgressDialog.dismiss();

        Toast.makeText(MainActivity.this, "Result=" + content + " StatusCode=" + mStatusCode, Toast.LENGTH_LONG).show();
    }
}

我不确定为什么它不起作用。有什么想法吗?

【问题讨论】:

  • 您是否使用curlwget 或类似方法手动尝试过这些步骤?
  • @MarkkuK。我不知道那是什么。你能解释一下吗?
  • 您必须对 item= 参数进行 url 编码。
  • @JasperKrijgsman 你是怎么做到的?
  • curlwget 是用于发送 http 请求的命令行工具。

标签: java android youtube http-status-code-404 httprequest


【解决方案1】:

对item参数进行编码,如下:

String item = URLEncoder.encode("http://www.youtube.com/watch?v=xo9EV3A4oaA", "utf-8");
String url = "http://www.youtube-mp3.org/a/pushItem/?item="+item+"&xy=yx";

或者像这样:

Uri uri = new Uri.Builder()
    .scheme("http")
    .authority("www.youtube-mp3.org")
    .path("/a/pushItem/")
    .appendQueryParameter("item", "http://www.youtube.com/watch?v=xo9EV3A4oaA")
    .appendQueryParameter("xy", "yx")
    .build();

【讨论】:

  • 现在我正在尝试您的第二个解决方案,但new HttpGet(uri) 给了我HttpGet(Uri) is undefined
  • 我试过这个网址:http://www.youtube-mp3.org/api/pushItem/?item=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dxo9EV3A4oaA&amp;xy=yx 和这个网址:http://www.youtube-mp3.org/api/pushItem/?item=http://www.youtube.com/watch?v=xo9EV3A4oaA&amp;xy=yx。两者都不起作用,不是在安卓上,也不是在我的桌面浏览器中。
  • 这真的很奇怪!用 a 替换 api 就可以了!
  • 你从哪里得到的网址?此网址来自页面上的表单。
  • 页面上的表单在哪里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 2014-08-02
  • 2021-12-31
  • 2018-03-01
  • 2014-05-12
  • 1970-01-01
相关资源
最近更新 更多