URLにクエリを追加する方法(QT)
oauth認証について書いていた時のメモ。
QTで参考にしているサイトを見てると、自力でqueryを作ってるところが多い。
メソッドに頼らなければそんな感じでいいのかなぁと思いつつ、
真似して書いているとプログラマの先輩から
「それ、QUrlQuery使えばいい!!」「コードは綺麗じゃないと!!」
とお叱りを受けました・・・。
だがしかし!
そんな便利なメソッドに頼る甘い世界んじゃないんだよ!!!!と心のなかで叫んで断固拒否。
そもそもwebアプリケーションのことを何もわかってないので安直に使うのもどうかと思い、
押し切って、Map書いてiterator回して見て思った!
『うん、QUrlQueryが楽・・・。』
コードはこんなかんじです。
【Iteratorを使ったパターン】
QMap<QString, QString> Params; Params["oauth_consumer_key"] = consumer_key; Params["oauth_consumer_secret"] = consumer_secret; Params["oauth_signature_method"] = "HMAC-SHA1"; Params["oauth_timestamp"] = QString::number(QDateTime::currentMSecsSinceEpoch()); Params["oauth_nonce"] = QString::number(qrand()); Params["oauth_vertion"] = "1.1"; QString param_str; QMapIterator<QString,QString> i(Params); while (i.hasNext()) { i.next(); param_str +=QString("%1=%2&")(arg(i.key()).arg(i.value()); } param_str.resize(param_str.size() -1 )
【QUrlQueryを使ったパターン】
QUrlQuery token_query; QUrl url(hoge_url); token_query.addQueryItem("oauth_consumer_key",consumer_key); token_query.addQueryItem("consumer_secret",consumer_secret); token_query.addQueryItem("oauth_signature_method","HMAC-SHA1"); token_query.addQueryItem("oauth_timestamp",QString::number(QDateTime::currentMSecsSinceEpoch())); token_query.addQueryItem("oauth_nonce",QString::number(qrand()); token_query.addQueryItem("oauth_vertion","1.1"); url.setQuery(token_query);
見たまんまですが、QMapのparam_strとQUrlqueryのtoken_queryがクエリです。
QUrlquery::addQueryItemを使うと、key=value&key=value形式で表示してくれて、
末尾に繋ぎの&はちゃんと消えるようになってる。
どちらの書き方も間違ってることもないから、好みの問題でどっちが見やすいかですね。
個人的に書きやすさはメソッド使うほうがやりやすい。
でも、iterator書く方が『こいつ、、、出来るな・・・!!』って思われるかなと勝手に妄想したり・・・。
とどのつまり、プラットフォームに合わせた書き方ができる応用力が重要ですね。
ここまで書いておきながらなんですが、
どうしてもvectorみたいな物を使いたければ、QListでパラメータを作りQUrlQuery::setQueryItems(QList)で設定できる。
圧倒的に知識量として足りないので、メソッドを知らない場合はガリガリ書くしか無いのですが、
みんなはきっと知ってるよね・・・!