Objective c 试图通过Youtube API直接上载,但收到无效请求(NSURlerErrorDomain错误400。)

Objective c 试图通过Youtube API直接上载,但收到无效请求(NSURlerErrorDomain错误400。),objective-c,ios,youtube,youtube-api,gdata,Objective C,Ios,Youtube,Youtube Api,Gdata,我正试图直接上传视频到Youtube通过。我不知道问题出在哪里…是我的请求URL语法吗?我将视频文件添加到身体的方式有问题吗?我正在使用MKNetworkkit作为请求引擎 这是我的密码: //********************************************************* //* Setup the request URL and params //********************************************

我正试图直接上传视频到Youtube通过。我不知道问题出在哪里…是我的请求URL语法吗?我将视频文件添加到身体的方式有问题吗?我正在使用MKNetworkkit作为请求引擎

这是我的密码:

    //*********************************************************
    //* Setup the request URL and params
    //*********************************************************

    NSString *baseUrl = @"http://uploads.gdata.youtube.com/feeds/api/users/default/uploads";
    NSString *_accessToken = // the google API access token
    NSString *xml = 
    @"<?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'>My Video Title</media:title>"
        "<media:description type='plain'>"
        "This is a test video. Hopefully it'll upload to Youtube succesfully."
        "</media:description>"
        "<media:category"
        "scheme='http://gdata.youtube.com/schemas/2007/categories.cat'>People"
        "</media:category>"
        "<media:keywords>test, video</media:keywords>"
      "</media:group>"
    "</entry>";
    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                   _accessToken, @"access_token",
                                   myYouTubeDeveloperKey, @"DEVELOPER_KEY",
                                   @"vid1.mp4", @"VIDEO_FILENAME",
                                   xml, @"API_XML_Request",
                                   nil];

    //*********************************************************
    //* Configure the request
    //*********************************************************
    MKNetworkOperation *op = [globalMKNetworkEngine operationWithURLString:baseUrl params:params httpMethod:@"POST"];
    [op addFile:[[self getVideoFileURL] absoluteString] forKey:@"Binary File Data"];
    [op onUploadProgressChanged:^(double progress) {
        NSLog(@"progress: %@", progress);
        [uploadProgressBar setProgress:progress animated:YES];
    }];
    [op onCompletion:^(MKNetworkOperation *operation) {

        //*********************************************************
        //* On success, do this
        //*********************************************************

        dispatch_async(dispatch_get_main_queue(), ^{
           NSLog(@"Success!");
        });


    } onError:^(NSError *error) {
        DLog(@"%@", [error localizedDescription]);
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Uh oh..." message:@"There was a network error. Please try again later." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
    }];
    [globalMKNetworkEngine enqueueOperation:op];
以下是MKNetworkKit报告的响应:

 Danceplanet[16449:707] -[MKNetworkOperation     operationFailedWithError:]
Request
-------
curl -X POST "http://uploads.gdata.youtube.com/feeds/api/users/default/uploads" \
-F     "VIDEO_FILENAME=vid1" -F "DEVELOPER_KEY=(the developer key is here)" \
-F "access_token=(an access token)" -F "API_XML_Request=<?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'>My Video Title</media:title>\
<media:description type='plain'>This is a test video. Hopefully it'll upload to Youtube succesfully.</media:description>\
<media:categoryscheme='http://gdata.youtube.com/schemas/2007/categories.cat'>People</media:category>\
<media:keywords>test, video</media:keywords>\
</media:group>\
</entry>" \
-F "Binary File Data=@file://localhost/var/mobile/Applications/BBD79FFD-01D5-402C-995A-D9F9CE61F312/Documents/savedVideos/vid1.mp4;type=application/octet-stream"

--------
Response
--------
Invalid Request
, [The operation couldn’t be completed. (NSURLErrorDomain error 400.)]
 Danceplanet[16449:707] __block_global_3 [Line 167] The operation     couldn’t be completed. (NSURLErrorDomain error 400.)
 Danceplanet[16449:707] -[MKNetworkOperation operationFailedWithError:]     [Line 1283] State: 0`

我想问题可能出在哪里

NSString * xmlEx =@"<?xml version=\"1.0\" encoding=\"utf-8\"?>" 
                                "<Data xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">"
                                "<MediaFile>"
                                "<FileName>%@</FileName>"
                                "<Folder>%@</Folder>"
                                "</MediaFile>"
                                "</Data>"

这就是我在发布之前将xml写入字符串的方式。问题可能在于特殊字符。压缩XML版本字符。

我认为问题可能在于NSString

NSString * xmlEx =@"<?xml version=\"1.0\" encoding=\"utf-8\"?>" 
                                "<Data xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">"
                                "<MediaFile>"
                                "<FileName>%@</FileName>"
                                "<Folder>%@</Folder>"
                                "</MediaFile>"
                                "</Data>"

这就是我在发布之前将xml写入字符串的方式。问题可能在于特殊字符。比较XML版本字符。

我放弃了这种方法,现在使用Google obj-c客户端库。

我放弃了这种方法,现在使用Google obj-c客户端库。

你的API密钥和访问令牌正确吗?是的……我使用一个定义来指向我的开发者密钥和访问令牌来自一个新使用的刷新令牌。您是否尝试过通过其他方式通过浏览器插件、curl命令等执行请求。?另外,看看这个问题:还有这个框架:据我所知,Youtube直接上传API是通过POST完成的,因此不需要GData框架。我使用此处的说明作为参考您的API密钥和访问令牌是否正确?是的…我使用定义来指向我的开发人员密钥,我的访问令牌来自新使用的刷新令牌您是否尝试通过其他方式通过浏览器插件、curl命令等执行请求。?另外,看看这个问题:还有这个框架:据我所知,Youtube直接上传API是通过POST完成的,因此不需要GData框架。我用这里的说明作为参考