Android'de bir HTTP GET isteğine parametreler nasıl eklenir?


119

Göndermeye çalıştığım bir HTTP GET isteğim var. Parametreleri bu isteğe eklemeyi, önce bir BasicHttpParamsnesne oluşturup bu nesneye parametreleri ekleyerek, ardından setParams( basicHttpParms )benimHttpGet nesne. Bu yöntem başarısız olur. Ancak parametrelerimi URL'ime manuel olarak eklersem (yani eklersem ?param1=value1&param2=value2) başarılı olur.

Burada bir şeyi kaçırdığımı biliyorum ve herhangi bir yardım çok takdir edilecektir.


1
GET isteği için ikinci yöntem, parametre eklemenin doğru yoludur. İlk yaklaşımın POST yöntemleri için olmasını bekliyorum.
James Black

Yanıtlar:


225

İstediğim url dizesini oluşturmak için NameValuePair ve URLEncodedUtils Listesini kullanıyorum.

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

Katılıyorum. Geri döndüm ve bunu değiştirdim, çünkü bu yöntem daha büyük miktarlarda parametreler için mantıklı. Kabul edilen ilk cevap hala iyi çalışıyor, ancak büyük parametreler için kafa karıştırıcı olabilir.
damat

@Brian Griffey İyi Çözüm için teşekkürler. ama parametreyi geçmek için biraz farklı formatım var, bu parametreyi geçmeme kimse yardım edebilir mi ..? Bu durumda parametre nasıl geçirilir? data = '{"kimlik bilgisi": {"accesToken": "668f514678c7e7f5e71a07044935d94c", "ACK": "cf3bb509623a8e8fc032a08098d9f7b3"}, "restIn": {"userId": 5613};
Yog Guru

1
Diğer cevap, basit durumlar için çok daha kısa ve daha basittir. Yanlış değil ve dikkate değer.
qris

2
<NameValuePair> listesi, android api düzeyi 22'de kullanımdan kaldırıldı
Vihaan Verma

@SimonMeier: Uri.Builder () kullanın. Aşağıdaki cevaba bakın.
Vihaan Verma

95

URI'yi get parametreleriyle oluşturmak için Uri.Builder daha etkili bir yol sağlar.

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

Dosya parametrelerini de
işleyemiyorum

@ bizso09 "dosya parametreleri" sorgu ve parçayı mı kastediyorsunuz? Her ikisi de inşaatçı tarafından ayarlanabilir. URI terminolojisi için buna bir göz atın, bu bana çok yardımcı oldu developer.android.com/reference/java/net/URI.html
dvd

sorgu parametresi nasıl kaldırılır? mevcut sorgu parametresinin değeri nasıl değiştirilir?
Piotr

net bir yöntem geliştiricisi var . android.com/reference/android/net/… . değiştirmek için, bir sorgu listeniz olduğunu varsayın, listedeki değeri güncelleyin, clearQuery () ve ardından listenin döngüsünde appendQueryParameter öğesini çağırın. ama neden her seferinde talep üzerine yenisini yaratmıyorsunuz?
2014

31

İtibariyle HttpComponents 4.2+ yeni bir sınıf olup URIBuilder üreten URI'ler için uygun bir yol sağlar.

Doğrudan Dize URL'sinden URI oluşturmayı kullanabilirsiniz:

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

Aksi takdirde, tüm parametreleri açıkça belirtebilirsiniz:

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

URINesneyi oluşturduktan sonra, sadece HttpGetnesne oluşturmanız ve gerçekleştirmeniz yeterlidir :

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

28

Yöntem

setParams() 

sevmek

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

yalnızca HttpProtocol parametrelerini ekler.

HttpGet'i çalıştırmak için, parametrelerinizi URL'ye manuel olarak eklemelisiniz

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

veya gönderi isteğini kullanın, ilgileniyorsanız, alma ve gönderme istekleri arasındaki fark burada açıklanmıştır


1
Yardımın için teşekkürler. GET isteklerine parametre eklemenin daha etkili bir yolu olabileceğini düşündüm.
damat

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

Not: url = new URI(...)buggy


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

0

Eğer sabitiniz varsa , apache http üzerine kurulu URLbasitleştirilmiş http-isteği kullanmanızı öneririm .

Müşterinizi aşağıdaki gibi oluşturabilirsiniz:

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

Not: Yanıtınızı değiştirmenin birçok yararlı yöntemi vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.