0

私は多くの研究からこのコードをまとめました。twitpic API に関する情報は次のとおりです。

http://twitpic.com/api.do#uploadAndPost

デバッグを通じて、ディクショナリが適切であり、すべてのメソッドを通過し、リクエストが送信されたことを確認できますが、NSLog メソッドは <> を返します。

multipart/form-data 構造についてはよくわかりません。たぶん、接続に何か問題がありますか?

以下のコード。

 -(void)uploadBoth {  
      //Create dictionary of post arguments
      NSArray *keys = [[NSArray alloc] initWithObjects:@"media",@"username",@"password",@"message",nil];
      NSArray *objects = [[NSArray alloc] initWithObjects:
           imageData, twitterUserSave, twitterPassSave, [NSString stringWithFormat:@"%@",messageView.text], nil];

      NSDictionary *keysDict = [[NSDictionary alloc] initWithObjects:objects forKeys:keys];
     NSLog(@"%@", keysDict);

      //create twitpic photo post
      NSURLRequest *twitpicPost = [self twitpicRequest:keysDict withData:imageData];

      //send request, return YES if successful
      NSURLConnection *twitpicConnection = [[NSURLConnection alloc] initWithRequest: twitpicPost delegate:self];

      if (!twitpicConnection) {
       NSLog(@"Failed to submit request");
      } else {
       NSLog(@"Request submitted");
       NSData *receivedData = [[NSMutableData data] retain];
       NSLog(@"%@", receivedData); // THIS PART RETURNS <>
      }
    }

NSURLRequest 部分

-(NSURLRequest *)twitpicRequest:(NSDictionary *)postKeys withData:(NSData *)data {

 NSLog(@"got this far");

  //create the URL POST Request to twitpic
  NSURL *twitpicURL = [NSURL URLWithString:@"http://twitpic.com/api/uploadAndPost"];
  NSMutableURLRequest *twitpicPost = [NSMutableURLRequest requestWithURL:twitpicURL];
  [twitpicPost setHTTPMethod:@"POST"];

  //Add the header info
  NSString *stringBoundary = [NSString stringWithString:@"0xAbCdEfGbOuNdArY"];
  NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",stringBoundary];
  [twitpicPost addValue:contentType forHTTPHeaderField: @"Content-Type"];

  //create the body
  NSMutableData *postBody = [NSMutableData data];
  [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];

  //add key values from the NSDictionary object
  NSEnumerator *keys = [postKeys keyEnumerator];
  int i;
  for (i = 0; i < [postKeys count]; i++) {
   NSString *tempKey = [keys nextObject];
   [postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",tempKey] dataUsingEncoding:NSUTF8StringEncoding]];
   [postBody appendData:[[NSString stringWithFormat:@"%@",[postKeys objectForKey:tempKey]] dataUsingEncoding:NSUTF8StringEncoding]];
   [postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
  }

  //add data field and file data
  [postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"data\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
  [postBody appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
  [postBody appendData:[NSData dataWithData:data]];
  [postBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];

  //add the body to the post
  [twitpicPost setHTTPBody:postBody];

 return twitpicPost;
}
4

1 に答える 1

1

ダウンロードを待たずにデータを印刷することを考えると、出力は理にかなっています。

NSData *receivedData = [[NSMutableData data] retain]; // this is a new empty data object
NSLog(@"%@", receivedData); // THIS PART RETURNS <>

「receivedData」は、実装ファイルの先頭で「NSMutableData」参照として(またはクラスヘッダーのインスタンス変数として)宣言する必要があります。次に、「 NSURLConnectionの使用」のリスト2〜5で説明されているように、デリゲートメソッドを実装する必要があります。

それ以外の場合は、同期要求を機能させることから始めたいと思うかもしれません。

NSURLResponse* response;
NSError* error;
NSData* result = [NSURLConnection sendSynchronousRequest:twitpicPost returningResponse:&response error:&error];
NSLog(@"%@",[[[NSString alloc] initWithData:result encoding:NSASCIIStringEncoding] autorelease]);
于 2009-11-22T03:57:27.147 に答える