问题描述
是否有人使用新的 Twitter 功能、状态/update_with_media?
我尝试用它来上传照片,但它返回内部服务器错误.
我的要求如下:
Does anybody use new twitter functionality, statuses/update_with_media?
I've tried to use it to upload photo and it returns internal server error.
My request is following:
*********************** start of request *************************
POST /1/statuses/update_with_media.json HTTP/1.1
Host: upload.twitter
User-Agent: CGJ/0.9.7 CFNetwork/485.13.8 Darwin/10.6.0
X-Twitter-Client: MGTwitterEngine
X-Twitter-Client-Version: 1.0
X-Twitter-Client-Url: http://mattgemmell/source
Content-Type: multipart/form-data; boundary=--------Asrf456BGe4h
Authorization: OAuth realm="", oauth_consumer_key="wEmJfFrYHMgmCGjAzHdS7Q", oauth_token="366466306-U2RDh7faJtMyi39ALIo2PooaKNT6BxHVT23UUVe4", oauth_signature_method="HMAC-SHA1", oauth_signature="Ev2RxuZbk3DiTQryIDUTPIJxYYE%3D", oauth_timestamp="1315289679", oauth_nonce="A968261D-CB8A-4E07-87AD-47AB138D332D", oauth_version="1.0", oauth_verifier="0087890"
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Content-Length: 4528
Connection: keep-alive
----------Asrf456BGe4h
Content-Disposition: form-data; name="status"
Test image uploading
----------Asrf456BGe4h
Content-Disposition: form-data; name="media[]"; filename="1.png"
Content-Type: image/png
iVBORw0... - base64 image data
----------Asrf456BGe4h
*********************** end of request *************************
我正在使用 MGTwitterEngine,这是生成此请求的代码:
I'm using MGTwitterEngine and here is the code that generate this request:
- (NSString *) _uploadImage:(UIImage *)image requestType:(MGTwitterRequestType)requestType responseType:(MGTwitterResponseType)responseType
{
NSString *boundary = @"--------Asrf456BGe4h";
NSURL *finalURL = [NSURL URLWithString:@"http://upload.twitter/1/statuses/update_with_media.json"];
if (!finalURL) {
return nil;
}
OAMutableURLRequest *theRequest = [[[OAMutableURLRequest alloc] initWithURL:finalURL
consumer:self.consumer
token:_accessToken
realm: nil
signatureProvider:nil] autorelease];
[theRequest setHTTPMethod:@"POST"];
[theRequest setHTTPShouldHandleCookies:NO];
// Set headers for client information, for tracking purposes at Twitter.
[theRequest setValue:_clientName forHTTPHeaderField:@"X-Twitter-Client"];
[theRequest setValue:_clientVersion forHTTPHeaderField:@"X-Twitter-Client-Version"];
[theRequest setValue:_clientURL forHTTPHeaderField:@"X-Twitter-Client-URL"];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[theRequest setValue:contentType forHTTPHeaderField:@"content-type"];
// Set request body, if specified (hopefully so), with 'source' parameter if appropriate.
NSMutableData *body = [NSMutableData dataWithLength:0];
[body appendData:[[NSString stringWithFormat:@"--%@
", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name="status"
"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"
"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Honeymoon application uploads image
"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"--%@
", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name="media[]"; filename="1.png"
"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Type: image/png
"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"
"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:[UIImagePNGRepresentation(image) base64EncodingWithLineLength:0]] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"
"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"--%@", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[theRequest setHTTPBody:body];
[theRequest prepare];
MGTwitterHTTPURLConnection *connection;
connection = [[MGTwitterHTTPURLConnection alloc] initWithRequest:theRequest
delegate:self
requestType:requestType
responseType:responseType];
if (!connection) {
return nil;
} else {
[_connections setObject:connection forKey:[connection identifier]];
[connection release];
}
return [connection identifier];
}
有人可以帮我检测出什么问题吗?
提前致谢!
Can anybody help me to detect what is wrong?
Thanks in advance!
推荐答案
我已经解决了问题,但我真的不知道根本原因在哪里.
因此,我们所做的是以下列方式更改代码:
I've solved the problem, but really I don't know where root cause was.
So, what was done is changing the code in following manner:
- (NSString *) _uploadImage:(UIImage *)image requestType:(MGTwitterRequestType)requestType responseType:(MGTwitterResponseType)responseType
{
NSString *boundary = @"----------------------------991990ee82f7";
NSURL *finalURL = [NSURL URLWithString:@"http://upload.twitter/1/statuses/update_with_media.json"];
if (!finalURL) {
return nil;
}
OAMutableURLRequest *theRequest = [[[OAMutableURLRequest alloc] initWithURL:finalURL
consumer:self.consumer
token:_accessToken
realm: nil
signatureProvider:nil] autorelease];
[theRequest setHTTPMethod:@"POST"];
[theRequest setHTTPShouldHandleCookies:NO];
// Set headers for client information, for tracking purposes at Twitter.
[theRequest setValue:_clientName forHTTPHeaderField:@"X-Twitter-Client"];
[theRequest setValue:_clientVersion forHTTPHeaderField:@"X-Twitter-Client-Version"];
[theRequest setValue:_clientURL forHTTPHeaderField:@"X-Twitter-Client-URL"];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[theRequest setValue:contentType forHTTPHeaderField:@"content-type"];
NSMutableData *body = [NSMutableData dataWithLength:0];
[body appendData:[[NSString stringWithFormat:@"--%@
", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name="media_data[]"; filename="1.png"
"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream
"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"
"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:[UIImageJPEGRepresentation(image, 1.0) base64EncodingWithLineLength:0]] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"
--%@
", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name="status"
"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"
"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Honeymoon uploads image
"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"--%@--
", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
// --------------------------------------------------------------------------------
// modificaiton from the base clase
// our version "prepares" the oauth url request
// --------------------------------------------------------------------------------
[theRequest prepare];
[theRequest setHTTPBody:body];
// Create a connection using this request, with the default timeout and caching policy,
// and appropriate Twitter request and response types for parsing and error reporting.
MGTwitterHTTPURLConnection *connection;
connection = [[MGTwitterHTTPURLConnection alloc] initWithRequest:theRequest
delegate:self
requestType:requestType
responseType:responseType];
if (!connection) {
return nil;
} else {
[_connections setObject:connection forKey:[connection identifier]];
[connection release];
}
return [connection identifier];
}
与之前的代码有3处不同:
1. 数据顺序不同,即先填充图像数据,再填充状态数据
2. 使用 media_data[] 键代替 media[]
3.prepare后调用set http body
There are 3 differences with previous code:
1. Different order of data, it means that firstly image data was filled, and then status data
2. Using media_data[] key instead of media[]
3. Call set http body of request after prepare
希望对大家有所帮助.
这篇关于Twitter 在 iOS 上的 statuses/update_with_media 返回 500 错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
更多推荐
[db:关键词]
发布评论