2

AFNetworking を使用して、 CardShark の APIに画像を送信しようとしています。

NSData *imageData = UIImageJPEGRepresentation(cardImage, 1.0);
NSDictionary *parameters = @{@"front" : [imageData base64EncodedStringWithSeparateLines:NO]};

NSString *path = [NSString stringWithFormat:@"cardShark?webhookUrl=%@&apiKey=%@", kCardSharkWebHookURLEncodedString, kCardSharkAPIKey];

[self postPath:path parameters:parameters
       success:^(AFHTTPRequestOperation *operation, id responseObject)
{
    completion(responseObject, nil);
}
       failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
    completion(nil, error);
}];

base64 文字列のすべての組み合わせを試しました。

base64EncodedStringWithSeparateLines:YES
base64EncodedStringWithSeparateLines:NO
base64EncodedString`

無駄に、HTTPBody生成されたリクエストを調べた後、物事がエスケープされていることがわかりました。

生のbase64はで始まります

/9j/4AAQSkZJRgABAQAAAQABAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAAB AAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAEOKAD AAQAAAABAAACrAAAAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB

しかし、AFNetworking とおそらく NSJSONSerialization を通過すると、次のように投稿されます。

\/9j\/4AAQSkZJRgABAQAAAQABAAD\/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAEOKADAAQAAAABAAACrAAAAAD\/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH\/

ご覧の/とおり、エスケープされています。どうすれば脱走を防げますか? 別のツール (a la、curl) を介して正確な JSON 本文を API に渡すと、API でエラーが発生します。では、ここで最善のアプローチは何ですか?

4

1 に答える 1

0

これは、API のせいであることがわかりました。AFNetworking には、Content-Type ヘッダーを で設定する次のコードがありますcharset=utf-8

case AFJSONParameterEncoding:;
                    [request setValue:[NSString stringWithFormat:@"application/json; charset=%@", charset] forHTTPHeaderField:@"Content-Type"];
                    [request setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:0 error:&error]];
                    break;

私の理解を超えた何らかの理由で、彼らの API はcharsetヘッダーの属性をサポートしていませんでした。

そうは言っても、彼らはこの問題を迅速に修正し、現在は上記のコードを変更することなく動作しています.

于 2013-02-06T22:22:41.503 に答える