Comment append des parameters à une requête HTTP GET dans Android?

J’ai une requête HTTP GET que je tente d’envoyer. J’ai essayé d’append les parameters à cette requête en créant d’abord un object BasicHttpParams et en ajoutant les parameters à cet object, puis en appelant setParams( basicHttpParms ) sur mon object HttpGet . Cette méthode échoue. Mais si j’ajoute manuellement mes parameters à mon URL (c.-à-d. Append ?param1=value1&param2=value2 ), cela réussit.

Je sais que je manque quelque chose ici et toute aide serait grandement appréciée.

J’utilise une liste de NameValuePair et URLEncodedUtils pour créer la chaîne d’URL que je veux.

 protected Ssortingng addLocationToUrl(Ssortingng url){ if(!url.endsWith("?")) url += "?"; List params = new LinkedList(); if (lat != 0.0 && lon != 0.0){ params.add(new BasicNameValuePair("lat", Ssortingng.valueOf(lat))); params.add(new BasicNameValuePair("lon", Ssortingng.valueOf(lon))); } if (address != null && address.getPostalCode() != null) params.add(new BasicNameValuePair("postalCode", address.getPostalCode())); if (address != null && address.getCountryCode() != null) params.add(new BasicNameValuePair("country",address.getCountryCode())); params.add(new BasicNameValuePair("user", agent.uniqueId)); Ssortingng paramSsortingng = URLEncodedUtils.format(params, "utf-8"); url += paramSsortingng; return url; } 

Pour construire uri avec les parameters get, Uri.Builder fournit un moyen plus efficace.

 Uri uri = new Uri.Builder() .scheme("http") .authority("foo.com") .path("someservlet") .appendQueryParameter("param1", foo) .appendQueryParameter("param2", bar) .build(); 

A partir de HttpComponents 4.2+ il existe une nouvelle classe URIBuilder , qui fournit un moyen pratique de générer des URI.

Vous pouvez utiliser soit créer URI directement à partir de Ssortingng URL:

 List listOfParameters = ...; URI uri = new URIBuilder("http://example.com:8080/path/to/resource?mandatoryParam=someValue") .addParameter("firstParam", firstVal) .addParameter("secondParam", secondVal) .addParameters(listOfParameters) .build(); 

Sinon, vous pouvez spécifier tous les parameters explicitement:

 URI uri = new URIBuilder() .setScheme("http") .setHost("example.com") .setPort(8080) .setPath("/path/to/resource") .addParameter("mandatoryParam", "someValue") .addParameter("firstParam", firstVal) .addParameter("secondParam", secondVal) .addParameters(listOfParameters) .build(); 

Une fois que vous avez créé un object URI , il vous suffit simplement de créer HttpGet object HttpGet et de l’exécuter:

 //create GET request HttpGet httpGet = new HttpGet(uri); //perform request httpClient.execute(httpGet ...//additional parameters, handle response etc. 

La méthode

 setParams() 

comme

 httpget.getParams().setParameter("http.socket.timeout", new Integer(5000)); 

ajoute uniquement les parameters HttpProtocol.

Pour exécuter le httpGet, vous devez append vos parameters à l’URL manuellement

 HttpGet myGet = new HttpGet("http://foo.com/someservlet?param1=foo&param2=bar"); 

ou utilisez la demande de poste la différence entre les demandes get et post sont expliquées ici , si vous êtes intéressé

 List params = new ArrayList(); params.add(new BasicNameValuePair("param1","value1"); Ssortingng query = URLEncodedUtils.format(params, "utf-8"); URI url = URIUtils.createURI(scheme, userInfo, authority, port, path, query, fragment); //can be null HttpGet httpGet = new HttpGet(url); 

URI javadoc

Note: url = new URI(...) est bogué

  HttpClient client = new DefaultHttpClient(); Uri.Builder builder = Uri.parse(url).buildUpon(); for (Ssortingng name : params.keySet()) { builder.appendQueryParameter(name, params.get(name).toSsortingng()); } url = builder.build().toSsortingng(); HttpGet request = new HttpGet(url); HttpResponse response = client.execute(request); return EntityUtils.toSsortingng(response.getEntity(), "UTF-8"); 
  class Searchsync extends AsyncTask { @Override protected Ssortingng doInBackground(Ssortingng... params) { HttpClient httpClient = new DefaultHttpClient();/*write your url in Urls.SENDMOVIE_REQUEST_URL; */ url = Urls.SENDMOVIE_REQUEST_URL; url = url + "/id:" + m; HttpGet httpGet = new HttpGet(url); try { // httpGet.setEntity(new UrlEncodedFormEntity(nameValuePairs)); // httpGet.setEntity(new SsortingngEntity(json.toSsortingng())); HttpResponse response = httpClient.execute(httpGet); HttpEntity resEntity = response.getEntity(); if (resEntity != null) { Ssortingng responseStr = EntityUtils.toSsortingng(resEntity).sortingm(); Log.d("Response from PHP server", "Response: " + responseStr); Intent i = new Intent(getApplicationContext(), MovieFoundActivity.class); i.putExtra("ifoundmovie", responseStr); startActivity(i); } } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }//enter code here } 

Si vous avez une URL constante, je vous recommande d’utiliser une requête http simplifiée basée sur Apache http.

Vous pouvez créer votre client comme suit:

 private filan static HttpRequest httpRequest = HttpRequestBuilder.createGet(yourUri,YourResponseType) .build(); public void send(){ ResponseHendler rh = httpRequest.execute(param1, value1, param2, value2); handler.ifSuccess(this::whenSuccess).otherwise(this::whenNotSuccess); } public void whenSuccess(ResponseHendler rh){ rh.ifHasContent(content -> // your code); } public void whenSuccess(ResponseHendler rh){ LOGGER.error("Status code: " + rh.getStatusCode() + ", Error msg: " + rh.getErrorText()); } 

Remarque: Il existe de nombreuses méthodes utiles pour manipuler votre réponse.