- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
任何熟悉使用“Twitpic api”将图像上传到 Twitter 的源代码的人都可以告诉我为什么当我尝试上传图像时收到 0 响应代码吗?
这是我的代码:
- (BOOL)uploadImageToTwitpic:(UIImage*)image
withMessage:(NSString*)theMessage
username:(NSString*)username
password:(NSString*)password
{
NSString *stringBoundary, *contentType, *message, *baseURLString, *urlString;
NSData *imageData;
NSURL *url;
NSMutableURLRequest *urlRequest;
NSMutableData *postBody;
// Create POST request from message, imageData, username and password
baseURLString = kTwitpicUploadURL;
urlString = [NSString stringWithFormat:@"%@", baseURLString];
url = [NSURL URLWithString:urlString];
urlRequest = [[[NSMutableURLRequest alloc] initWithURL:url] autorelease];
[urlRequest setHTTPMethod:@"POST"];
// Set the params
message = ([theMessage length] > 1) ? theMessage : @"Here's my new Light Table collage.";
imageData = UIImageJPEGRepresentation(image, kTwitpicImageJPEGCompression);
// Setup POST body
stringBoundary = [NSString stringWithString:@"0xKhTmLbOuNdArY"];
contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", stringBoundary];
[urlRequest addValue:contentType forHTTPHeaderField:@"Content-Type"];
// Setting up the POST request's multipart/form-data body
postBody = [NSMutableData data];
[postBody appendData:[[NSString stringWithFormat:@"\r\n\r\n--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"source\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithString:@"lighttable"] dataUsingEncoding:NSUTF8StringEncoding]]; // So Light Table show up as source in Twitter post
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"username\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithString:username] dataUsingEncoding:NSUTF8StringEncoding]]; // username
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"password\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithString:password] dataUsingEncoding:NSUTF8StringEncoding]]; // password
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"message\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithString:message] dataUsingEncoding:NSUTF8StringEncoding]]; // message
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"media\"; filename=\"%@\"\r\n", @"lighttable_twitpic_image.jpg" ] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Type: image/jpg\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; // jpeg as data
[postBody appendData:[[NSString stringWithString:@"Content-Transfer-Encoding: binary\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:imageData]; // Tack on the imageData to the end
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[urlRequest setHTTPBody:postBody];
NSLog(@"data=======>%@",postBody);
NSLog(@"URLReq========>%@",urlRequest);
// Spawn a new thread so the UI isn't blocked while we're uploading the image
[NSThread detachNewThreadSelector:@selector(uploadingDataWithURLRequest:) toTarget:self withObject:urlRequest];
return YES; // TODO: Should raise exception on error
}
- (void)uploadingDataWithURLRequest:(NSURLRequest*)urlRequest {
// Called on a separate thread; upload and handle server response
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[urlRequest retain]; // Retain since we autoreleased it before
// Send the request
NSHTTPURLResponse *urlResponse;
NSError *error;
NSData *responseData = [NSURLConnection sendSynchronousRequest:urlRequest
returningResponse:&urlResponse
error:&error];
NSString *responseString = [[NSString alloc] initWithData:responseData
encoding:NSUTF8StringEncoding];
// Handle the error or success
// If error, create error message and throw up UIAlertView
NSLog(@"Response Code: %d", [urlResponse statusCode]);
if ([urlResponse statusCode] >= 200 && [urlResponse statusCode] < 300) {
NSLog(@"urlResultString: %@", responseString);
NSString *match = [responseString stringByMatching:@"http[a-zA-Z0-9.:/]*"]; // Match the URL for the twitpic.com post
NSLog(@"match: %@", match);
// Send back notice to delegate
[delegate twitpicEngine:self didUploadImageWithResponse:match];
}
else {
NSLog(@"Error while uploading, got 400 error back or no response at all: %@", [urlResponse statusCode]);
[delegate twitpicEngine:self didUploadImageWithResponse:nil]; // Nil should mean "upload failed" to the delegate
}
[pool drain];
[responseString release];
[urlRequest release];
}
最佳答案
编辑:我建议阅读 this SO question看看创建 POST 请求的不同方式是否有帮助。
<小时/>我不熟悉 Twitpic API我自己,但我会尝试提出一些建议来帮助您缩小问题范围。
我要检查的第一件事是 POST 正文的正确性。您的创建代码不必要地复杂且难以阅读,因此如果其中可能存在错误,我不会感到惊讶。我正在发布一个修订版本(免责声明,我还没有编译它),它可以简化创建并提高性能。 (您创建了大量自动释放的 NSString 和 NSData 对象,并且每次都将字符串转换为数据只是为了附加数据字节。构建可变字符串并转换一次是一种更快、更简单的方法。)
与此相关的是,当每个变量都在方法顶部声明时,通读代码会有点困难。这在任何最新的 C(或派生语言)标准中都是不必要的,并且在第一次使用变量时声明变量被认为是更好的做法。它不仅使代码更易于阅读,而且通常会删除一些不必要的行。
这是带有一些建议修改的代码。它们可能会让查明问题变得更加容易。
- (BOOL)uploadImageToTwitpic:(UIImage*)image
withMessage:(NSString*)theMessage
username:(NSString*)username
password:(NSString*)password
{
// Create POST request from message, imageData, username and password
NSString *baseURLString = kTwitpicUploadURL;
NSString *urlString = [NSString stringWithFormat:@"%@", baseURLString];
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *urlRequest = [[[NSMutableURLRequest alloc] initWithURL:url] autorelease];
[urlRequest setHTTPMethod:@"POST"];
// Set the params
NSString *message = ([theMessage length] > 1) ? theMessage : @"Here's my new Light Table collage.";
// Setup POST body
NSString *stringBoundary = [NSString stringWithString:@"0xKhTmLbOuNdArY"];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", stringBoundary];
[urlRequest addValue:contentType forHTTPHeaderField:@"Content-Type"];
NSString *stringBoundarySeparator = [NSString stringWithFormat:@"\r\n--%@\r\n", stringBoundary];
NSMutableString *postString = [NSMutableString string];
[postString appendString:@"\r\n"];
[postString appendString:stringBoundarySeparator];
[postString appendString:@"Content-Disposition: form-data; name=\"source\"\r\n\r\n"];
[postString appendString:@"lighttable"]; // So Light Table shows up as source in Twitter
[postString appendString:stringBoundarySeparator];
[postString appendStringWithFormat:@"Content-Disposition: form-data; name=\"username\"\r\n\r\n%@", username];
[postString appendString:stringBoundarySeparator];
[postString appendStringWithFormat:@"Content-Disposition: form-data; name=\"password\"\r\n\r\n%@", password];
[postString appendString:stringBoundarySeparator];
[postString appendStringWithFormat:@"Content-Disposition: form-data; name=\"message\"\r\n\r\n%@", message];
[postString appendString:stringBoundarySeparator];
[postString appendStringWithFormat:@"Content-Disposition: form-data; name=\"media\"; filename=\"%@\"\r\n", @"lighttable_twitpic_image.jpg"];
[postString appendString:@"Content-Type: image/jpg\r\n"]; // data as JPEG
[postString appendString:@"Content-Transfer-Encoding: binary\r\n\r\n"];
// Setting up the POST request's multipart/form-data body
NSMutableData *postBody = [NSMutableData data];
[postBody appendData:[postString dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:UIImageJPEGRepresentation(image, kTwitpicImageJPEGCompression)]; // Tack on the image data to the end
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[urlRequest setHTTPBody:postBody];
NSLog(@"data=======>%@",postBody);
NSLog(@"URLReq========>%@",urlRequest);
// Spawn a new thread so the UI isn't blocked while we're uploading the image
[NSThread detachNewThreadSelector:@selector(uploadingDataWithURLRequest:) toTarget:self withObject:urlRequest];
return YES; // TODO: Should raise exception on error
}
// Called on a separate thread; upload and handle server response
- (void)uploadingDataWithURLRequest:(NSURLRequest *)urlRequest {
[urlRequest retain]; // Retain since we're using it in this method
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Send the request
NSHTTPURLResponse *urlResponse;
NSError *error;
NSData *responseData = [NSURLConnection sendSynchronousRequest:urlRequest
returningResponse:&urlResponse
error:&error];
NSString *responseString = [[[NSString alloc] initWithData:responseData
encoding:NSUTF8StringEncoding] autorelease];
// Handle the error or success
// If error, create error message and throw up UIAlertView
NSLog(@"Response Code: %d", [urlResponse statusCode]);
NSLog(@"Response String: %@", responseString);
if ([urlResponse statusCode] >= 200 && [urlResponse statusCode] < 300) {
NSString *match = [responseString stringByMatching:@"http[a-zA-Z0-9.:/]*"]; // Match the URL for the twitpic.com post
NSLog(@"match: %@", match);
// Send back notice to delegate
[delegate twitpicEngine:self didUploadImageWithResponse:match];
}
else {
NSLog(@"Error while uploading, got 400 error back or no response at all: %@", [urlResponse statusCode]);
[delegate twitpicEngine:self didUploadImageWithResponse:nil]; // Nil should mean "upload failed" to the delegate
}
[pool drain];
[urlRequest release];
}
有一件事可以帮助我们回答您的问题:您声明响应代码为 0,但没有说明响应的其余部分(您在 responseString
中记录的)是什么。由于您仅打印状态代码在 [200,300) 范围内的情况,因此您可能看不到问题的原因,即使 Twitpic可能 将其传递回给您。值得一试...(我已经在上面的代码中做到了这一点。)
关于iphone - 使用 Twitpic API 上传图像时出现错误的响应代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1188094/
我正在使用 twitpic 库在 Twitter 上发布图片,但我收到了无效的 twitpic 用户名和密码错误。这个有解决办法吗??witpic的用户名和密码是什么。我只是使用我的 Twitter
我正在尝试使用 OAuthConsumer 将图像发布到 TwitPic。我不断收到 401“无法验证您的身份(标题被 Twitter 拒绝)”。错误。 我还利用 Twitter+OAuth 库来处理
任何熟悉使用“Twitpic api”将图像上传到 Twitter 的源代码的人都可以告诉我为什么当我尝试上传图像时收到 0 响应代码吗? 这是我的代码: - (BOOL)uploadImageToT
我希望在我的网站上有一个按钮,用户可以单击该按钮以使用 Twitpic/Yfrog 在其 Twitter 帐户上发布图像。我一直在寻找一些可以做到这一点的示例代码,但我一直找不到任何东西。 谁能帮我解
所以在这个网址中:http://twitpic.com/2paihn Twitpic ID 是:2paihn 实际图片网址是: http://s3.amazonaws.com/twitpic/phot
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我是安卓开发的新手。我需要通过我的 Android 应用程序在 Twitter 中发布文本和图像。 我有一个示例项目 AndroidTwitpic .我有连接问题。后来我用 twitter4j-cor
我在将图片上传到 Twitter 时遇到问题。我正在使用 MGTwitterEngine + OAuth 访问 Twitter - 它工作得很好。我可以访问时间线、列表等。但是现在我需要上传图像。我正
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭
有什么方法可以从 Twitpic URL 下载图片吗?假设我想获得下一张照片 http://twitpic.com/49275c . 最佳答案 ID 为49275c 的图像的相应链接由 给出 http
我想在 twitter 上上传图像。为此,我使用了 Twitpic API。我可以使用 oauth 上传图像,其中我需要手动输入 pin。请有人建议我如何从 mgtwitter 引擎通过 twitpi
这里有一个类似的问题,我已经阅读过,并且尝试遵循那里给出的建议...我认为我已经完成了 95%,但剩下的 5%...你知道;-) 所以我尝试调用 twitPic API 来上传图像,并且我已经将图像包
嘿,我正在开发一个基于 iCodeblog 源代码的 Twitter 应用程序。(http://icodeblog.com/wp-content/uploads/2010/09/iCodeOauth.
这不是一个代码问题。几个月前我在网上发现了一个不错的工具,但现在我不记得它的名称/地址了。也许你知道。 我发现了一个很棒的示例应用程序,集成了大多数社交服务 - Facebook、twitter、Tw
我尝试使用 Scribe 上传照片,但似乎不起作用并出现错误: Authentication challenged received is null 由于缺乏有关如何解决此问题的文档,我不知道。 相关
我正在使用 OAuth 将照片上传到 TwitPic ,来自用 C# 编写的 .NET 应用程序。 oAuth 的东西有点棘手。我找到了两段 .NET 代码来处理它,但对两者都不满意。 DotNetO
我正在尝试使用 WP7 应用程序中的 TweetSharp 和 Hammock 库将图片上传到 Twitpic。上传照片的代码是这样的: // Clients.srv is a TweetSharp
我正在使用 meltingice's API for TwitPic当我尝试上传图片时,出现 401 错误消息“无法对您进行身份验证(标题被 Twitter 拒绝)”。 我的 header (从 HT
对于我正在处理的个人项目,我想为我网站上的对象生成 id,其样式与 bit.ly 和 twitpic 等网站相同。将用户发送到 example.com/4gwv9k 可以让我获得 ID 为
我是一名优秀的程序员,十分优秀!