【问题标题】:The string property has a value that is too long. It cannot exceed 500 characters字符串属性的值太长。不能超过 500 个字符
【发布时间】:2014-05-29 20:29:10
【问题描述】:

我只是尝试向端点方法发送一个长字符串参数。其中一个参数是List<String>,其中包含大量值,如下所示:

105969550886996847196,109334384788152421649,109172191656045871108,... and more

方法本身很简单:

@ApiMethod(name = "getFullObjects")
public MyObject getFullObjects(List<String> ids) {
    //body not relevant
}

它抛出这个:

Error Code: 400
Reason: badRequest
Message: java.lang.IllegalArgumentException: The string property ids has a value that is too long. It cannot exceed 500 characters.

我真的不能在一个参数中传递超过 500 个字符吗?那会很糟糕...:/

有没有办法超过这个限制或以其他方式传递这些数据?

注意:

此端点方法与 Android 应用程序协作!

注意 2:

如果真的有,端点参数的限制是 500 个字符,我在 GAE 的任何文档中都找不到,只是想知道如何有可以通过的实体列表......其中一些肯定需要超过序列化为字符串后的 500 个字符。

【问题讨论】:

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


    【解决方案1】:

    @Xylian,要绕过限制,您可以将 String 分解为多个参数,或者使用 @ApiTransformer 来绕过限制。

    您还有其他选择:

    • 限制您在每个字符串中发送的字符数。您可以只发送数字(1、2、10...)来表示这些 ID(或任何它们),而不是发送 21 个字符长的字符串,然后在服务器上有一个映射表来“转换”这些短 ID到长 ID。

    • 批量调用 API 以避免仅在一次调用中就超出配额。

    【讨论】:

    • 我不认为我可以将它分解为多个参数,因为列表大小是动态的,我永远不知道我需要多少个参数。
    • 那么,您将不得不多次调用 API 或减小字符串的大小。不幸的是,没有其他方法可以绕过这个限制。
    • 那将是非常非常可悲的......仍然这个答案最接近正确的答案(虽然不是很有帮助:/)。不知道是谁减去了它...
    • 或者...看我的回答;)
    • 限制可能仅限于一个字段,而不是实体的总大小(String[] 可能被视为单个字段)。不过我不确定,因为我找不到任何与此相关的文档。
    【解决方案2】:

    我想我找到了可能的最佳解决方案。

    但首先...

    由于 Google App Engine 开发人员小组被 googlers 抛弃并搬到这里,我正式将其发布为错误。这是一个可笑的限制,只会惹恼认真的开发人员,我只好绕过它。 请删除端点方法参数中未记录的 500 个字符的限制!

    那么解决办法...

    我决定定义一个新的 servlet 来代替端点方法来处理这个问题。这里是:

    public class LongParamTestServlet extends HttpServlet {
    
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        }
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String paramsString = req.getParameter("params");
            resp.getWriter().write("string length: " + paramsString.length());
        }
    }
    

    然后我用一些很长的参数向这个 servlet 发出请求...

    现在是响应...

    string length: 1664
    

    维奥拉!刚刚传递给我的长度为 1664 的 Google App Engine 后端参数。我将它序列化为 json,并返回一个 json 作为响应。不像端点方法那样舒服,但它可以工作。

    【讨论】:

      猜你喜欢
      • 2012-03-19
      • 2012-08-06
      • 2018-04-25
      • 2017-08-31
      • 2015-03-27
      • 2013-05-26
      • 2015-05-30
      • 2016-02-11
      • 1970-01-01
      相关资源
      最近更新 更多