Bagaimana cara menambahkan parameter ke permintaan HTTP GET di Android?

119

Saya memiliki permintaan HTTP GET yang saya coba kirim. Saya mencoba menambahkan parameter ke permintaan ini dengan terlebih dahulu membuat BasicHttpParamsobjek dan menambahkan parameter ke objek itu, lalu memanggil objek setParams( basicHttpParms )saya HttpGet. Metode ini gagal. Tetapi jika saya secara manual menambahkan parameter saya ke URL saya (yaitu menambahkan ?param1=value1&param2=value2) itu berhasil.

Saya tahu saya melewatkan sesuatu di sini dan bantuan apa pun akan sangat kami hargai.

rapi
sumber
1
Untuk permintaan GET, metode kedua adalah cara yang benar untuk menambahkan parameter. Saya berharap pendekatan pertama adalah untuk metode POST.
James Black

Jawaban:

225

Saya menggunakan List of NameValuePair dan URLEncodedUtils untuk membuat string url yang saya inginkan.

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
sumber
Saya setuju. Saya telah kembali dan mengubah ini karena metode ini masuk akal untuk jumlah parameter yang lebih besar. Jawaban pertama yang diterima masih berfungsi dengan baik, tetapi dapat membingungkan untuk set parameter yang besar.
gagah
@ Brian Griffey Terima kasih untuk Solusi yang baik. tetapi saya memiliki format yang sedikit berbeda untuk melewatkan parameter, Adakah yang bisa membantu saya untuk melewati parameter ini ..? Bagaimana cara melewatkan parameter dalam kasus ini? data = '{"credential": {"accesToken": "668f514678c7e7f5e71a07044935d94c", "ACK": "cf3bb509623a8e8fc032a08098d9f7b3"}, "restIn": {"userId": 4: "listId"; "4: 5613}}
Yog Guru
1
Jawaban lainnya jauh lebih pendek dan lebih sederhana untuk kasus sederhana. Itu tidak salah, dan patut dipertimbangkan.
qris
2
Daftar <NameValuePair> sudah tidak digunakan lagi di api android level 22
Vihaan Verma
@SimonMeier: gunakan Uri.Builder (). Lihat jawabannya di bawah ini.
Vihaan Verma
95

Untuk membangun uri dengan parameter get, Uri.Builder menyediakan cara yang lebih efektif.

Uri uri = new Uri.Builder()
    .scheme("http")
    .authority("foo.com")
    .path("someservlet")
    .appendQueryParameter("param1", foo)
    .appendQueryParameter("param2", bar)
    .build();
9re
sumber
Juga tidak bisa menangani parameter file
siamii
@ bizso09 "parameter file" yang Anda maksud kueri dan fragmen? Keduanya dapat diatur oleh pembangun. Lihatlah ini untuk terminologi URI, ini banyak membantu saya developer.android.com/reference/java/net/URI.html
dvd
bagaimana cara menghapus parameter kueri? bagaimana cara mengubah nilai parameter kueri yang ada?
Piotr
ada metode developer.android.com/reference/android/net/… yang jelas . untuk memodifikasi, anggaplah Anda memiliki daftar kueri, perbarui nilai dalam daftar, clearQuery (), lalu panggil appendQueryParameter di loop daftar. tetapi mengapa tidak membuat yang baru setiap saat sesuai permintaan?
9re
31

Pada HttpComponents 4.2+ ada kelas baru URIBuilder , yang menyediakan cara yang nyaman untuk URI pembangkit.

Anda dapat menggunakan salah satu membuat URI langsung dari URL 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();

Jika tidak, Anda dapat menentukan semua parameter secara eksplisit:

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

Setelah Anda membuat URIobjek, Anda hanya perlu membuat HttpGetobjek dan melakukannya:

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

Metode

setParams() 

Suka

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

hanya menambahkan parameter HttpProtocol.

Untuk menjalankan httpGet Anda harus menambahkan parameter Anda ke url secara manual

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

atau gunakan permintaan posting perbedaan antara permintaan get dan posting dijelaskan di sini , jika Anda tertarik

n3utrino.dll
sumber
1
Terima kasih untuk bantuannya. Saya pikir mungkin ada cara yang lebih efektif untuk menambahkan parameter ke permintaan GET.
tampan pada
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

Catatan: url = new URI(...)adalah buggy

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

Jika Anda memiliki konstanta, URLsaya sarankan untuk menggunakan http-request yang disederhanakan yang dibangun pada apache http.

Anda dapat membangun klien Anda sebagai berikut:

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

Catatan: Ada banyak metode berguna untuk memanipulasi respons Anda.

Beno Arakelyan
sumber