0

AFNetworkingを使用してサーバーからjpegファイルをダウンロードしようとしています。サーバーへのアクセスは成功しているように見えますが、responseObject は空です。

関連するコードは次のとおりです。

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:"https://api.test.info/"];
[client registerHTTPOperationClass:[AFJSONRequestOperation class]];
[client setDefaultHeader:@"Accept" value:@"application/json"];
[client setParameterEncoding:AFJSONParameterEncoding];
[client setAuthorizationHeaderWithUsername:@"username" password:@"password"];

[AFJSONRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"image/jpeg"]];
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];

[client getPath:@"image/number1" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject){
    NSData *test = responseObject;
    NSLog(@"%@", responseObject);
    NSLog(@"%@", test);
    [self.imgProfile setImage:[UIImage imageWithData:test]];
}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@", error);
}];

このコードの出力: (null) (null)

つまり、responseObject と test は空のオブジェクトです。ブラウザで同じ URL を使用すると、簡単に画像を取り戻すことができます。他の要求が機能するため、ユーザー名とパスワードは有効です。

画像をダウンロードするには、何を変更する必要がありますか?

どんな助けでも大歓迎です。

4

2 に答える 2

0

彼はすべてのリクエストを NSData として処理するため、Fogmeister のソリューションも機能するはずです。AFHTTPOperationClasses を登録する代わりに。

私の解決策:

  1. [self registerHTTPOperationClass:[AFImageRequestOperation クラス]];

  2. URL に拡張子が使用されていることを確認してください

これは私の状況でした:

データと画像を要求する API があります。データと画像にアクセスするには、ヘッダーにユーザー名とパスワードを設定する必要があります。これを行う最善の (唯一の?) 方法は、AFHTTPClient をサブクラス化し、それをアプリケーション全体でシングルトンとして使用することです。

私が受け取らなければならなかった JSON-Data に対してはすべてうまくいきましたが、数日前に写真をリクエストしたいと思いました。写真は明らかに JSON-Data ではありませんが、シングルトンを介してそれらを要求しようとしました。

リクエストは成功しましたが、responseObject にデータがありませんでした。

まず、google と reading、stackoverflow と reading... あまり役に立ちませんでした。

それで、私は何をしましたか?

HTTPClient の HTTPOperationClass としてクラス AFImageRequestOperation を登録しようとしました。

[self registerHTTPOperationClass:[AFImageRequestOperation class]];

メソッドが

+ (BOOL)canProcessRequest:(NSURLRequest *)urlRequest

AFImageRequestOperationの URL の拡張子のみをチェックします。

そして、私が呼び出していた URL には拡張子がありませんでした。最初に、AFJSONRequestOperation を手早くカスタマイズして、NSData として画像も返せるようにしました。他のすべてが正常に機能するかどうかを確認するだけです。

ここで、API を少し変更するように同僚に伝えました。これにより、"jpg" というサフィックスを付けて URL を呼び出せるようになりました。

今、すべてが正常に動作します。

これはどこかで伝えたかった!誰かが同じ問題に遭遇した場合。

于 2013-08-28T12:28:01.360 に答える
0

JSON リクエストを使用するようにクライアントに指示しています。JSON は画像ではありません。

NSData が必要な場合は、これを行うことができます...

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:"https://api.test.info/"];
[client setAuthorizationHeaderWithUsername:@"username" password:@"password"];

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];

[client getPath:@"image/number1" parameters:nil success:^(AFHTTPRequestOperation *operation, NSData responseObject){
    [self.imgProfile setImage:[UIImage imageWithData:responseObject]];
}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@", error);
}];

または、self.imgProfileUIImageView の場合はさらに簡単です...

[self.imgProfile setImageWithURL:[NSURL URLWithString:@"https://api.test.info/image/number1"]];

ただし、これが承認でどのように機能するかはわかりません。

実際、これはどうしよう…

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:"https://api.test.info/"];
[client setAuthorizationHeaderWithUsername:@"username" password:@"password"];

NSURLRequest *request = [client requestWithMethod:@"GET" path:@"image/number1" parameters:nil];

[self.imgProfile setImageWithURLRequest:request placeholderImage:nil success:nil failure:nil];
于 2013-08-28T09:04:21.917 に答える