如何使用Google Cloud Endpoints将字符串列表作为参数传递

时间:2015-06-09 16:33:20

标签: android google-app-engine google-cloud-endpoints

我正在将Google Cloud Endpoints用于简单的Android应用程序。但是,我无法将字符串列表作为参数传递给API方法。 如果我使用List作为参数类型,则构建很好,但是我传递的列表中的字符串是连接的,用逗号分隔,并且服务器接收的列表中只有一个条目,这个连接的字符串。例如,如果在客户端中我传递[“a”,“b”,“c”],则服务器接收[“a,b,c”]。 你能用正确的方法帮助我吗?

EDIT1:

在Cloud Endpoint中我有:

@ApiMethod(name = "addGroup")
public void addGroup(@Named("members") List<String> members,
                     @Named("session") String sessionString) throws ForbiddenException

在Android客户端中:

final List<String> selectedFriends = new ArrayList<>();
selectedFriends.add("A");
selectedFriends.add("B");
selectedFriends.add("C");         
ServerApi.getInstance().addGroup(selectedFriends,Session.JSONSession()).execute();

EDIT2: 生成的类自动反编译为:

public class AddGroup extends MyApiRequest<Void> {
    private static final String REST_PATH = "addGroup/{members}/{session}";
    @Key
    private List<String> members;
    @Key
    private String session;

    protected AddGroup(List<String> this$0, String members) {
        super(MyApi.this, "POST", "addGroup/{members}/{session}", (Object)null, Void.class);
        this.members = (List)Preconditions.checkNotNull(members, "Required parameter members must be specified.");
        this.session = (String)Preconditions.checkNotNull(session, "Required parameter session must be specified.");
    }
... everything as expected
}

令我困惑的是这个$ 0参数和第二个名为members的参数(看起来会跳过session参数?)。

谢谢!

3 个答案:

答案 0 :(得分:1)

我也遇到过这个问题。 尝试了不同的方法来解决问题,但没有任何效果。

向Google AppEngine问题跟踪器报告了此问题: https://code.google.com/p/googleappengine/issues/detail?id=12105

答案 1 :(得分:0)

我不确定为什么注释处理器会以某种方式将this$0作为路径参数注入。您的API是否真的需要在路径的一部分中包含memberssession?或者,这些都可以/应该是查询参数(请参阅自动生成的代码以及它是如何在那里注入的)?尝试删除这两者的@Named注释,这将使它们自动成为查询参数。

答案 2 :(得分:0)

鉴于此方法正在进行修改,它应该是一个POST。我建议不要在这里使用@Named。我会创建一个包含两个参数的AddGroupRequest类。这样它们作为JSON主体而不是URL参数传递。如上所述,这是一个错误,如果您需要在URL参数中使用List,则可以在App Engine public tracker提交问题。但我建议改用我的解决方案,除非你有充分的理由使用这样的网址。