当前位置: 首页 > 知识库问答 >
问题:

更改URL中列表/数组的格式[改装2]

刁俊人
2023-03-14

正如上面的@query注释的改装文档中所述:

传递列表或数组将为每个非空项生成一个查询参数。

到目前为止,我的呼叫看起来如下所示:

@GET("questions")
Call<List<QuestionHolder>> getQuestionsExcludingTheSpecified(
        @Query("exclude_ids") long[] excludedQuestionIds
);

这是可行的,但会导致相当长的URL和相当快的URL。

例如。对于excludedQuestionIds=new long[]{1L,4L,16L,64L},请求URL已经是/questions?exclude_ids=1&exclude_ids=4&exclude_ids=16&exclude_ids=64

是否有一种简单的方法来交换这种导致数组格式化为exclude_ids=[1,4,16,64]或类似内容的行为?

我想到的是:

  • 使用JsonArray作为参数,但在调用之前,我需要转换每个数组/列表
  • 截取每个请求并压缩重复密钥
  • 重写内置的@query修饰符

有什么想法吗?

共有1个答案

宋飞文
2023-03-14

我决定采用拦截器的方法。我只是更改包含单个查询参数的多个值的任何传出请求。

public class QueryParameterCompressionInterceptor implements Interceptor {

    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
        Request request = chain.request();

        HttpUrl url = request.url();
        for (String parameterName : url.queryParameterNames()) {
            List<String> queryParameterValues = url.queryParameterValues(parameterName);

            if (queryParameterValues.size() > 1) {
                String formattedValues= "[" + TextUtils.join(",", queryParameterValues) + "]";

                request = request.newBuilder()
                        .url(
                                url.newBuilder()
                                        .removeAllQueryParameters(parameterName)
                                        .addQueryParameter(parameterName, formattedValues)
                                        .build()
                        ).build();
            }
        }

        return chain.proceed(request);
    }

非android解决方案

TextUtils是Android SDK的一部分,如果您不是为Android开发的,您可以将TextUtils.join交换为以下方法:

    public static String concatListOfStrings(String separator, Iterable<String> strings) {
        StringBuilder sb = new StringBuilder();

        for (String str : strings) {
            sb.append(separator).append(str);
        }

        sb.delete(0, separator.length());

        return sb.toString();
    }
}

您也可以查看这个SO问题,以获得更多关于级联的解决方案。

 类似资料:
  • 我想把列表更改为json格式。我该怎么办? Java script部分我无法获得这样的代码部分

  • 我尝试使用谷歌图表,谷歌图表中的数据格式像 打印时间输出为: 问题是我不知道如何添加'new Date()',并将Date放入括号中不加引号。有什么想法吗??提前谢谢!

  • 我们正在从具有日期的数据库中检索列表。我们希望以不同的格式显示它。假设2014年11月10日。 这是我的密码 跟踪1: 小径2: 但它会带来错误。有什么方法,我们可以使用,以获得所需的日期格式在Laravel? 正常查询:

  • 问题内容: 我有这个网址: 我需要的是能够将“行”的url参数值更改为我指定的值,比方说10。如果“行”不存在,则需要将其添加到url的末尾并添加我已经指定的值(10)。 问题答案: 在学到很多东西之后的四年后,回答我自己的问题。特别是您不应该将jQuery用于所有功能。我创建了一个可以解析/字符串化查询字符串的简单模块。这使得修改查询字符串变得容易。 您可以按以下方式使用查询字符串:

  • 我定义了静态最终ArrayList,然后我将其发送到其他类进行更改。但它应该只在第二个类中本地更改,因为他是最终的,就像我示例中的int一样。为什么它也在Main类中更改? 小代码示例: 我的输出: 我所期望的是:

  • 在本期续篇中 主代码: 然后我需要得到一个最接近给定日期的值列表: 然后弄一张这样的桌子: 但如何才能得到这种格式的结果: 我在此上下文中使用pivot的所有尝试都没有成功。 更新 根据@Gordon Linoff和@xxx的建议,尝试重做使用Dinamic SQL的代码,现在开始: ‘op为(选择op.id_object,op.id_param,name,op.cdate,op.value,RO