Làm cách nào để thêm thông số vào yêu cầu HTTP GET trong Android?


119

Tôi có một yêu cầu HTTP GET mà tôi đang cố gắng gửi. Tôi đã thử thêm các tham số vào yêu cầu này bằng cách đầu tiên tạo một BasicHttpParamsđối tượng và thêm các tham số vào đối tượng đó, sau đó gọi đối tượng setParams( basicHttpParms )của tôi HttpGet. Phương pháp này không thành công. Nhưng nếu tôi thêm các thông số vào URL của mình theo cách thủ công (tức là thêm vào ?param1=value1&param2=value2) thì nó sẽ thành công.

Tôi biết tôi đang thiếu một cái gì đó ở đây và mọi sự giúp đỡ sẽ được đánh giá rất cao.


1
Đối với yêu cầu GET, phương pháp thứ hai là cách chính xác để thêm tham số. Tôi mong đợi cách tiếp cận đầu tiên dành cho các phương thức POST.
James Black

Câu trả lời:


225

Tôi sử dụng Danh sách NameValuePair và URLEncodedUtils để tạo chuỗi url mà tôi muốn.

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

Tôi đồng ý. Tôi đã quay lại và thay đổi điều này vì phương thức này có ý nghĩa đối với lượng tham số lớn hơn. Câu trả lời được chấp nhận đầu tiên vẫn hoạt động tốt, nhưng có thể gây nhầm lẫn cho các tập hợp thông số lớn.
chú rể

@Brian Griffey Cảm ơn vì Giải pháp tốt. nhưng tôi có một chút định dạng khác nhau để truyền tham số, Bất cứ ai có thể giúp tôi truyền tham số này ..? Làm thế nào để truyền tham số trong trường hợp này? data = '{"credential": {"accesToken": "668f514678c7e7f5e71a07044935d94c", "ACK": "cf3bb509623a8e8fc032a08098d9f7b3"}, "restIn": {"userId": 4, "listId";
Yog Guru

1
Câu trả lời còn lại ngắn hơn và đơn giản hơn nhiều cho những trường hợp đơn giản. Nó không sai, và đáng để xem xét.
qris

2
Danh sách <NameValuePair> không được dùng nữa trong android api cấp 22
Vihaan Verma

@SimonMeier: sử dụng Uri.Builder (). Xem câu trả lời bên dưới.
Vihaan Verma

95

Để xây dựng uri với tham số get, Uri.Builder cung cấp một cách hiệu quả hơn.

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

Ngoài ra các thông số tập tin xử lý không thể
siamii

@ bizso09 "tham số tệp" ý bạn là truy vấn và phân mảnh? Cả hai đều có thể được thiết lập bởi người xây dựng. Hãy xem điều này để biết thuật ngữ URI, nó đã giúp tôi rất nhiều developer.android.com/reference/java/net/URI.html
dvd

làm thế nào để loại bỏ tham số truy vấn? làm thế nào để thay đổi giá trị của tham số truy vấn hiện có?
Piotr

có một phương pháp rõ ràng là developer.android.com/reference/android/net/… . để sửa đổi, giả sử rằng bạn có một danh sách các truy vấn, cập nhật giá trị trong danh sách, clearQuery () và sau đó gọi appendQueryParameter trong vòng lặp của danh sách. nhưng tại sao không tạo cái mới mọi lúc theo yêu cầu?
9 giờ

31

Đối với HttpComponents, 4.2+ có một URIBuilder lớp mới , cung cấp cách thuận tiện để tạo URI.

Bạn có thể sử dụng tạo URI trực tiếp từ URL chuỗi:

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

Nếu không, bạn có thể chỉ định tất cả các tham số một cách rõ ràng:

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

Khi bạn đã tạo URIđối tượng, bạn chỉ cần tạo HttpGetđối tượng và thực hiện nó:

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

28

Phương pháp

setParams() 

giống

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

chỉ thêm các tham số HttpProtocol.

Để thực thi httpGet, bạn nên nối các tham số của mình vào url theo cách thủ công

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

hoặc sử dụng yêu cầu bài đăng, sự khác biệt giữa yêu cầu nhận và đăng được giải thích ở đây , nếu bạn quan tâm


1
Cảm ơn sự giúp đỡ của bạn. Tôi nghĩ có thể có một cách hiệu quả hơn để thêm tham số vào các yêu cầu GET.
chú rể

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

Lưu ý: url = new URI(...)là lỗi


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

Nếu bạn không đổi, URLtôi khuyên bạn nên sử dụng http-request đơn giản hóa được xây dựng trên apache http.

Bạn có thể xây dựng khách hàng của mình như sau:

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

Lưu ý: Có nhiều phương pháp hữu ích để điều khiển phản hồi của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.