将图像,http标头从xcode发送到API'格式错误的身份验证标头'

时间:2013-01-17 21:07:21

标签: objective-c xcode api

我正在构建一个使用API​​的应用程序,通过PHP它正在工作,但现在我必须构建xcode并获取错误'格式错误的身份验证头'返回,不知道我在ObjectC代码中错过了什么如何调试。

在我的Query.m中是我如何构建我的标题

- (NSData *)multipartFormDataWithBoundary:(NSString *)boundary
{
NSMutableData *body = [NSMutableData data];
// Image data part
[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSASCIIStringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"query[file]\"; filename=\"query.%@\"\r\n", imageType] dataUsingEncoding:NSASCIIStringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Type: image/%@\r\n", imageType] dataUsingEncoding:NSASCIIStringEncoding]];
[body appendData:[@"Content-Transfer-Encoding: binary\r\n" dataUsingEncoding:NSASCIIStringEncoding]];
[body appendData:[@"\r\n" dataUsingEncoding:NSASCIIStringEncoding]];
[body appendData:imageData];
[body appendData:[@"\r\n" dataUsingEncoding:NSASCIIStringEncoding]];
// Location parts
if (self.location) {
    [body appendData:[self textPart:[NSString stringWithFormat:@"%f", location.coordinate.latitude] forKey:@"query[latitude]" boundary:boundary]];
    [body appendData:[self textPart:[NSString stringWithFormat:@"%f", location.coordinate.longitude] forKey:@"query[longitude]" boundary:boundary]];
}
// End of boundary
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSASCIIStringEncoding]];

return body;
}


#pragma mark -
#pragma mark Instance methods

- (NSString *)create
{
NSURL *queriesURL = [NSURL URLWithString:@"https://url.com/v4/query"];
NSString *contentType = @"multipart/form-data";
NSString *httpMethod = @"POST";
NSString *boundary = [NSString stringWithFormat:@"%d", arc4random() % 999999];  

NSData *contentData = [self multipartFormDataWithBoundary:boundary];

NSString *dateValue = HttpDate();


// request header values
NSString *authorizationValue = [NSString stringWithFormat:@"Authorization: Token %@", accessKey];
NSString *contentTypeValue = [NSString stringWithFormat:@"%@; boundary=%@", contentType, boundary];

// create the request object
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:queriesURL];
[request setHTTPMethod:httpMethod];
[request addValue:contentTypeValue forHTTPHeaderField:@"Content-Type"];
[request addValue:authorizationValue forHTTPHeaderField:@"Authorization"];
[request addValue:dateValue forHTTPHeaderField:@"Date"];
[request setHTTPBody:contentData];

NSLog(@"request: %@", request);

// send the request
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSLog(@"return data: %@", returnData);

NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];

NSLog(@"return string: %@", returnString);


return returnString;
}

这就是我在picture.m

中使用的内容
UIImage *originalImage = [info objectForKey:UIImagePickerControllerOriginalImage];
if (originalImage) {

    NSData *jpegData = UIImageJPEGRepresentation(originalImage, 0.75);
    KQuery *query = [[KQuery alloc] initWithImageData:jpegData type:@"jpeg"];
    query.secretKey = @"3r4yq0LI";
    //query.location = locationManager.location; // might be nil
    result = [query create];
    NSLog(@"The return string: %@", [query create]);
}

这是有效的PHP查询:

$boundary = uniqid();

# Construct the body of the request
$body  = image_part($boundary, "image", $file_name, $img);
$body .= "--" . $boundary . "--\r\n";

var_dump($body);

$context = stream_context_create(array(
          'http' => array(
               'method' => 'POST',
               'header' => 'Content-type: multipart/form-data; boundary='.$boundary."\r\n" .
                           'Authorization: Token ' . $query_key,
               'content' => $body
               )
          ));

 $result = file_get_contents($url, false, $context);

 echo "Result: ", $result;


 # add image part to a kooaba multipart request
 function image_part($boundary, $attr_name, $file_name, $data) {
 $str  = "--" . $boundary . "\r\n";
 $str .= 'Content-Disposition: form-data; name="'. $attr_name .'"; filename="' .    $file_name . '"' . "\r\n";
 $str .= 'Content-Transfer-Encoding: binary' ."\r\n";
 $str .= 'Content-Type: image/jpeg' . "\r\n\r\n";
 $str .= $data . "\r\n";
 return $str;
}

我想我在PHP中使用的所有东西都在ObjectC中...,任何人都知道如何检查我发送的头文件或如何调试它?

1 个答案:

答案 0 :(得分:0)

所以为了回答你的问题,如何调试ObjC文件以检查字符串的值,我发现最简单的方法是在使用你设置的变量之前设置一个断点。

因此,在您的示例中,您将在行的上方放置一个断点:

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

并且一旦模拟器(或真实设备)在断点处暂停,当您将鼠标悬停在变量上时,会突然显示它们的值。

这在iOS编码中非常有用。

希望这会有所帮助。