Comment ajouter des paramètres à une requête HTTP GET sous Android?

119

J'ai une requête HTTP GET que j'essaye d'envoyer. J'ai essayé d'ajouter les paramètres à cette demande en créant d'abord un BasicHttpParamsobjet et en ajoutant les paramètres à cet objet, puis en appelant setParams( basicHttpParms )mon HttpGetobjet. Cette méthode échoue. Mais si j'ajoute manuellement mes paramètres à mon URL (c'est-à-dire ajouter ?param1=value1&param2=value2), cela réussit.

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

groomsy
la source
1
Pour une requête GET, la deuxième méthode est la manière correcte d'ajouter des paramètres. Je pense que la première approche concerne les méthodes POST.
James Black

Réponses:

225

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

protected String addLocationToUrl(String url){
    if(!url.endsWith("?"))
        url += "?";

    List<NameValuePair> params = new LinkedList<NameValuePair>();

    if (lat != 0.0 && lon != 0.0){
        params.add(new BasicNameValuePair("lat", String.valueOf(lat)));
        params.add(new BasicNameValuePair("lon", String.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));

    String paramString = URLEncodedUtils.format(params, "utf-8");

    url += paramString;
    return url;
}
Brian Griffey
la source
Je suis d'accord. J'y suis retourné et j'ai changé cela car cette méthode est logique pour de plus grandes quantités de paramètres. La première réponse acceptée fonctionne toujours bien, mais peut être déroutante pour de grands ensembles de paramètres.
groomsy
@Brian Griffey Merci pour une bonne solution. mais j'ai peu de format différent pour passer le paramètre, quelqu'un peut-il m'aider à passer ce paramètre ..? Comment passer le paramètre dans ce cas? data = '{"credential": {"accesToken": "668f514678c7e7f5e71a07044935d94c", "ACK": "cf3bb509623a8e8fc032a08098d9f7b3"}, "restIn": {"userId"; ": 5613}
Yog Guru
1
L'autre réponse est beaucoup plus courte et plus simple pour les cas simples. Ce n'est pas faux et mérite d'être considéré.
qris
2
La liste <NameValuePair> est obsolète dans l'API Android niveau 22
Vihaan Verma
@SimonMeier: utilisez Uri.Builder (). Voir la réponse ci-dessous.
Vihaan Verma
95

Pour créer un uri avec des paramètres 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();
9re
la source
Je
@ bizso09 "paramètres de fichier" voulez-vous dire requête et fragment? Ils sont tous deux réglables par le constructeur. Jetez un œil à ceci pour la terminologie URI, cela m'a beaucoup aidé developer.android.com/reference/java/net/URI.html
dvd
comment supprimer le paramètre de requête? comment changer la valeur du paramètre de requête existant?
Piotr
il existe une méthode claire developer.android.com/reference/android/net/… . pour modifier, supposez que vous avez une liste de requêtes, mettez à jour la valeur dans la liste, clearQuery () puis appelez appendQueryParameter dans la boucle de la liste. mais pourquoi ne pas créer le nouveau à chaque fois à la demande?
9re
31

À 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 un URI directement à partir de l'URL de chaîne:

List<NameValuePair> 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 paramètres 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 URIobjet, il vous suffit simplement de créer un HttpGetobjet et de l'exécuter:

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

La méthode

setParams() 

comme

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

ajoute uniquement les paramètres HttpProtocol.

Pour exécuter httpGet, vous devez ajouter manuellement vos paramètres à l'URL

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

ou utilisez la demande de publication, la différence entre les demandes d'obtention et de publication est expliquée ici , si vous êtes intéressé

n3utrino
la source
1
Merci de votre aide. J'ai pensé qu'il pourrait y avoir un moyen plus efficace d'ajouter des paramètres aux requêtes GET.
groomsy
8
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("param1","value1");

String 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

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

siamii
la source
4
    HttpClient client = new DefaultHttpClient();

    Uri.Builder builder = Uri.parse(url).buildUpon();

    for (String name : params.keySet()) {
        builder.appendQueryParameter(name, params.get(name).toString());
    }

    url = builder.build().toString();
    HttpGet request = new HttpGet(url);
    HttpResponse response = client.execute(request);
    return EntityUtils.toString(response.getEntity(), "UTF-8");
Yorty Ruiz
la source
0

Si vous avez une constante, URLje recommande d'utiliser une requête http simplifiée sur apache http.

Vous pouvez créer votre client comme suit:

private filan static HttpRequest<YourResponseType> httpRequest = 
                   HttpRequestBuilder.createGet(yourUri,YourResponseType)
                   .build();

public void send(){
    ResponseHendler<YourResponseType> rh = 
         httpRequest.execute(param1, value1, param2, value2);

    handler.ifSuccess(this::whenSuccess).otherwise(this::whenNotSuccess);
}

public void whenSuccess(ResponseHendler<YourResponseType> rh){
     rh.ifHasContent(content -> // your code);
}

public void whenSuccess(ResponseHendler<YourResponseType> rh){
   LOGGER.error("Status code: " + rh.getStatusCode() + ", Error msg: " + rh.getErrorText());
}

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

Beno Arakelyan
la source