【问题标题】:Retrofit, Gson, parse data to server from app custom jsonfile改造,Gson,从应用程序自定义 jsonfile 解析数据到服务器
【发布时间】:2018-12-07 09:20:56
【问题描述】:

我正在尝试使用改造来使用 REST API 将带有 Gson 的自定义 json 数据解析到 localhost 服务器。

这是我正在寻找的结果 json:

{
"user_id": 2,
"product": {
    "id": 15,
    "item_count": 99
    }
}

下面是我创建的界面

public interface APIService {

@POST("/products")

@FormUrlEncoded
Call<Product> savePost(@Header("Token")String authKey,
                    @Field("product") Object product,
                    @Field("userId") String userId);
}

这是我用来发送数据的函数

// string that i use to call the classes

        String userID;
        String authKey;

        mAPIService = ApiUtils.getAPIService();
        mProduct = new Product();
        mProduct.setId(productID);
        mProduct.setItemCount(numberOfItems.getText().toString().trim());
        final String stringMProduct = mProduct.toString();

        sendPost(userID, stringMProduct, authKey);

// the function that parses all the data

public void sendPost( String userID, String product, String authKey ) {
    mAPIService.savePost(authKey, userID, product).enqueue(new Callback<Product>() {

        @Override
        public void onResponse(Call<Product> call, retrofit2.Response<Product> response) {
            if(response.isSuccessful()) {
                showResponse(response.body().toString());
                Log.i(TAG, "post submitted to API." + response.body().toString());
            }
        }

        @Override
        public void onFailure(Call<Product> call, Throwable t) {
            Log.e(TAG, "Unable to submit post to API.");
        }
    });
}

这是我使用 Gson 将数据解析为 json 的类

public class OrderRequest {

     @SerializedName("product")
     @Expose
     private Product product;
     @SerializedName("user_id")
     @Expose
     private String userId;

     public Product getProduct() {
         return product;
     }

     public void setProduct(Product product) {
         this.product = product;
     }

     public String getUserId() {
         return userId;
     }

     public void setUserId(String userId) {
         this.userId = userId;
     }

     @Override

     public String toString() {
         return "OrderRequest{" +
                 "product=" + product +
                 ", userId='" + userId + '\'' +
        '}';
    }
}

另一个 Gcode 类。

Public class Product {

    @SerializedName("item_count")
    @Expose
    private String itemCount;
    @SerializedName("id")
    @Expose
    private String id;

    public String getItemCount() {
        return itemCount;
    }

    public void setItemCount(String itemCount) {
        this.itemCount = itemCount;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Product{" +
                "itemCount='" + itemCount + '\'' +
                ", id='" + id + '\'' +
                '}';
    }
}

这是我用来将数据解析到服务器的所有代码,我真的很困惑我应该如何调试它或有效负载在哪里,我知道这是一个代码转储,这是不允许的。我最困惑的一点是使costom post请求成为可以在数组中包含数组的位

【问题讨论】:

  • 这段代码到底有什么问题?
  • 问题是数据没有发布,我认为我对数据的解析错误,但我知道如何作弊
  • onFailure() 方法中将Log.e(TAG, "Unable to submit post to API."); 更改为Log.e(TAG, t); 并尝试将数据从客户端发送到服务器。如果发送数据失败,你会得到错误日志(失败的原因)。只需edit 问题并在此处发布该错误日志。或使用 Postman 客户端测试该 API 并确认。

标签: android json gson retrofit2


【解决方案1】:

对于数组和其他类型的数据,您可以在 requestBody 内发送数据,在服务器端,您可以轻松地将其映射到您正在创建的 POJO 类到 POJO 类,这与您发送的 POJO 类相同。

【讨论】:

  • 我正在使用需要 json 的 larvel 后端,所以我认为这是不可能的 :)
  • 他实际上是在告诉你做正确的事。你只是不明白。
【解决方案2】:

首先,您要改造的网址是什么?似乎您将其设置为..“http://something.com/something”。 Retrofit 要求您使用的 url 应该以“/”结尾。我可以说是因为您的发布方法是“/products”。那么,如果您正确设置网址,则为“http://something.com/something//products

不仅如此。 @formURLEncoded 不能与 post 方法一起使用。有了那个@field,它也会而且应该也能工作..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多