3

GWTアプリのクライアント側からRequestBuilderを使用して、YouTubeからアップロードトークンを取得するためにPOSTリクエストをディスパッチしようとしています。

次のYouTubeAPIドキュメントで説明されているようにリクエストを作成しようとしています: https ://developers.google.com/youtube/2.0/developers_guide_protocol_browser_based_uploading#Browser_based_uploading

以下は私のクライアント側のGWTコードです。

// BODY
StringBuilder sb = new StringBuilder();
sb.append("<?xml version=\"1.0\"?>"
        + "<entry xmlns=\"http://www.w3.org/2005/Atom\""
        + "xmlns:media=\"http://search.yahoo.com/mrss/\""
        + "xmlns:yt=\"http://gdata.youtube.com/schemas/2007\">"
        + "<media:group>"
        + "<media:title type=\"plain\">MyTitle</media:title>"
        + "<media:description type=\"plain\">"
        + "My description."
        + "</media:description>"
        + "<media:category scheme=\"http://gdata.youtube.com/schemas/2007/categories.cat\">"
        + "People"
        + "</media:category>"
        + "<media:keywords>word1, word2</media:keywords>"
        + "</media:group>"
        + "</entry>");

String requestBody = sb.toString();

// HEADER
RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, "https://" + YOUTUBE_HOST + "/action/GetUploadToken");
rb.setHeader("Host", YOUTUBE_HOST);
rb.setHeader("Content-Type", "application/atom+xml; charset=" + CHAR_ENCODING);
rb.setHeader("X-GData-Key", MY_CLIENT_KEY);
rb.setHeader("GData-Version", "2");
try {
    rb.setHeader("Content-Length", Integer.toString(requestBody.getBytes(CHAR_ENCODING).length));
}
catch (UnsupportedEncodingException e) {
    Window.alert(e.getMessage());
}
rb.setHeader("Authorization", "Bearer " + AUTHORIZATION_CODE);

// CALL
try {
    rb.sendRequest(requestBody, new RequestCallback() {
        @Override
        public void onResponseReceived(Request request, Response response) {
            Document dom = XMLParser.parse(response.getText());

            Node urlNode = dom.getElementsByTagName("url").item(0);
            String url = urlNode.getFirstChild().getNodeValue();

            Node tokenNode = dom.getElementsByTagName("token").item(0);
            String token = tokenNode.getFirstChild().getNodeValue();
        }

        @Override
        public void onError(Request request, Throwable t) {
            callback.onFailure(t.getMessage());
        }
    });
}
catch (RequestException e) {
    callback.onFailure(e.getMessage());
}

以下は、Chromeの開発者ツールに表示される私のリクエストです。

Request URL:https://gdata.youtube.com/action/GetUploadToken
Request Method:OPTIONS
Status Code:404 Not Found

リクエストヘッダー

:host:gdata.youtube.com
:method:OPTIONS
:path:/action/GetUploadToken
:scheme:https
:version:HTTP/1.1
accept:*/*
accept-charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
accept-encoding:gzip,deflate,sdch
accept-language:en-GB,en-US;q=0.8,en;q=0.6
access-control-request-headers:origin, x-gdata-key, authorization, content-type, gdata-version
access-control-request-method:POST
origin:http://127.0.0.1:8888
referer:http://127.0.0.1:8888/MyApp.html?gwt.codesvr=127.0.0.1:9997
user-agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11

応答ヘッダー

cache-control:no-cache, no-store, max-age=0, must-revalidate
content-encoding:gzip
content-length:117
content-type:text/html; charset=UTF-8
date:Thu, 06 Dec 2012 14:29:20 GMT
expires:Fri, 01 Jan 1990 00:00:00 GMT
pragma:no-cache
server:GSE
status:404 Not Found
version:HTTP/1.1
x-content-type-options:nosniff
x-frame-options:SAMEORIGIN
x-gdata-user-country:US
x-xss-protection:1; mode=block

上記のように、リクエストをディスパッチした後、「404NotFound」エラーが発生します。

どんな助けでも大歓迎です!

4

2 に答える 2

2

私はGWTにあまり詳しくありませんが、何か奇妙なことに気づきました。Chromeが報告しているリクエストは、実際には、YouTube APIが要求するようなOPTIONSリクエストではなく、リクエストです。このURLに任意のリクエストをPOST送信すると404を再現できます。OPTIONS

POSTコードは、リクエストを送信しようとしていることを示しています。ただし、これはクロスオリジンリクエストであり、同一生成元ポリシーによって管理されると思います。GWTを使用したクロスサイトリクエストのこの例を見てください。OPTIONSリクエストの代わりにリクエストを送信するという奇妙な動作は、POSTこれを同じサイトのリクエストであるかのように扱うコードが原因である可能性があります。

于 2012-12-06T18:23:12.937 に答える
1

YouTube APIのCORSサポートは、約2週間壊れています。エンジニアリングチームは、非常にすぐに(できれば今日)修正されると確信しています。それがあなたが見ているエラーの原因です。

更新については、 https://code.google.com/p/youtube-direct-lite/issues/detail?id=9をフォローしてください。(CORSに依存するアプリは他にあまりないため、主にYouTube Direct Liteに影響を与えています。)

于 2012-12-06T19:52:26.577 に答える