android post json




如何在Android中使用HTTPClient在JSON中發送POST請求? (4)

我想弄清楚如何使用HTTPClient從Android POST JSON。 我一直在試圖弄清楚這一點,我已經在網上找到了很多例子,但是我不能讓它們中的任何一個工作。 我相信這是因為我一般缺乏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();
    }
 }

在這個答案中,我使用了賈斯汀格拉門斯發布的一個例子

關於JSON

JSON代表JavaScript Object Notation。 在JavaScript屬性中可以像這個object1.name一樣被引用,並且像這個object['name']; 。 文章中的例子使用了這一點JSON。

零件
將電子郵件作為關鍵字並將[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;
}

請隨時評論任何有關這篇文章的問題,或者如果我沒有說清楚什麼問題,或者如果我還沒有談到你仍然困惑的事情......等等。

(如果賈斯汀·格拉門斯不贊成,我會取消,但如果沒有,那麼感謝賈斯汀對此感到冷淡。)

更新

我只是想知道如何使用代碼,並意識到返回類型存在錯誤。 方法簽名被設置為返回一個字符串,但在這種情況下,它並沒有返回任何東西。 我將簽名更改為HttpResponse,並將引用您的鏈接獲取HttpResponse響應正文路徑變量是URL,我更新以修復代碼中的錯誤。


我建議使用此HttpURLConnection而不是HttpGet 。 由於HttpGet已在Android API級別22中棄用。

HttpURLConnection httpcon;  
String url = null;
String data = null;
String result = null;
try {
  //Connect
  httpcon = (HttpURLConnection) ((new URL (url).openConnection()));
  httpcon.setDoOutput(true);
  httpcon.setRequestProperty("Content-Type", "application/json");
  httpcon.setRequestProperty("Accept", "application/json");
  httpcon.setRequestMethod("POST");
  httpcon.connect();

  //Write       
  OutputStream os = httpcon.getOutputStream();
  BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
  writer.write(data);
  writer.close();
  os.close();

  //Read        
  BufferedReader br = new BufferedReader(new InputStreamReader(httpcon.getInputStream(),"UTF-8"));

  String line = null; 
  StringBuilder sb = new StringBuilder();         

  while ((line = br.readLine()) != null) {  
    sb.append(line); 
  }         

  br.close();  
  result = sb.toString();

} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} 

此任務的代碼太多,請檢查此庫https://github.com/kodart/Httpzoid在內部使用GSON並提供可用於對象的API。 所有JSON細節都是隱藏的。

Http http = HttpFactory.create(context);
http.get("http://example.com/users")
    .handler(new ResponseHandler<User[]>() {
        @Override
        public void success(User[] users, HttpResponse response) {
        }
    }).execute();

這是@ Terrance的答案的另一種解決方案。 您可以輕鬆地將轉換外包。 Gson庫做了很好的工作,將各種數據結構轉換為JSON,而另一種方式。

public static void execute() {
    Map<String, String> comment = new HashMap<String, String>();
    comment.put("subject", "Using the GSON library");
    comment.put("message", "Using libraries is convenient.");
    String json = new GsonBuilder().create().toJson(comment, Map.class);
    makeRequest("http://192.168.0.1:3000/post/77/comments", json);
}

public static HttpResponse makeRequest(String uri, String json) {
    try {
        HttpPost httpPost = new HttpPost(uri);
        httpPost.setEntity(new StringEntity(json));
        httpPost.setHeader("Accept", "application/json");
        httpPost.setHeader("Content-type", "application/json");
        return new DefaultHttpClient().execute(httpPost);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

類似的可以通過使用Jackson而不是Gson來完成。 我還建議看看Retrofit ,它為你隱藏了很多這樣的樣板代碼。 對於更有經驗的開發人員,我建議嘗試使用RxAndroid





httprequest