Retrofit-Post-Parameter

Lesezeit: 4 Minuten

Benutzeravatar von Dipen Patel
Dipen Patel

Ich implementiere die Anmeldefunktion und verwende dafür die Post-Anforderung, aber ich erhalte eine Fehlermeldung

“retrofit.RetrofitError: com.squareup.okhttp.internal.http.HttpMethod.METHODS”

Unten ist mein Code

import java.util.HashMap;
import java.util.Map;

import retrofit.Callback;
import retrofit.http.*;




//Myapi.java

import java.util.HashMap;
import java.util.Map;

import retrofit.Callback;
import retrofit.http.*;

public interface MyApi {

    /* LOGIN */
    @POST("/api/0.01/oauth2/access_token/")
    // your login function in your api
    public void login(@Body HashMap<String, String> arguments, Callback<String> calback);
}


//In my activity
RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint(Constants_Interface.URL).setClient(newclient)
                .build();

        MyApi mylogin = restAdapter.create(MyApi.class); 
HashMap<String, String> dicMap = new HashMap<String, String>();
dicMap.put("client_id", XXX);
        dicMap.put("client_secret", XXX);
        dicMap.put("username", XXX);
        dicMap.put("password", XXX);
mylogin.login(dicMap, new Callback<String>() {

            @Override
            public void failure(RetrofitError retrofitError) {
                retrofitError.printStackTrace(); // to see if you have
                                                    // errors
            }

            @Override
            public void success(String s, retrofit.client.Response response) {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(), "Login Succes",
                        Toast.LENGTH_LONG).show();

            }
        });

Darunter logcat-Ausgabe.

02-10 13:02:43.846: W/System.err(30684): retrofit.RetrofitError: com.squareup.okhttp.internal.http.HttpMethod.METHODS 02-10

  • Wenn Ihr Server Json erwartet, versuchen Sie, das @Body-Argument zu einer Klasse zu machen.

    – Kevin Crain

    10. Februar 2015 um 7:26 Uhr


  • Nein, es wird kein Json-Objekt erwartet. Es fragt Parameter nur als Zeichenfolge ab.

    – Dipen Patel

    10. Februar 2015 um 7:29 Uhr

  • Retrofit serialisiert standardmäßig Ihre @Body-Klasse, sodass ich sicher bin, dass Ihr Server eine Zeichenfolge erhält

    – Kevin Crain

    10. Februar 2015 um 7:32 Uhr

  • Ich habe die Logcat-Ausgabe aktualisiert. Können Sie sich das bitte ansehen?

    – Dipen Patel

    10. Februar 2015 um 7:34 Uhr

  • Das ist ganz einfach, erstellen Sie eine LoginResponse-Klasse mit den vom Server erwarteten Feldern und verwenden Sie Callback anstelle von Callback, Retrofit versucht zu deserialisieren.

    – Kevin Crain

    10. Februar 2015 um 7:36 Uhr

Benutzeravatar von Gowtham Raj
Gowtham Raj

Versuchen Sie, dies zu verwenden

public interface SafeUserApi {
 @FormUrlEncoded
    @POST("/api/userlogin")
    void getUserLogin(
            @Field("client_id") String id,
            @Field("client_secret") String secret,
            @Field("username") String uname,
            @Field("password") String password,
            Callback<LoginResult> cb
    );
}

Hier ist parm1 der POST-Parameter, den Sie an den Server übergeben. Dies wird Ihr Problem lösen

Falls Sie PHP verwenden, können Sie mit param1 zugreifen $uname= $_POST('username');

BEARBEITEN 1:

Nachrüstversion 2.0:

public interface SafeUserApi {
    @FormUrlEncoded
    @POST("/api/userlogin")
    Call<ResponseBody>  getUserLogin(
            @Field("client_id") String id,
            @Field("client_secret") String secret,
            @Field("username") String uname,
            @Field("password") String password
    );
}

  • Kannst du den Stack-Trace in Pastebin einfügen und den Link hier teilen?

    – Gowtham Raj

    10. Februar 2015 um 7:31 Uhr

  • Welchen Anwendungs-/json-MIME-Typ möchte ich verwenden? Soll ich trotzdem @FormUrlEncoded verwenden

    – IgorGanapolsky

    29. April 2015 um 20:27 Uhr

  • Wenn Sie die Rückrufe entfernen, wie reagieren Sie dann auf die Antwort?

    – Gowtham Raj

    13. Juli 2015 um 12:28 Uhr

  • Ich kann auch nicht auf die Parameter zugreifen, indem ich $_POST verwende[‘username’] in meinem PHP-Code.

    – Dr. Ehsan Ali

    7. August 2015 um 9:54 Uhr

  • bist du sicher, dass du das gleiche benutzt hast @FormUrlEncoded und @Field ?

    – Gowtham Raj

    7. August 2015 um 9:55 Uhr

Sie können auch mehrere Feldparameter übergeben:
zum Beispiel:

@FormUrlEncoded
@POST("/oauth/access_token")
void getToken(
    @FieldMap Map<String, String> params, 
    Callback<FacebookLoginUserResponse> callback
);

Version 2.0 nachrüsten:

@FormUrlEncoded
@POST("api/v2/users/sign_in")
Call<SignInResult> userSignIn(
        @FieldMap HashMap<String, String> authData
);

„JSON-KONVERTIERUNG

Retrofit verwendet standardmäßig Gson, um HTTP-Bodys in und aus JSON zu konvertieren. Wenn Sie ein Verhalten angeben möchten, das sich von den Standardeinstellungen von Gson unterscheidet (z. B. Benennungsrichtlinien, Datumsformate, benutzerdefinierte Typen), stellen Sie beim Erstellen eines RestAdapters eine neue Gson-Instanz mit Ihrem gewünschten Verhalten bereit. Weitere Einzelheiten zur Anpassung finden Sie in der Gson-Dokumentation.”

Siehe Link für weitere Informationen:
http://square.github.io/retrofit/

Benutzeravatar von Singed
Versengt

Ich habe heute diesen Fehler bekommen

(“retrofit.RetrofitError: com.squareup.okhttp.internal.http.HttpMethod.METHODS”)

Das Problem war, dass ich verschiedene Versionen von okhttp und okhttp-urlconnection verwendet habe, also stellen Sie sicher, dass sie übereinstimmen.

  • Vielen Dank! Das hat mir das Leben gerettet, dachte, ich müsste auf Retrofit 2 upgraden. Ich bekam einen Fehler wie „retrofit.RetrofitError: No field METHODS“, und das hat es behoben.

    – Schäferhundschaf

    23. November 2016 um 16:12 Uhr

Benutzeravatar von Ahmad Aghazadeh
Ahmad Aghazadeh

Sie können die Klasse wie folgt verwenden:

public interface SafeUserApi {
    @POST("/api/userlogin")
    void getUserLogin(@Body PostData postData);
}

public class PostData{
      String client_id;
      String client_secret;
      String username;
      String password;
}

  • Vielen Dank! Das hat mir das Leben gerettet, dachte, ich müsste auf Retrofit 2 upgraden. Ich bekam einen Fehler wie „retrofit.RetrofitError: No field METHODS“, und das hat es behoben.

    – Schäferhundschaf

    23. November 2016 um 16:12 Uhr

1435790cookie-checkRetrofit-Post-Parameter

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy