2013-10-30 6 views
6

mój interfejs wygląda następująco:Jak wysłać x-www-form-urlencoded w ciele żądania POST przy użyciu android adnotacje i resttemplate

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

Chodzi o to, co mam umieścić jako param, aby uzyskać w ciele:

login=myName&password=myPassword&key=othereKey 

bez ucieczki, wsporników lub limitu.

Próbowałem przekazać ciąg znaków i otrzymuję: "login=myName&password=myPassword&key=othereKey", ale jest on nieprawidłowy z powodu znaków przydziału.

Odpowiedz

1

Jeśli dobrze rozumiem, chcesz opublikować parametry login i password z formularza na swojej metodzie.

do tego, należy upewnić się, że następujące etapy:

  1. utworzyć formularz logowania, który ma wejściowe pola tekstowe z login i password jako nazw.
  2. Upewnij się, że form ma metodę POST, tak naprawdę nie chcesz mieć poświadczeń użytkownika w adresie URL jako params, ale jeśli używasz tego, możesz to zrobić.
  3. W swoim Interface, zamiast używać GsonHttpMessageConverter, powinieneś używać FormHttpMessageConverter. Ten konwerter akceptuje i zwraca treść z application/x-www-form-urlencoded, która jest poprawna content-type do przesyłania formularzy.
  4. Twoja klasa Param powinna zawierać pola, które mają taką samą nazwę jak pola tekstu wejściowego. W twoim przypadku: login i password. Gdy to zrobisz, parametry żądania opublikowane w formularzu będą dostępne w instancji param.

Mam nadzieję, że to pomoże.

1
  1. Pamiętaj, aby dołączyć FormHttpMessageConverter.class do listy konwerterów.
  2. Zamiast używać typu Param do wysyłania danych, należy użyć implementacji MultiValueMap (takiej jak LinkedMultiValueMap) lub rozszerzyć klasę Param LinkedMultiValueMap.

Przykład rozszerzenie 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

Można mieć wiele konwerterów, ponieważ opiera się na obiekt przeszedł w, to wybrać konwerter dla Ciebie. To powiedziawszy, jeśli przejdziesz MultiValueMap, to z jakiegoś powodu dodasz go do nagłówków, ponieważ Adnotacje Androida tworzą HttpEntity. Jeśli rozszerzysz MultiValueMap, Ricardo zasugerował, że to zadziała.

Powiązane problemy