基本的な認証セキュリティを使用してhttps JSON/POSTを送信するおもちゃのアプリがあります。 AFNetworkingの使用を検討する必要があると言われました。私はAFNetwork-2をXCodeプロジェクト(ios7ターゲット、XCode5)にうまくインストールできました。ただし、AFNetworking-2の現在のバージョンに関連しているように見える例はなく、以前のバージョンに関連しているようです。 AFNetworkingのドキュメントはかなりまばらなので、これらをまとめる方法に苦労しています。非AFNetworkingコードは次のようになります。
NSURL *url = [NSURL URLWithString:@"https://xxx.yyy.zzz.aaa:bbbbb/twig_monikers"];
NSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:url
cachePolicy: NSURLRequestUseProtocolCachePolicy
timeoutInterval: 10.0];
NSData *requestData = [NSJSONSerialization dataWithJSONObject: [self jsonDict] options: 0 error: nil];
[request setHTTPMethod: @"POST"];
[request setValue: @"application/json" forHTTPHeaderField: @"Accept"];
[request setValue: @"application/json" forHTTPHeaderField: @"Content-Type"];
[request setValue:[NSString stringWithFormat: @"%d", [requestData length]] forHTTPHeaderField: @"Content-Length"];
NSData *plainPassText = [@"app_pseudouser:sample_password" dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64PassText = [plainPassText base64EncodedStringWithOptions: NSDataBase64Encoding76CharacterLineLength];
[request setValue:[NSString stringWithFormat: @"Basic %@", base64PassText] forHTTPHeaderField: @"Authorization"];
FailedCertificateDelegate *fcd=[[FailedCertificateDelegate alloc] init];
NSURLConnection *c=[[NSURLConnection alloc] initWithRequest:request delegate:fcd startImmediately:NO];
[c setDelegateQueue:[[NSOperationQueue alloc] init]];
[c start];
NSData *data=[fcd getData];
if (data)
NSLog(@"Submit response data: %@", [NSString stringWithUTF8String:[data bytes]]);
私のコードを書いてくれる人を探しているのではありません。 AFNetworking-2のパーツをそれにマッピングする方法がわからないようです。リンク、例、説明は大歓迎です。
更新1
上記は動作することが知られている非AFバージョンです。一度にすべてを取得しようと動いて、私は試してみました:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager.requestSerializer
setAuthorizationHeaderFieldWithUsername:@"app_pseudouser"
password:@"sample_password"];
AFHTTPRequestOperation *operation =
[manager
PUT: @"https://172.16.214.214:44321/twig_monikers"
parameters: [self jsonDict]
success:^(AFHTTPRequestOperation *operation, id responseObject){
NSLog(@"Submit response data: %@", responseObject);}
failure:^(AFHTTPRequestOperation *operation, NSError *error){
NSLog(@"Error: %@", error);}
];
次のエラーが発生します。
2013-10-09 11:41:38.558 TwigTag[1403:60b] Error: Error Domain=NSURLErrorDomain Code=-1012 "The operation couldn’t be completed. (NSURLErrorDomain error -1012.)" UserInfo=0x1662c1e0 {NSErrorFailingURLKey=https://172.16.214.214:44321/twig_monikers, NSErrorFailingURLStringKey=https://172.16.214.214:44321/twig_monikers}
サーバー側を見ていると、何も実行されません。それがhttpsなのか、何が原因なのかはわかりませんが、アプリを元のコードに戻すと、問題なく動作します。
更新:次のJSON部分はPUT/POSTでは機能するが、GET/HEAD/DELETEでは機能しないことが判明
いくつかのラングリングを行い、SOの外部で支援した後、私は何か機能するものを手に入れました。それを記念品として残したかったのです。結局、AFNetworking-2には本当に感銘を受けました。それはとても簡単だったので、私はそれを必要以上に難しくすることを試み続けました。送信するjsonパケットを返すjsonDict
メソッドを指定して、以下を作成しました。
- (void) submitAuthenticatedRest_PUT
{
// it all starts with a manager
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// in my case, I'm in prototype mode, I own the network being used currently,
// so I can use a self generated cert key, and the following line allows me to use that
manager.securityPolicy.allowInvalidCertificates = YES;
// Make sure we a JSON serialization policy, not sure what the default is
manager.requestSerializer = [AFJSONRequestSerializer serializer];
// No matter the serializer, they all inherit a battery of header setting APIs
// Here we do Basic Auth, never do this outside of HTTPS
[manager.requestSerializer
setAuthorizationHeaderFieldWithUsername:@"basic_auth_username"
password:@"basic_auth_password"];
// Now we can just PUT it to our target URL (note the https).
// This will return immediately, when the transaction has finished,
// one of either the success or failure blocks will fire
[manager
PUT: @"https://101.202.303.404:5555/rest/path"
parameters: [self jsonDict]
success:^(AFHTTPRequestOperation *operation, id responseObject){
NSLog(@"Submit response data: %@", responseObject);} // success callback block
failure:^(AFHTTPRequestOperation *operation, NSError *error){
NSLog(@"Error: %@", error);} // failure callback block
];
}
3つのセットアップステートメントと、それに続く2つのメッセージ送信。これは本当に簡単です。
編集/追加:@jsonDict実装の例を次に示します。
- (NSMutableDictionary*) jsonDict
{
NSMutableDictionary *result = [[NSMutableDictionary alloc] init];
result[@"serial_id"] = self.serialID;
result[@"latitude"] = [NSNumber numberWithDouble: self.location.latitude];
result[@"longitude"] = [NSNumber numberWithDouble: self.location.longitude];
result[@"name"] = self.name;
if ([self hasPhoto])
{
result[@"photo-jpeg"] = [UIImageJPEGRepresentation(self.photo, 0.5)
base64EncodedStringWithOptions: NSDataBase64Encoding76CharacterLineLength];
}
return result;
}
文字列キーのディクショナリと値としての単純なオブジェクト(NSNumber、NSString、NSArray(私が思うに)など)を返すだけです。 JSONエンコーダーが残りの処理を行います。