Como adicionar parâmetros a uma solicitação HTTP GET no Android?

119

Eu tenho uma solicitação HTTP GET que estou tentando enviar. Tentei adicionar os parâmetros a essa solicitação, primeiro criando um BasicHttpParamsobjeto e adicionando os parâmetros a esse objeto, depois chamando setParams( basicHttpParms )meu HttpGetobjeto. Este método falha. Mas se eu adicionar manualmente meus parâmetros ao meu URL (ou seja, acrescentar ?param1=value1&param2=value2), ele será bem-sucedido.

Sei que estou perdendo alguma coisa aqui e qualquer ajuda seria muito apreciada.

groomsy
fonte
1
Para uma solicitação GET, o segundo método é a maneira correta de adicionar parâmetros. Espero que a primeira abordagem seja para métodos POST.
James Black

Respostas:

225

Eu uso uma lista de NameValuePair e URLEncodedUtils para criar a seqüência de URL que eu quero.

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
fonte
Concordo. Voltei e mudei isso, pois esse método faz sentido para quantidades maiores de parâmetros. A primeira resposta aceita ainda funciona bem, mas pode ser confusa para grandes conjuntos de parâmetros.
Julio
Brian Griffey Obrigado pela boa solução. mas eu tenho pouco formato diferente para passar parâmetro, alguém pode me ajudar a passar esse parâmetro ..? Como passar parâmetro neste caso? data = '{"credencial": {"accesToken": "668f514678c7e7f5e71a07044935d94c", "ACK": "cf3bb509623a8e8fc032a08098d9f7b3"}, "restIn": {"userId": 4, "listId": 56 "};
Yog Guru
1
A outra resposta é muito mais curta e mais simples para casos simples. Não está errado, e vale a pena considerar.
QRIS
2
List <NameValuePair> está obsoleto no nível api android 22
Vihaan Verma
@ SimonMeier: use Uri.Builder (). Veja a resposta abaixo.
Vihaan Verma
95

Para criar uri com parâmetros get, o Uri.Builder fornece uma maneira mais eficaz.

Uri uri = new Uri.Builder()
    .scheme("http")
    .authority("foo.com")
    .path("someservlet")
    .appendQueryParameter("param1", foo)
    .appendQueryParameter("param2", bar)
    .build();
9re
fonte
Também não é possível manipular parâmetros de arquivo #
siamii
@ bizso09 "parâmetros de arquivo" você quer dizer consulta e fragmento? Ambos são configuráveis ​​pelo construtor. Dê uma olhada nisto na terminologia de URI, isso me ajudou muito developer.android.com/reference/java/net/URI.html
dvd
como remover o parâmetro de consulta? como alterar o valor do parâmetro de consulta existente?
Piotr
existe um método claro developer.android.com/reference/android/net/… . Para modificar, suponha que você tenha uma lista de consultas, atualize o valor na lista, clearQuery () e chame appendQueryParameter no loop da lista. mas por que não criar o novo sempre que necessário?
9RE
31

A partir de HttpComponents, 4.2+ existe uma nova classe URIBuilder , que fornece uma maneira conveniente de gerar URIs.

Você pode usar o URI de criação diretamente do URL da string:

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

Caso contrário, você pode especificar todos os parâmetros explicitamente:

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

Depois de criar o URIobjeto, basta criar HttpGete executar o objeto:

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

O método

setParams() 

gostar

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

adiciona apenas parâmetros HttpProtocol.

Para executar o httpGet, você deve anexar seus parâmetros ao URL manualmente

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

ou use a solicitação de publicação, a diferença entre solicitações de obtenção e publicação é explicada aqui , se você estiver interessado

n3utrino
fonte
1
Obrigado pela ajuda. Eu pensei que poderia haver uma maneira mais eficaz de adicionar parâmetros às solicitações 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

Nota: url = new URI(...)é de buggy

siamii
fonte
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
fonte
0

Se você tiver constante URL, recomendo o uso de solicitação simplificada de http baseada no apache http.

Você pode criar seu cliente da seguinte maneira:

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

Nota: Existem muitos métodos úteis para manipular sua resposta.

Beno Arakelyan
fonte