Jak wysłać żądanie POST w JSON za pomocą HTTPClient w Androidzie?
Próbuję dowiedzieć się, jak opublikować JSON z Androida za pomocą HTTPClient. Od jakiegoś czasu staram się to rozgryźć, w sieci znalazłem mnóstwo przykładów, ale żaden z nich nie działa. Uważam, że jest to spowodowane moim brakiem wiedzy JSON / networking w ogóle. Wiem, że jest wiele przykładów, ale czy ktoś mógłby wskazać mi rzeczywisty tutorial? Szukam procesu krok po kroku z kodem i wyjaśnieniem, dlaczego robisz każdy krok, lub co ten krok tak. To nie musi być skomplikowane, proste wystarczy.
Ponownie, wiem, że jest mnóstwo przykładów, po prostu naprawdę Szukam przykładu z wyjaśnieniem, co dokładnie się dzieje i dlaczego to robi w ten sposób.
Jeśli ktoś wie o dobrej książce o Androidzie na ten temat, to proszę dać mi znać.
Jeszcze raz dziękuję za pomoc @ terrance, oto kod, który opisałem poniżej
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();
}
}
5 answers
W tej odpowiedzi korzystam z przykładu zamieszczonego przez Justina Grammensa .
O JSON
JSON oznacza JavaScript Object Notation. We właściwościach JavaScript można odwoływać się zarówno w ten sposób object1.name
, jak i w ten sposób object['name'];
. Przykład z artykułu wykorzystuje ten bit JSON.
Części
Obiekt kibica z e-mailem jako kluczem i [email protected] jako wartość
{
fan:
{
email : '[email protected]'
}
}
Więc odpowiednikiem obiektu będzie fan.email;
lub fan['email'];
. Obaj mieliby ta sama wartość
z dnia '[email protected]'
.
O Żądaniu HttpClient
Poniżej znajduje się to, czego nasz autor użył do wysłania HttpClient Request. Nie twierdzę, że jestem w tym wszystkim ekspertem, więc jeśli ktoś ma lepszy sposób na określenie niektórych terminów, nie krępuj się.
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);
}
Mapa
Jeśli nie znasz struktury danych Map
, zapoznaj się z mapą Javy. Krótko mówiąc, mapa jest podobna do słownika lub hash.
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;
}
Zapraszam do komentowania wszelkich pytań, które pojawiają się na temat tego postu lub jeśli nie wyraziłem się jasno lub jeśli nie dotknąłem czegoś, co nadal jest zdezorientowane... etc cokolwiek wyskakuje w twojej głowie naprawdę.
(zdejmę, jeśli Justin Grammens nie aprobuje. Ale jak nie to dzięki Justinowi za to, że jest spoko.)
Update
Właśnie dostałem komentarz o tym jak korzystać z kodu i zdałem sobie sprawę, że był błąd w typie zwrotu. Podpis metody został ustawiony na zwracanie ciągu znaków, ale w tym przypadku nie zwracano niczego. Zmieniłem podpis do HttpResponse i odsyła do tego linku na uzyskanie ciała odpowiedzi HttpResponse zmienna path to adres url i zaktualizowałem, aby naprawić błąd w kodzie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-10 12:25:43
Oto alternatywne rozwiązanie odpowiedzi @Terrance. Możesz łatwo zlecić konwersję na zewnątrz. Biblioteka Gson wykonuje wspaniałą pracę konwertując różne struktury danych do JSON i odwrotnie.
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;
}
Podobne mogą być wykonane za pomocą Jackson zamiast Gson. Polecam również spojrzeć na Retrofit , który ukrywa wiele tego kodu kotła dla Ciebie. Dla bardziej doświadczonych programistów polecam wypróbowanie RxAndroid .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-21 08:50:59
Polecam korzystanie z tego HttpURLConnection
zamiast HttpGet
. Jako HttpGet
jest już przestarzały w Android API poziom 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();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-13 07:33:37
Za dużo kodu do tego zadania, sprawdź tę bibliotekę https://github.com/kodart/Httpzoid Is używa GSON wewnętrznie i zapewnia API, które działa z obiektami. Wszystkie szczegóły JSON są ukryte.
Http http = HttpFactory.create(context);
http.get("http://example.com/users")
.handler(new ResponseHandler<User[]>() {
@Override
public void success(User[] users, HttpResponse response) {
}
}).execute();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-14 12:56:36
Istnieje kilka sposobów na ustanowienie połączenia HHTP i pobieranie danych z usługi internetowej RESTFULL. Najnowszym jest GSON. Ale zanim przejdziesz do GSON musisz mieć pojęcie o najbardziej tradycyjnym sposobie tworzenia klienta HTTP i wykonywania komunikacji danych ze zdalnym serwerem. Wspomniałem o obu metodach wysyłania żądań POST & GET przy użyciu HTTPClient.
/**
* This method is used to process GET requests to the server.
*
* @param url
* @return String
* @throws IOException
*/
public static String connect(String url) throws IOException {
HttpGet httpget = new HttpGet(url);
HttpResponse response;
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
// The default value is zero, that means the timeout is not used.
int timeoutConnection = 60*1000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 60*1000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
HttpClient httpclient = new DefaultHttpClient(httpParameters);
try {
response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
result = convertStreamToString(instream);
//instream.close();
}
}
catch (ClientProtocolException e) {
Utilities.showDLog("connect","ClientProtocolException:-"+e);
} catch (IOException e) {
Utilities.showDLog("connect","IOException:-"+e);
}
return result;
}
/**
* This method is used to send POST requests to the server.
*
* @param URL
* @param paramenter
* @return result of server response
*/
static public String postHTPPRequest(String URL, String paramenter) {
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
// The default value is zero, that means the timeout is not used.
int timeoutConnection = 60*1000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 60*1000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
HttpClient httpclient = new DefaultHttpClient(httpParameters);
HttpPost httppost = new HttpPost(URL);
httppost.setHeader("Content-Type", "application/json");
try {
if (paramenter != null) {
StringEntity tmp = null;
tmp = new StringEntity(paramenter, "UTF-8");
httppost.setEntity(tmp);
}
HttpResponse httpResponse = null;
httpResponse = httpclient.execute(httppost);
HttpEntity entity = httpResponse.getEntity();
if (entity != null) {
InputStream input = null;
input = entity.getContent();
String res = convertStreamToString(input);
return res;
}
}
catch (Exception e) {
System.out.print(e.toString());
}
return null;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-21 09:07:13