无法从retrofit2打入perl端点。

问题描述 投票:0回答:1

我在写retfoit2客户端代码时被卡住了,在服务器上打一些很老的perl传统代码。

服务器上的perl代码

my $CFG = do "config.pl";
my $db_handle = DBI->connect ("DBI:mysql:$CFG->{database}", $CFG->{user}, $CFG->{password},  { RaiseError => 1 } );

my $cgi = CGI->new;
my $decdata = decode_json($cgi->param('POSTDATA'));
my $type = $decdata->{'Type'};

if ($type eq "ADD"){
    my $ProductID = $decdata->{'ProductID'};
    my $VariantID = $decdata->{'VariantID'};
    my $MRP = $decdata->{'MRP'};
    my $SellPrice = $decdata->{'SellPrice'};
    my $barCode = $decdata->{'barCode'};

    my $sql_query = qq (insert into table_product_varients values (?, ?, ?, ?, ?, NULL, 1, NOW(), NOW()));
    my $statement = $db_handle->prepare ($sql_query);
    $statement->execute($ProductID, $VariantID, $barCode, $MRP, $SellPrice);
}
elsif ($type eq "UPDATE"){
    my $ProductID = $decdata->{'ProductID'};
    my $VariantID = $decdata->{'VariantID'};
    my $MRP = $decdata->{'MRP'};
    my $SellPrice = $decdata->{'SellPrice'};
    my $barCode = $decdata->{'barCode'};

    my $sql_query = qq (UPDATE table_product_varients set product_mrp = ?, product_sellprice = ?, barcode = ? WHERE product_id = ? and varient_id = ?);
    my $statement = $db_handle->prepare ($sql_query);
    $statement->execute($MRP, $SellPrice, $barCode, $ProductID, $VariantID);
}

改装代码

@FormUrlEncoded
@POST("cgi-bin/ProductVariantQuery.pl")
public Call<String> updateProductVariant(@Field("POSTDATA") String jsonObject);


JSONObject jsonObject = new JSONObject();
try {
    jsonObject.put("Type", "UPDATE");
    jsonObject.put("ProductID", ProductID);
    jsonObject.put("VariantID", VariantID);
    jsonObject.put("MRP", mrp.toString());
    jsonObject.put("SellPrice", sellPrice.toString());
} catch (JSONException e) {
    e.printStackTrace();
}


Call<String> call =  restInterface.updateProductVariant(jsonObject.toString());

call.enqueue(new Callback<String>() {
    @Override
    public void onResponse(Call<String> call , Response<String> response) {
        //APIResponse apiResponse = response.body();
        //Utility.displayToast(apiResponse.getMessage());
        Utility.displayToast("Updated!");
        productVariant.setMRP(mrp);
        productVariant.setSellPrice(sellPrice);
        notifyDataSetChanged();
    }

    @Override
    public void onFailure(Call<String> call , Throwable t) {

        //loading.dismiss();
        Utility.displayToast("some error");
    }
});

我试着做了一些改动,但看到的都是错误。

用上面的代码,我得到JAVAEOF异常。

蚂蚁指针感激不尽。

android perl retrofit2
1个回答
0
投票

我从你的代码中观察到,实际上你是以json的形式请求数据(发送post param),但你是以Field的形式请求的,所以你需要用下面的代码来改变它。

import com.google.gson.annotations.SerializedName;
public class JsonRequestParent {

    @SerializedName("POSTDATA")
    private JsonChild jsonChild;

    public JsonRequestParent(JsonChild jsonChild) {
        this.jsonChild = jsonChild;
    }
}

/其他子参数类

import com.google.gson.annotations.SerializedName;
public class JsonChild {

    @SerializedName("Type")
    private String type;

    @SerializedName("ProductID")
    private int productID;

    @SerializedName("VariantID")
    private int VariantID;

    @SerializedName("MRP")
    private String MRP;

    @SerializedName("SellPrice")
    private String SellPrice;


    public JsonChild(String type, int productID, int variantID, String MRP, String sellPrice) {
        this.type = type;
        this.productID = productID;
        VariantID = variantID;
        this.MRP = MRP;
        SellPrice = sellPrice;
    }
}

并最终打入api

 @POST("cgi-bin/ProductVariantQuery.pl")
    public Call<APIResponse> updateProductVariant(@Body JsonRequestParent jsonRequestParent);

/像下面这样调用来直接获取解析数据,不要忘了在改造设置中设置.addConverterFactory(gsonFactory)

void hitAi(){
    Call<APIResponse> call =  restInterface.updateProductVariant(createRequest());

    call.enqueue(new Callback<APIResponse>() {
        @Override
        public void onResponse(Call<APIResponse> call , Response<APIResponse> response) {

            if (response.isSuccessful()){
                // do whatever you want to do 
            }else {
                //error
                response.errorBody();
            }
        }

        @Override
        public void onFailure(Call<APIResponse> call , Throwable t) {
            t.getLocalizedMessage()
            //loading.dismiss();
        }
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.