2013-10-30 11 views
6

mia interfaccia si presenta come segue:Come inviare x-www-form-urlencoded in un corpo di richiesta POST utilizzando le annotazioni Android e resttemplate

@Rest(rootUrl = "https://myurl.com", converters = { GsonHttpMessageConverter.class }) 
public interface CommunicatonInterface 
{ 
@Get("/tables/login") 
public Login login(Param param); 
public RestTemplate getRestTemplate(); 
} 

La domanda è che cosa avrei dovuto mettere come un param per ottenere nel corpo semplicemente:

login=myName&password=myPassword&key=othereKey 

senza fughe, parentesi o quota.

Ho provato a passare una stringa e ho ricevuto: "login=myName&password=myPassword&key=othereKey" ma è sbagliato a causa di segni di quota.

risposta

1

Se ho capito bene, vuoi inviare i parametri login e password da un modulo al tuo metodo.

Per questo, è necessario assicurarsi di avere le seguenti operazioni:

  1. creare un modulo di login che ha i campi di testo di input con login e password come nomi.
  2. Assicurarsi che il form disponga di un metodo POST, non si desidera realmente avere le credenziali dell'utente nell'URL come ottenere i parametri, ma se si utilizza il caso, è necessario farlo.
  3. Nel tuo Interface, invece di utilizzare GsonHttpMessageConverter dovresti utilizzare FormHttpMessageConverter. Questo convertitore accetta e restituisce il contenuto con application/x-www-form-urlencoded che è il content-type corretto per l'invio di moduli.
  4. La classe Param deve avere campi con lo stesso nome dei campi di testo di input. Nel tuo caso, login e password. Dopo aver effettuato questa operazione, i parametri di richiesta pubblicati nel modulo saranno disponibili nell'istanza param.

Spero che questo aiuti.

1
  1. Assicurati di includere FormHttpMessageConverter.class nell'elenco dei convertitori.
  2. Invece di utilizzare un tipo Param per l'invio dei dati, utilizzare un'implementazione MultiValueMap (come LinkedMultiValueMap) o fare in modo che la classe Param estenda LinkedMultiValueMap.

Esempio LinkedMultiValueMap estensione:

@Rest(converters = {FormHttpMessageConverter.class, MappingJacksonHttpMessageConverter.class}) 
public interface RestClient extends RestClientRootUrl { 
    @Post("/login") 
    LoginResponse login(LoginRequest loginRequest); 
} 


public class LoginRequest extends LinkedMultiValueMap<String, String> { 
    public LoginRequest(String username, String password) { 
     add("username", username); 
     add("password", password); 
    } 
} 
0

È possibile avere più convertitori, perché in base all'oggetto passata, si sceglierà un convertitore per voi. Detto questo, se passi in una MultiValueMap, per qualche motivo lo aggiungerai alle intestazioni perché Android Annotations crea un'HttpEntity. Se estendi MultiValueMap come suggerito da Ricardo, funzionerà.