質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • iOS

    3800questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • API

    1427questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • Objective-C

    1165questions

    Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

あるAPIを試していますが、認証でエラーが出てしまいます。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 279

takeshi1907

score 14

どうしても解決しないので、ご質問させていただきます。

http://techbureau-api-document.readthedocs.io/ja/latest/trade/1_common.html#id2

こちらのAPIを試しているのですが、どうしてもい以下の(signature mismatch)のエラーが帰ってきてしまいます。原因がわからないのですが、何がおかしいのでしょうか?

{
error = signature mismatch";
success = 0;
}

----以下、実際のコードです。-------------------------------

  • (void)httpRequest {
    NSError *error;
    double unixtime = [[NSDate date] timeIntervalSince1970];

NSDictionary *parameters = @{@"nonce":[NSString stringWithFormat:@"%f",unixtime], @"method":@"get_info"};
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:&error];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

NSString *url = @"https://api.zaif.jp/tapi";
NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:url parameters:nil error:nil];
[req setValue:@"xxxxxxxxxxxxxxxxxxx" forHTTPHeaderField:@"key"];
[req setValue:[self sha512:jsonString withSalt:@"xxxxxxxxxxxxxxxxxx"] forHTTPHeaderField:@"sign"];

//    [req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
//    [req setValue:@"application/json" forHTTPHeaderField:@"Accept"];
//    [req setHTTPBody:[[self sha512:jsonString] dataUsingEncoding:NSUTF8StringEncoding]];
[[manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
if (!error) {
NSLog(@"Reply JSON: %@", responseObject);
if ([responseObject isKindOfClass:[NSDictionary class]]) {
//blah blah
}
} else {

NSLog(@"Error: %@, %@, %@", error, response, responseObject);
}
}] resume];
}

宜しくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

ドキュメントを読むと、

signはPOSTする全てのパラメータ(nonceとmethodおよびメソッド毎のパラメータ)を URLエンコードしたクエリ形式(param1=val1&param2=val2)のメッセージとして、Secret Keyを用いてHMAC-SHA512で署名します。

と記載があります。
提示されたコードではJSONエンコードしているのが原因の一つだと思います。

URLエンコードしたメッセージは、例えば、 NSURLComponents を利用して components.query で取得できます。

NSURLComponents *components = [NSURLComponents componentsWithString:@"https://api.zaif.jp/tapi"];
NSURLQueryItem *nonce = [NSURLQueryItem queryItemWithName:@"nonce" value:@"23123"];
NSURLQueryItem *method = [NSURLQueryItem queryItemWithName:@"method" value:@"get_info"];
components.queryItems = @[ nonce, method ];

また、以下のように記載があるので、上記作成したメッセージをリクエスト Body につける必要があります。

その他のメソッド毎の固有のパラメータも全てPOSTパラメータにて送信してください。

ただ、 Body のフォーマットがこのドキュメントからは読み取れないです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/29 00:41

    ご回答ありがとうございます。
    早速NSURLComponents を利用して以下のように書き換えて見ましたが、やはり結果は同じようでした。
    他に何か原因があるのでしょうか。

    - (void)httpRequest
    {
    NSError *error;
    double unixtime = [[NSDate date] timeIntervalSince1970];

    NSURLComponents *components = [NSURLComponents componentsWithString:@"https://api.zaif.jp/tapi"];
    NSURLQueryItem *nonce = [NSURLQueryItem queryItemWithName:@"nonce" value:[NSString stringWithFormat:@"%f",unixtime]];
    NSURLQueryItem *method = [NSURLQueryItem queryItemWithName:@"method" value:@"get_info"];
    components.queryItems = @[nonce,method];

    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

    NSString *url = @"https://api.zaif.jp/tapi";
    NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:url parameters:nil error:nil];
    [req setValue:@"xxxxxxxxxx" forHTTPHeaderField:@"key"];
    [req setValue:[self sha512:components.query withSalt:@"xxxxxxxxxx"] forHTTPHeaderField:@"sign"];

    [[manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
    if (!error) {
    NSLog(@"Reply JSON: %@", responseObject);
    if ([responseObject isKindOfClass:[NSDictionary class]]) {
    //blah blah
    }
    } else {

    NSLog(@"Error: %@, %@, %@", error, response, responseObject);
    }
    }] resume];
    }

    宜しくお願いします。

    キャンセル

  • 2017/10/29 00:49

    POST リクエスト Body に何も渡していないのが原因だと思います。

    キャンセル

0

>POST リクエスト Body に何も渡していないのが原因だと思います。

ご回答ありがとうございます。
components.queryをbodyにも渡すようにしたら無事に解決しました。
大変助かりました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/29 13:04

    Good!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    時間毎に関連したURLを引っ張ってきて、順番を時系列でタイムラインで表示したい。

    Objetive-cを使ってあるスマートフォンアプリを作っています。 現在作成中のアプリに以下の機能を作ろうとしています。 一定の時間毎に特定のサイトのURLを引っ張ってきて順番

  • 解決済

    [Swift]JSONの取得方法

    MysqlのデータをPHPでJSONで出力し、Swiftで取得することまではできたのですが、そこから各データを解析することができません。 var url = NSURL(stri

  • 解決済

    Fabricを利用したTwitterAPI

    現在、大学でTwitterを利用したiOS向けアプリケーションを作成しています。 その過程で、以下の画像のような状況に陥っています。 Githubなど様々なサイトで対処法を探したの

  • 受付中

    JSONの取得データ(タイトルなど)を配列変数に入れる方法

    JSONで指定したデータを取得しました。 TableViewに格納して、表示したいと思います。 例として、RSSリーダーアプリのようなイメージです。 しかし、指定データをAr

  • 解決済

    iPhoneからのJSPへのPOST送信方法についてご質問

    JSPで、POSTされた内容を受け取ろうとしていますが、別に開発したソフトからは、POSTでうまく呼べず、 下記で、post_i =null となります。 そこで、後記のPOST

  • 解決済

    objective-cでウェブ上のテキストを取得したい

    先ほど似た質問したのですが、新たに問題が発生し、調べまくってもう1歩のところまでいくんですがエラーでうまくいきません。 そこで、アドバイスをいただきたいと思って再度質問させていた

  • 解決済

    [swift]画像アップロードについて

    こんばんは。 現在簡単な画像アップロードアプリを作成しようと考えております。 先に画像アップロード部分のみを実装したいと考えており、参考サイトより作業しているのですが、use 

  • 解決済

    swift3.0でAPIを使いたい

    xcode8でswift3.0を勉強している初心者です。 swift3.0のバージョンアップに伴い、既存のテキストやサンプルコードが一部変更され、 もともとのコードもわからない

同じタグがついた質問を見る

  • iOS

    3800questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • API

    1427questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • Objective-C

    1165questions

    Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。