gson 如何在改造中传递json体的请求参数?

iklwldmw  于 2023-01-13  发布在  其他
关注(0)|答案(2)|浏览(131)

如何在MainActivity的调用中为json类型参数设置请求参数?
这是我的接口类,其中有application/json类型的header注解,并使用post方法和use调用,其中使用具有param请求模型的body注解

public interface ApiStorePhotoInterface {
        @Headers("Content-Type: application/json")
        @POST("photo/st/v7")
        Call<PhotoStoreMainModel> getResponse(@Body ParamModel paramModel);
    }

这里ParamModel是json模型,并使用它进行调用。
接口中@Body的2个参数模型-此模型包含具有列表的值,其中ParamProductDetailModel是第二个模型。

public class ParamModel {

    @SerializedName("apiKey")
    @Expose
    private String apiKey;
    @SerializedName("affId")
    @Expose
    private String affId;
    @SerializedName("act")
    @Expose
    private String act;
    @SerializedName("latitude")
    @Expose
    private String latitude;
    @SerializedName("longitude")
    @Expose
    private String longitude;
    @SerializedName("devinf")
    @Expose
    private String devinf;
    @SerializedName("appver")
    @Expose
    private String appver;
    @SerializedName("productDetails")
    @Expose
    private List<ParamProductDetailModel> productDetails = null;

    public String getApiKey() {
        return apiKey;
    }

    public void setApiKey(String apiKey) {
        this.apiKey = apiKey;
    }

    public String getAffId() {
        return affId;
    }

    public void setAffId(String affId) {
        this.affId = affId;
    }

    public String getAct() {
        return act;
    }

    public void setAct(String act) {
        this.act = act;
    }

    public String getLatitude() {
        return latitude;
    }

    public void setLatitude(String latitude) {
        this.latitude = latitude;
    }

    public String getLongitude() {
        return longitude;
    }

    public void setLongitude(String longitude) {
        this.longitude = longitude;
    }

    public String getDevinf() {
        return devinf;
    }

    public void setDevinf(String devinf) {
        this.devinf = devinf;
    }

    public String getAppver() {
        return appver;
    }

    public void setAppver(String appver) {
        this.appver = appver;
    }

    public List<ParamProductDetailModel> getProductDetails() {
        return productDetails;
    }

    public void setProductDetails(List<ParamProductDetailModel> productDetails) {
        this.productDetails = productDetails;
    }

}

第二个参数模型-

public class ParamProductDetailModel  {

    @SerializedName("productId")
    @Expose
    private String productId;
    @SerializedName("qty")
    @Expose
    private String qty;

    public String getProductId() {
        return productId;
    }

    public void setProductId(String productId) {
        this.productId = productId;
    }

    public String getQty() {
        return qty;
    }

    public void setQty(String qty) {
        this.qty = qty;
    }

}

这是客户端类
客户类别-
这是改造生成器类

public class ApiStorePhotoClient {

    private static final String BASE_URL = "  https://services.something.com/api/";

    private static ApiStorePhotoInterface apiInterface;

    public static ApiStorePhotoInterface getApi() {
        if (apiInterface == null) {
            apiInterface = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build()
                    .create(ApiStorePhotoInterface.class);
        }
        return apiInterface;
    }
}

现在,在我的主课堂上-

ApiStorePhotoInterface apiInterface = ApiStorePhotoClient.getApi();

Call<PhotoStoreMainModel> call = apiInterface.getResponse("What to write here??");

如何在getResponse()中发送模型内部的请求?
PhotoStoreMainModel是响应模型。代码有3个响应模型,其中PhotoStoreMainModel是其中之一,2个请求参数模型,这是张贴在上面。
如何在getResponse()中发送主类内@body ParamModel中的请求参数?
如何在我的MainActivity类中设置呼叫线路?
I预期结果,但由于请求参数而无法命中API

dced5bon

dced5bon1#

可以像这样传递对象:

JSONObject jsonObject = new JSONObject();
   try {
     jsonObject.put("key1", "value1");
     jsonObject.put("key2", value2);

     JsonParser jsonParser = new JsonParser();

    ApiStorePhotoInterface apiInterface = ApiStorePhotoClient.getApi();

    **Call<PhotoStoreMainModel> call = apiInterface.getResponse((JsonObject) jsonParser.parse(jsonObject.toString()));  //This is not the correct way to parse the json. Not getting correct hit** 
    
    call.enqueue(new Callback<PhotoStoreMainModel>() {
                @Override
                public void onResponse(Call<PhotoStoreMainModel> call, Response<PhotoStoreMainModel> response) {
                 }

                @Override
                public void onFailure(Call<PhotoStoreMainModel> call, Throwable t) {
                    call.cancel();
                    t.printStackTrace();
                }
            });
            
    } catch (JSONException e) {
            e.printStackTrace();
    }
j2datikz

j2datikz2#

无需添加content type
像这样更改您的interface

public interface ApiStorePhotoInterface {

        @POST("photo/st/v7")
        Call<PhotoStoreMainModel> getResponse(@Body JsonObject obj);
    }

json object设置为:

JsonObject json = new JsonObject();
json.addProperty("affId", id_value)

//与上述所有参数相同
在getResponse中的对象中传递上述内容

相关问题