How to add parameters to a HTTP GET request in Android?

JavaAndroidHttp Get

Java Problem Overview


I have a HTTP GET request that I am attempting to send. I tried adding the parameters to this request by first creating a BasicHttpParams object and adding the parameters to that object, then calling setParams( basicHttpParms ) on my HttpGet object. This method fails. But if I manually add my parameters to my URL (i.e. append ?param1=value1&param2=value2) it succeeds.

I know I'm missing something here and any help would be greatly appreciated.

Java Solutions


Solution 1 - Java

I use a List of NameValuePair and URLEncodedUtils to create the url string I want.

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;
}

Solution 2 - Java

To build uri with get parameters, Uri.Builder provides a more effective way.

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

Solution 3 - Java

As of HttpComponents 4.2+ there is a new class URIBuilder, which provides convenient way for generating URIs.

You can use either create URI directly from String URL:

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();

Otherwise, you can specify all parameters explicitly:

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();

Once you have created URI object, then you just simply need to create HttpGet object and perform it:

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

Solution 4 - Java

The method

setParams() 

like

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

only adds HttpProtocol parameters.

To execute the httpGet you should append your parameters to the url manually

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

or use the post request the difference between get and post requests are explained here, if you are interested

Solution 5 - Java

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

Note: url = new URI(...) is buggy

Solution 6 - Java

    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");

Solution 7 - Java

If you have constant URL I recommend use simplified http-request built on apache http.

You can build your client as following:

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());
}

Note: There are many useful methods to manipulate your response.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiongroomsyView Question on Stackoverflow
Solution 1 - JavaBrian GriffeyView Answer on Stackoverflow
Solution 2 - Java9reView Answer on Stackoverflow
Solution 3 - Javan1ckolasView Answer on Stackoverflow
Solution 4 - Javan3utrinoView Answer on Stackoverflow
Solution 5 - JavasiamiiView Answer on Stackoverflow
Solution 6 - JavaYorty RuizView Answer on Stackoverflow
Solution 7 - JavaBeno ArakelyanView Answer on Stackoverflow