2015-02-10 15 views
27

sto implementando funzionalità di accesso e per questo utilizzo richiesta Inserisci ma sto ottenendo errore che diceRetrofit Messaggio Parametro

"retrofit.RetrofitError: com.squareup.okhttp.internal.http.HttpMethod.METHODS"

Di seguito è riportato il mio codice

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

      } 
     }); 

Sotto di essa logcat output.

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

+0

Se state server è in attesa di JSON quindi provare a fare l'argomento @Body una classe. –

+0

No, non si aspetta un oggetto JSON. Sta chiedendo i parametri solo come stringa. –

+0

Retrofit serializza la tua classe @Body per impostazione predefinita, quindi sono sicuro che il tuo server riceverà una stringa –

risposta

51

Provare a utilizzare questa

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

Qui parm1 è il parametro POST che si passerà al server. Questo risolverà il vostro problema

nel caso in cui se si utilizza PHP u può accedere al param1 utilizzando $uname= $_POST('username');

EDIT 1:

retrofit 2.0 Versione:

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 
    ); 
} 
+0

ho provato ma non funziona –

+0

u può incollare l'analisi dello stack in pastebin. e condividere il link qui? –

+0

Ho modificato la risposta per favore prova questo –

1

"JSON CONVERSION

Retrofit u ses Gson di default per convertire i corpi HTTP in e da JSON. Se si desidera specificare un comportamento diverso dai valori predefiniti di Gson (ad esempio criteri di denominazione, formati data, tipi personalizzati), fornire una nuova istanza Gson con il comportamento desiderato durante la creazione di un RestAdapter. Per ulteriori informazioni sulla personalizzazione, consultare la documentazione GSON "

clicca il link per maggiori informazioni:. http://square.github.io/retrofit/

+0

ho già provato con parametro di campo pure. @FormUrlEncoded \t @POST ("/ api/0.01/OAuth/access_token /") \t // la funzione di login nella vostra api \t public void login (@Field ("client_id") client_id String, \t \t \t @ field ("client_secret") client_secret String, \t \t \t @Field ("username") String username, \t \t \t @Field ("password") la password String, richiamata Calback); –

3

ho ottenuto questo errore oggi

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

Il problema è stato che stava usando diverse versioni okhttp e okhttp-urlconnection, quindi assicurati che corrispondano.

+1

Grazie! Questo mi ha salvato la vita, pensavo che avrei dovuto effettuare l'aggiornamento a Retrofit 2. Stavo ricevendo un errore come retrofit.RetrofitError: nessun METODO sul campo, e questo l'ha risolto. – Sheepdogsheep

8

È anche possibile passare più parametri di campo: per l'esame pio:

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

Retrofit versione 2.0:

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