web-dev-qa-db-ja.com

Qt4.6.1でHTTP POSTリクエストを作成するにはどうすればよいですか?

Qt4.6.1を使用してURLエンコードされたパラメータを使用してHTTP POSTリクエストを作成するにはどうすればよいですか?

QNetworkRequestを作成し、そこにすべてのパラメーターを設定して、QNetworkAccessManagerspostメソッドを介して送信できることがわかりました。しかし、URLエンコードされたパラメータをリクエストに追加するにはどうすればよいですか?

最後に、Qt/C++を使用して Eve API にアクセスしたいと思います。 A Python例はここにあります: http://www.eveonline.com/api/doc/example-python.asp


私はそれを次のようなものを使用して管理しました(まだリファクタリングされ、有用なものに形成されています):

QNetworkReply *requestApi(QNetworkAccessManager &nwam)
{

    QNetworkRequest request(QUrl("http://api.eve-online.com/account/Characters.xml.aspx"));
    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");

    QByteArray data;
    QUrl params;

    params.addQueryItem("userid","user");
    params.addQueryItem("apiKey","key");
    data.append(params.toString());
    data.remove(0,1);

    QNetworkReply *reply = nwam.post(request,data);
    return reply;
}
30
Tobias Langner

あなたの解決策はほぼ正しいです。ただし、次のものを使用する必要があります。

data = params.encodedQuery();

の代わりに

data.append(params.toString());
data.remove(0,1);

uTF8文字列を適切に処理するため。

11
stach

あなたの投稿が遅くなってしまったことをお詫び申し上げます。ただし、他の誰かが答えを探している場合に備えて、私はまだ助けようとします。

偶然にも、私はEVE APIアプリケーションに取り組んでおり、同じ方法を試しました。残念ながら、QNetworkManagerはリクエストを非同期に送信するため、そのようには機能しません。スロットをそのfinished(QNetworkReply*)信号に接続する必要があります。

これを行うには、EveConnectorという別のクラスでリクエストを行い、QNetworkManagerfinishedシグナルに接続されたスロットで応答を処理してから、リクエストしているオブジェクトを呼び出します。コネクタクラス自体の信号。

よろしければ、コードを喜んで共有します。

6
Venemo