web-dev-qa-db-fra.com

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

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

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

118
groomsy

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;
}
224
Brian Griffey

Pour construire 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();
94
9re

A partir de HttpComponents4.2+, il existe une nouvelle classe URIBuilder , qui offre un moyen pratique de générer des URI.

Vous pouvez utiliser soit créer l'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 explicitement tous les paramètres:

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éé l'objet URI, il vous suffit simplement de créer un objet HttpGet et de l'exécuter:

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

La méthode

setParams() 

comme

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

ajoute uniquement les paramètres HttpProtocol.

Pour exécuter le 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 requête post la différence entre les requêtes get et post est expliquée ici , si vous êtes intéressé

27
n3utrino
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(...) is buggy

8
siamii
    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");
4
Yorty Ruiz

Si vous avez une constante URL, je vous recommande d’utiliser simplifié http-request construit sur Apache http.

Vous pouvez construire 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.

0
Beno Arakelyan