Wie füge ich einer HTTP-GET-Anfrage in Android Parameter hinzu?

119

Ich habe eine HTTP-GET-Anfrage, die ich senden möchte. Ich habe versucht, die Parameter zu dieser Anforderung hinzuzufügen, indem ich zuerst ein BasicHttpParamsObjekt erstellt und die Parameter zu diesem Objekt hinzugefügt und dann setParams( basicHttpParms )mein HttpGetObjekt aufgerufen habe . Diese Methode schlägt fehl. Wenn ich meine Parameter jedoch manuell zu meiner URL hinzufüge (dh anhänge ?param1=value1&param2=value2), ist dies erfolgreich.

Ich weiß, dass mir hier etwas fehlt und jede Hilfe wäre sehr dankbar.

Bräutigam
quelle
1
Bei einer GET-Anforderung ist die zweite Methode der richtige Weg, um Parameter hinzuzufügen. Ich gehe davon aus, dass der erste Ansatz für POST-Methoden gilt.
James Black

Antworten:

225

Ich verwende eine Liste von NameValuePair und URLEncodedUtils, um die gewünschte URL-Zeichenfolge zu erstellen.

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
quelle
Genau. Ich bin zurückgegangen und habe dies geändert, da diese Methode für größere Mengen von Parametern sinnvoll ist. Die erste akzeptierte Antwort funktioniert immer noch einwandfrei, kann jedoch bei großen Parametersätzen verwirrend sein.
Bräutigam
@ Brian Griffey Danke für die gute Lösung. Aber ich habe wenig anderes Format, um Parameter zu übergeben. Kann mir jemand helfen, diesen Parameter zu übergeben? Wie übergebe ich Parameter in diesem Fall? data = '{"credential": {"accesToken": "668f514678c7e7f5e71a07044935d94c", "ACK": "cf3bb509623a8e8fc032a08098d9f7b3"}, "restIn": {"userId": 4, "list }d;
Yog Guru
1
Die andere Antwort ist für einfache Fälle viel kürzer und einfacher. Es ist nicht falsch und eine Überlegung wert.
Qris
2
Liste <NameValuePair> ist in Android API Level 22
Vihaan Verma
@ SimonMeier: Verwenden Sie Uri.Builder (). Siehe die Antwort unten.
Vihaan Verma
95

Um uri mit get-Parametern zu erstellen, bietet Uri.Builder eine effektivere Möglichkeit.

Uri uri = new Uri.Builder()
    .scheme("http")
    .authority("foo.com")
    .path("someservlet")
    .appendQueryParameter("param1", foo)
    .appendQueryParameter("param2", bar)
    .build();
9re
quelle
Ich kann
@ bizso09 "Dateiparameter" meinst du Abfrage und Fragment? Sie sind beide vom Bauherrn einstellbar. Schauen Sie sich dies für die URI-Terminologie an, es hat mir sehr geholfen. Developer.android.com/reference/java/net/URI.html
DVD
Wie entferne ich Abfrageparameter? Wie ändere ich den Wert eines vorhandenen Abfrageparameters?
Piotr
Es gibt eine klare Methode developer.android.com/reference/android/net/… . Nehmen Sie zum Ändern an, dass Sie eine Liste von Abfragen haben, aktualisieren Sie den Wert in der Liste, clearQuery () und rufen Sie dann appendQueryParameter in der Schleife der Liste auf. Aber warum nicht jedes Mal auf Anfrage das neue erstellen?
9.
31

Ab HttpComponents 4.2+ gibt es einen neuen Klassen- URIBuilder , der eine bequeme Möglichkeit zum Generieren von URIs bietet.

Sie können entweder URI direkt über die String-URL erstellen:

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

Andernfalls können Sie alle Parameter explizit angeben:

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

Sobald Sie ein URIObjekt erstellt haben , müssen Sie nur noch ein HttpGetObjekt erstellen und es ausführen:

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

Die Methode

setParams() 

mögen

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

fügt nur HttpProtocol-Parameter hinzu.

Um das httpGet auszuführen, sollten Sie Ihre Parameter manuell an die URL anhängen

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

Oder verwenden Sie die Post-Anfrage. Der Unterschied zwischen Get- und Post-Anfragen wird hier erklärt , wenn Sie interessiert sind

n3utrino
quelle
1
Danke für Ihre Hilfe. Ich dachte, es könnte eine effektivere Möglichkeit geben, Parameter zu GET-Anforderungen hinzuzufügen.
Bräutigam
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

Hinweis: url = new URI(...)ist fehlerhaft

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

Wenn Sie eine Konstante haben, URLempfehle ich die Verwendung einer vereinfachten http-Anfrage, die auf Apache http basiert.

Sie können Ihren Client wie folgt erstellen:

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

Hinweis: Es gibt viele nützliche Methoden, um Ihre Antwort zu bearbeiten.

Beno Arakelyan
quelle