【问题标题】:How to send a Http post request in objective c?如何在目标 c 中发送 Http 发布请求?
【发布时间】:2012-12-11 08:24:06
【问题描述】:

我正在尝试向 youtube 发送发布请求,以将视频添加到收藏列表。 API文档是here

这是我的源代码:

- (void) addVideoToFavoriteWithID:(NSString *)strVideoID{
    NSString* strConnection = [NSString stringWithFormat:@"%@%@",CONNECTION_YOUTUBE, CONNECTION_ADD_VIDEO_TO_FAVORITE];
    AppDelegate* delegate =    (AppDelegate*)[[UIApplication sharedApplication] delegate];
    ASIFormDataRequest *formData = [[ASIFormDataRequest alloc]initWithURL:[NSURL URLWithString:strConnection]];
    [formData setRequestMethod:@"POST"];
    [formData setPostValue:@"2" forKey:@"GData-Version"];
    [formData setPostValue:@"application/atom+xml" forKey:@"Content-Type"];
    [formData setPostValue:YOUTUBE_DEVELOPER_KEY    forKey:@"X-GData-Key"];
    [formData setPostValue:[[delegate userInfo   ]accessTokenYoutube]  forKey:@"Authorization"];

    NSString *body = [NSString stringWithFormat:@"<?xml version='1.0' encoding='UTF-8'?><entry xmlns='http://www.w3.org/2005/Atom'><id>%@</id></entry>",strVideoID];
    [formData setPostValue:body forKey:@"body"  ];

    [formData setDelegate:self];
    [formData setDidFinishSelector:@selector(didAddVideoToFavoriteFinish:)];
    [formData setDidFailSelector:@selector(didAddVideoToFavoriteFail:)];\
    [formData setDidReceiveDataSelector:@selector(didAddVideoToFavoriteSelect:)];
    [formData startAsynchronous];

    [formData release];
}

didAddVideoToFavoriteFinish方法中,收到消息:

HTTP/1.1 415 不支持的媒体类型

请告诉我这里的错误是什么。我是目标 C 的新手,对此我感到非常困惑。

【问题讨论】:

  • [415 Unsupported Media Type] If the client sends a document that’s got the right media type but the wrong format (such as an XML document written in the wrong vocabulary), a better response is the more generic 400 (“Bad Request”) stackoverflow.com/questions/4308672/…

标签: objective-c ios youtube-api asihttprequest


【解决方案1】:

也许您可以查看 Google 提供的 this Objective-C API set。编写所有 REST 的东西可能会很痛苦。

【讨论】:

  • 我不明白你的回答,Onevcat。你能告诉我更多细节吗?
  • Google 已经用 Objective-C 编写(或生成)了很多 API,可以在上面的链接中找到。在这些 API 中,几乎所有的部分网络事务都为您实现了,您可以根据自己的情况应用用户名或列表名称之类的内容,并调用一个简单的方法来完成您的工作。这意味着您可以摆脱痛苦的发布/获取/删除并自己编写请求。可以通过这个link详细查看Youtube的这些OC API。
  • 我认为 onevcat 想说的是使用包装器来构造您的调用。构建请求、添加所有标头等可能会耗费大量时间和代码。你最好看看谷歌在这方面提供的图书馆。 code.google.com/p/gdata-objectivec-client 编辑:看起来 onevcat 已经解释过自己了 :)
  • 或者如果你想自己实现请求,可以尝试一些网络框架,比如AFNetworking或者MKNetworkKit。我猜你不会想用苹果的网络 SDK,它真的很难用。
  • 是的,你是对的。由于一些特殊原因,我的团队是自己执行请求。我们使用的框架是:ASIHTTPRequest
【解决方案2】:

您的 POST 请求是一个表单数据请求,通常用于发布 HTML 表单的数据。它对数据使用特殊编码。这不是 YouTube API 所期望的。它需要一个带有 XML 文档的简单 POST 请求。

您应该使用ASIHTTPRequest 类而不是ASIFormDataRequest 类。您的代码或多或少应该是这样的:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:strConnection]];
[request setRequestMethod:@"POST"];
[request setPostValue:@"2" forKey:@"GData-Version"];
[request setPostValue:@"application/atom+xml" forKey:@"Content-Type"];
[request setPostValue:YOUTUBE_DEVELOPER_KEY    forKey:@"X-GData-Key"];
[request setPostValue:[[delegate userInfo   ]accessTokenYoutube]  forKey:@"Authorization"];

NSString *body = [NSString stringWithFormat:@"<?xml version='1.0' encoding='UTF-8'?><entry xmlns='http://www.w3.org/2005/Atom'><id>%@</id></entry>",strVideoID];
[request appendPostData:[body dataUsingEncoding:NSUTF8StringEncoding]];

[request setDelegate:self];
[request setDidFinishSelector:@selector(didAddVideoToFavoriteFinish:)];
[request setDidFailSelector:@selector(didAddVideoToFavoriteFail:)];\
[request setDidReceiveDataSelector:@selector(didAddVideoToFavoriteSelect:)];
[request startAsynchronous];

[request release];

【讨论】:

  • 我们在 ASIHTTPRequest 中有 setPostValue 方法吗?这对你有用吗? @Codo
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
相关资源
最近更新 更多