0

リクエストのHTTPBodyを正しく設定することに問題があります。私はAPIサーバーと通信するためにOauthを使用していますが、唯一の違いは、ヘッダーではなく本文を介してデータを送信する必要があることです(OauthConsumer.frameworkを使用-http : //code.google.com/p/oauthconsumer/ wiki / UsingOAuthConsumer)。

これは私のコードです:

NSString *oauthHeader = [NSString stringWithFormat:@"OAuth realm=\"%@\", oauth_consumer_key=\"%@\", %@oauth_signature_method=\"%@\", oauth_signature=\"%@\", oauth_timestamp=\"%@\", oauth_nonce=\"%@\", oauth_version=\"1.0\"%@",
                         [realm URLEncodedString],
                         [consumer.key URLEncodedString],
                         oauthToken,
                         [[signatureProvider name] URLEncodedString],
                         [signature URLEncodedString],
                         timestamp,
                         nonce,
                         extraParameters];

//[self setValue:oauthHeader forHTTPHeaderField:@"Authorization"];
NSLog(@"%@", oauthHeader);
[self setHTTPBody:[oauthHeader dataUsingEncoding:NSASCIIStringEncoding]];

これはNSlogの出力です。

OAuth realm = ""、oauth_consumer_key = "key"、oauth_signature_method = "HMAC-SHA1"、oauth_signature = "HT2UwJoW4dSNh1gXkAzQThLp0Sk%3D"、oauth_timestamp = "1340789377"、oauth_nonce = "3BDF0A1A-4FB 「1.0」

そして、これはサーバーが読み取るものです、なぜ配列が間違っているのですか?これはサーバー側のバグではありません。C#クライアントは問題なく実行します。

array(1){
  ["OAuth_realm"] =>
  string(215) "" "、oauth_consumer_key =" key "、oauth_signature_method =" HMAC-SHA1"、oauth_signature =" HT2UwJoW4dSNh1gXkAzQThLp0Sk = "、oauth_timestamp =" 1340789377 "、oauth_nonce =" 3BDF0A1A-4FB0-40EF = "1.0" "
}
4

3 に答える 3

1

問題は、異なるKey-Valueペアを互いに分離していないことのようです。これは、それらを「&」(引用符なし)で連結することによって簡単に実行されます。キーと値の関連付けの間にコンマを設定します。
さらに、これらの引用符をレシーバー側の値の一部にする場合を除いて、値を引用符で囲む必要はありません。

結果のデータ文字列は次のようになります。

NSString *oauthHeader = [NSString stringWithFormat:@"OAuth_realm=%@&oauth_consumer_key=%@&%@oauth_signature_method=%@&oauth_signature=%@&oauth_timestamp=%@&oauth_nonce=%@&oauth_version=1.0%@",
                     [realm URLEncodedString],
                     [consumer.key URLEncodedString],
                     oauthToken,
                     [[signatureProvider name] URLEncodedString],
                     [signature URLEncodedString],
                     timestamp,
                     nonce,
                     extraParameters];

エクストラパラメータも「&」で区切る必要があることに注意してください。

于 2012-06-27T11:39:41.997 に答える
0

oauth_signatureが適切にエンコードされていないようです(パーセント記号はまだあります)。[signature URLEncodedString]これを試す代わりに:

[signature stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]

それが違いを生むかどうかを確認します。

于 2012-06-27T10:28:08.773 に答える
0

わかりました。APIがキーを互いに分離するために「、」ではなく「&」を使用していることに気付かないほど愚かでした。問題が解決しました。

于 2012-06-27T11:52:37.833 に答える