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¶m2=value2
), cela réussira.
Je sais que quelque chose me manque 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 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;
}
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();
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.
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¶m2=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é
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);
Remarque: url = new URI(...)
is buggy
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");
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.