1. ホーム
  2. android

[解決済み] AndroidでHTTPClientを使用してJSONでPOSTリクエストを送信するには?

2022-09-27 01:39:25

質問

HTTPClientを使用してAndroidからJSONをPOSTする方法を見つけようとしています。しばらくこれを理解しようとしていて、オンラインで多くの例を見つけましたが、どれも動作させることができません。 これは、私が一般的にJSONやネットワークの知識が不足しているためだと思います。 たくさんの例があることは知っていますが、どなたか実際のチュートリアルを紹介していただけませんか?私は、コードと、各ステップを実行する理由、またはそのステップが行うことの説明を含む、ステップバイステップのプロセスを探しています。それは複雑である必要はなく、シンプルであれば十分です。

もう一度言いますが、そこに大量の例があることを知っています。私はただ、正確に何が起こっていて、なぜそのようにやっているのかの説明のある例を本当に探しています。

もし誰かがこれに関する良い Android の本について知っていたら、教えてください。

また、ヘルプ@terranceありがとうございます。以下、私が説明したコードです。

public void shNameVerParams() throws Exception{
     String path = //removed
     HashMap  params = new HashMap();

     params.put(new String("Name"), "Value"); 
     params.put(new String("Name"), "Value");

     try {
        HttpClient.SendHttpPost(path, params);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 }

どのように解決するのですか?

この回答では、私は の例では、Justin Grammensによって投稿された .

JSONについて

JSONとは、JavaScript Object Notationの略です。JavaScriptでは、プロパティは次のように両方参照することができます。 object1.name といった具合に参照できます。 object['name']; . 記事の例では、このようなJSONのビットを使用しています。

部品

emailをキー、[email protected] を値とするファンオブジェクト。

{
  fan:
    {
      email : '[email protected]'
    }
}

つまり、オブジェクトに相当するものは次のようになります。 fan.email; または fan['email']; . どちらも同じ値を持つ の '[email protected]' .

HttpClientのリクエストについて

以下は、筆者が使っていた HttpClient リクエスト . 私はこのすべての専門家であると主張しないので、誰かが用語のいくつかを表現するためのより良い方法を持っている場合は、自由に感じなさい。

public static HttpResponse makeRequest(String path, Map params) throws Exception 
{
    //instantiates httpclient to make request
    DefaultHttpClient httpclient = new DefaultHttpClient();

    //url with the post data
    HttpPost httpost = new HttpPost(path);

    //convert parameters into JSON object
    JSONObject holder = getJsonObjectFromMap(params);

    //passes the results to a string builder/entity
    StringEntity se = new StringEntity(holder.toString());

    //sets the post request as the resulting string
    httpost.setEntity(se);
    //sets a request header so the page receving the request
    //will know what to do with it
    httpost.setHeader("Accept", "application/json");
    httpost.setHeader("Content-type", "application/json");

    //Handles what is returned from the page 
    ResponseHandler responseHandler = new BasicResponseHandler();
    return httpclient.execute(httpost, responseHandler);
}

地図

をよく知らない人は Map のデータ構造に馴染みがない場合は Java Map リファレンス . 簡単に言うと、マップは辞書やハッシュと同じようなものです。

private static JSONObject getJsonObjectFromMap(Map params) throws JSONException {

    //all the passed parameters from the post request
    //iterator used to loop through all the parameters
    //passed in the post request
    Iterator iter = params.entrySet().iterator();

    //Stores JSON
    JSONObject holder = new JSONObject();

    //using the earlier example your first entry would get email
    //and the inner while would get the value which would be '[email protected]' 
    //{ fan: { email : '[email protected]' } }

    //While there is another entry
    while (iter.hasNext()) 
    {
        //gets an entry in the params
        Map.Entry pairs = (Map.Entry)iter.next();

        //creates a key for Map
        String key = (String)pairs.getKey();

        //Create a new map
        Map m = (Map)pairs.getValue();   

        //object for storing Json
        JSONObject data = new JSONObject();

        //gets the value
        Iterator iter2 = m.entrySet().iterator();
        while (iter2.hasNext()) 
        {
            Map.Entry pairs2 = (Map.Entry)iter2.next();
            data.put((String)pairs2.getKey(), (String)pairs2.getValue());
        }

        //puts email and '[email protected]'  together in map
        holder.put(key, data);
    }
    return holder;
}

この投稿について生じた疑問、私が何かを明確にしていない場合、またはあなたがまだ混乱している何かに私が触れていない場合など、本当に頭に浮かんだことなら何でもコメントしてください。

(Justin Grammens が承認しない場合、私は削除します。しかし、そうでない場合は、それについて冷静であることのためにJustinに感謝します)。

更新情報

たまたまコードの使い方についてコメントをもらって、戻り値の型に間違いがあることに気づきました。 メソッドのシグネチャは文字列を返すように設定されていましたが、この場合、何も返しませんでした。私はシグネチャを をHttpResponseに変更し、このリンクを参照することにしました。 HttpResponseのレスポンスボディを取得する は、path変数がurlで、コードの間違いを修正するために更新しました。