如何在android中使用改造@Query注解进行过滤

Posted

技术标签:

【中文标题】如何在android中使用改造@Query注解进行过滤【英文标题】:How can I use the retrofit @Query annotation for filtration in android 【发布时间】:2022-01-04 12:43:45 【问题描述】:

我在下面有一个 php 文件

<?php
require dirname(__FILE__).'/../DbConnection/conn.php';

if($conn)
    $sqlStr = "SELECT
    YEAR(OrderBill.BillingDate) AS year,
    SUM(MultiPay.Amount) AS growth_rate
    FROM Rst_TblMultiPayModes MultiPay
    LEFT OUTER JOIN Rst_TblOrderBills OrderBill
    ON MultiPay.OrderBillCode = OrderBill.OrderBillCode
    WHERE OrderBill.isBillCleared=1 AND OrderBill.isMerged=0
    AND MultiPay.PaymentMode IN(1,2,3,4,6,7)
    $_GET['mselectperiod']

    GROUP BY
    YEAR(OrderBill.BillingDate)";

    $sqlResult = mysqli_query($conn,$sqlStr);
    $response = array();

    while($row = mysqli_fetch_assoc($sqlResult))
        array_push($response,$row);
    
    
    echo json_encode($response);
    mysqli_close($conn);
else
    echo "Host Connection Error";

?>

当我在浏览器中执行此 PHP 文件时,它可以正常工作,如下所示 Execution Result Of salegrowthratechartyear.php

现在谈到android,我通过创建一个接口来使用Retrofit库,如下所示

public interface ApiInterface 
    @GET("PHP_QRY_FILE_NAME")
    Call<List<Growth>> getGrowthInfo(@Path(value="PHP_QRY_FILE_NAME",encoded = true) String mPhpQryFileName);


那我调用如下

call = ChartApiClient.getApiClient().create(ApiInterface.class).getGrowthInfo("salesgrowthratechartyear.php);

上述方法也可以正常工作,但仅当我在 PHP 文件中删除 $_GET['mselectperiod'] 时。 当我想在我的界面中的那个 PHP 文件中使用 $_GET['mselectperiod'] 时,问题就来了,如下所示

public interface ApiInterface 
    @GET("PHP_QRY_FILE_NAME")
    Call<List<Growth>> getGrowthInfo(@Path(value="PHP_QRY_FILE_NAME",encoded = true) String mPhpQryFileName, @Query("mselectperiod") String mWhereClause);


那我调用如下

call = ChartApiClient.getApiClient().create(ApiInterface.class).getGrowthInfo("salesgrowthratechartyear.php",SalesGrowthChart.mFinalSelectPeriodQry);

请注意,“SalesGrowthChart.mFinalSelectPeriodQry”是一个变量,它接收如下变化的字符串值

"AND YEAR(BillingDate)>=2019 AND YEAR(BillingDate)

什么都没有发生。我错过了什么?

【问题讨论】:

【参考方案1】:

修改界面

public interface ApiInterface 
@GET("PHP_QRY_FILE_NAME")
Call<List<Growth>> getGrowthInfo(@Path(value="PHP_QRY_FILE_NAME",encoded = true) String mPhpQryFileName, @Query(value="mselectperiod",encoded = true) String mWhereClause);

我省略了 'Value=' 并且它应该被 编码为 true(,encoded = true)

然后在我的 PHP 文件中,我为 $_GET

进行了如下编辑

<?php
require dirname(__FILE__).'/../DbConnection/conn.php';

$mselectperiod = $_GET["mselectperiod"];

if($conn)
    $sqlStr = "SELECT
    YEAR(OrderBill.BillingDate) AS year,
    SUM(MultiPay.Amount) AS growth_rate
    FROM Rst_TblMultiPayModes MultiPay
    LEFT OUTER JOIN Rst_TblOrderBills OrderBill
    ON MultiPay.OrderBillCode = OrderBill.OrderBillCode
    WHERE OrderBill.isBillCleared=1 AND OrderBill.isMerged=0
    AND MultiPay.PaymentMode IN(1,2,3,4,6,7)
    $mselectperiod

    GROUP BY
    YEAR(OrderBill.BillingDate)";

    $sqlResult = mysqli_query($conn,$sqlStr);
    $response = array();

    while($row = mysqli_fetch_assoc($sqlResult))
        array_push($response,$row);
    
    
    echo json_encode($response);
    mysqli_close($conn);
else
    echo "Host Connection Error";

?>

而且效果很好。 . .

【讨论】:

以上是关于如何在android中使用改造@Query注解进行过滤的主要内容,如果未能解决你的问题,请参考以下文章

kotlin android中的改造请求@Part和@Query

如何在使用改造和 android jetpack 库时使用此动态 json 键创建数据类

【Android】Retrofit网络请求参数注解,@Path、@Query、@QueryMap...

如何在 Kotlin android 的改造中使用 enque 方法

如何在 android 中使用改造来解析这个 web 服务?

如何在 Android Studio 中使用改造来检索数据