2013-10-30 4 views
6

meine Schnittstelle sieht x-www-form-urlencoded zu senden, wie folgt:Wie in einem Körper der POST-Anfrage mit Android Anmerkungen und resttemplate

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

Die Frage, was ich sollte als param setzen zu bekommen im Körper einfach:

login=myName&password=myPassword&key=othereKey 

ohne zu entkommen, Klammern oder Quote.

Ich habe versucht, eine Zeichenfolge übergeben, und ich bekomme nur: "login=myName&password=myPassword&key=othereKey" aber es ist falsch wegen der Quotenzeichen.

Antwort

1

Wenn ich richtig verstehe, möchten Sie login und password Parameter von einem Formular zu Ihrer Methode buchen.

Dazu sollten Sie sicherstellen, dass Sie die folgenden Schritte haben:

  1. ein Login-Formular erstellen, die Eingabetextfelder mit login und password als Namen hat.
  2. Stellen Sie sicher, dass die form eine POST Methode hat, wollen Sie nicht wirklich Benutzeranmeldeinformationen in der URL als erhalten params, aber wenn Sie Fall verwenden müssen Sie es tun, können Sie.
  3. In Ihrem , anstelle von GsonHttpMessageConverter sollten Sie FormHttpMessageConverter verwenden. Dieser Konverter akzeptiert und gibt Inhalt mit application/x-www-form-urlencoded zurück, der der richtige content-type für Formularübermittlungen ist.
  4. Ihre Klasse Param sollte Felder haben, die denselben Namen wie die Eingabetextfelder haben. In Ihrem Fall login und password. Nachdem Sie dies getan haben, sind die im Formular veröffentlichten Anfrageparameter in der param Instanz verfügbar.

Hoffe, das hilft.

1
  1. Achten Sie darauf, FormHttpMessageConverter.class in Ihre Konverterliste aufzunehmen.
  2. Anstatt einen Param-Typ zum Senden der Daten zu verwenden, verwenden Sie eine MultiValueMap-Implementierung (z. B. LinkedMultiValueMap) oder machen Sie Ihre Param-Klasse dazu, LinkedMultiValueMap zu erweitern.

Beispiel erstreckt LinkedMultiValueMap:

@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

Sie können, da mehrere Wandler haben die Aufgabe zugrunde, in übergeben, wird es einen Konverter für Sie zu wählen. Das heißt, wenn Sie eine MultiValueMap übergeben, wird sie aus irgendeinem Grund zu den Headern hinzugefügt, da Android Annotations eine HttpEntity erstellt. Wenn Sie MultiValueMap erweitern, wie Ricardo vorgeschlagen hat, wird es funktionieren.