我在写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异常。
蚂蚁指针感激不尽。
我从你的代码中观察到,实际上你是以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();
}
});
}