6

我的界面如下所示:

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

问题是我应该把什么作为参数简单地进入身体:

login=myName&password=myPassword&key=othereKey

没有转义,括号或配额。

我尝试传递一个字符串,但我得到了: "login=myName&password=myPassword&key=othereKey"但由于配额标志,这是错误的。

4

3 回答 3

1
  1. 请务必在您的转换器列表中包含 FormHttpMessageConverter.class。
  2. 不要使用 Param 类型来发送数据,而是使用 MultiValueMap 实现(例如 LinkedMultiValueMap)或让您的 Param 类扩展 LinkedMultiValueMap。

扩展 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);
    }
}
于 2014-01-07T23:31:09.850 回答
1

如果我理解正确,您希望将表单中的参数loginpassword参数发布到您的方法中。

为此,您应确保执行以下步骤:

  1. 创建一个登录表单,该表单具有输入文本字段loginpassword名称。
  2. 确保form有一个POST方法,你真的不想在 URL 中拥有用户的凭据作为获取参数,但如果你的用例需要你这样做,你可以。
  3. 在您的Interface, 而不是使用GsonHttpMessageConverter您应该使用FormHttpMessageConverter. 此转换器接受并返回application/x-www-form-urlencoded适合content-type表单提交的内容。
  4. 您的Param类应该具有与输入文本字段同名的字段。在你的情况下,loginpasswordparam执行此操作后,表单中发布的请求参数将在实例中可用。

希望这可以帮助。

于 2013-12-06T01:43:42.683 回答
0

您可以有多个转换器,因为根据传入的对象,它会为您选择一个转换器。也就是说,如果您传入 MultiValueMap,它会出于某种原因将其添加到标题中,因为 Android 注释会创建一个 HttpEntity。如果您按照 Ricardo 的建议扩展 MultiValueMap,它将起作用。

于 2014-02-21T22:10:27.700 回答