【问题标题】:Retrofit 2 send object with POST改造 2 使用 POST 发送对象
【发布时间】:2016-10-03 15:27:51
【问题描述】:

我是 Retrofit Library 的新手,我想知道为什么用 post 方法发送一个对象更好。

这是一些代码。

我的班级:

public class ExampleClass implements Serializable {

    @SerializedName("id")
    int id;


    @SerializedName("name")
    String name;

    public ExampleClass(int id, String name) {
        this.id = id;
        this.name= name;
    }

}

我的界面:

public interface ApiInterface {
    @Headers("Content-Type: application/json")
    @POST("getclass/")
    Call<ExampleClass> getExampleClass(@Body ExampleClass exampleClass);
}

我的改装电话:

......
        ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
        Call<ExampleClass> call = apiService.getExampleClass(exampleClass);
        call.enqueue(new Callback<ExampleClass>() {
            @Override
            public void onResponse(Call<ExampleClass> call, Response<ExampleClass> response) {

                int statusCode = response.code();

                Log.i(TAG, "Status Code: " + statusCode);

            }

            @Override
            public void onFailure(Call<ExampleClass> call, Throwable t) {
                Log.i(TAG, "Error: " + t.toString());
            }

        });

但每次它返回我的状态码 500。

有人可以给我一个想法来发送一个经过改造的对象吗?

【问题讨论】:

  • 请添加堆栈跟踪
  • 请同时添加您的 adb 日志。
  • 您是否在改造实例中添加了 Gson 或 Jackson 转换器?
  • 我还将 Gson 转换器添加到我的改造实例中......

标签: android retrofit2


【解决方案1】:

您可以在@FormUrlEncoded 的帮助下发送它,例如:

@FormUrlEncoded
@Headers("Content-Type: application/json")
@POST("getclass/")
Call<ExampleClass> getExampleClass(@Field("id") int id, @Field("name") String name);

但我认为你的方法是最简单和正确的。

如果你不偷懒,你可以找到关于改造的所有信息here

【讨论】:

    【解决方案2】:

    500 内部服务器错误

    500 状态代码或内部服务器错误表示服务器由于未知原因无法处理请求。有时,当更具体的 5xx 错误更合适时,会出现此代码。

    此错误的最常见原因是服务器配置错误(例如,格式错误的 .htaccess 文件)或缺少软件包(例如,在未正确安装 PHP 的情况下尝试执行 PHP 文件)。

    您可以查看它。它对我来说很好用

    Api接口类

    public interface ApiInterface {
    
        @FormUrlEncoded
            @POST("/billingrest/save")
            Call<LoginError> sendProductList(@Body SaveBill saveBill);
    
    }
    

    SaveBill 模型

    package com.example.dev.billingsoftware.model;
    
    import com.google.gson.annotations.Expose;
    import com.google.gson.annotations.SerializedName;
    
    import java.util.List;
    
    /**
     * Created by dev on 4/8/17.
     */
    public class SaveBill {
    
        @SerializedName("customer_name")
        @Expose
        private String customerName;
        @SerializedName("customer_id")
        @Expose
        private String customerId;
        @SerializedName("bill_number")
        @Expose
        private String billNumber;
        @SerializedName("mobile_number")
        @Expose
        private String mobileNumber;
        @SerializedName("bill_date")
        @Expose
        private String billDate;
        @SerializedName("address")
        @Expose
        private String address;
        @SerializedName("count")
        @Expose
        private String count;
        @SerializedName("data")
        @Expose
        private List<BillData> data = null;
    
        public String getCustomerName() {
            return customerName;
        }
    
        public void setCustomerName(String customerName) {
            this.customerName = customerName;
        }
    
        public String getCustomerId() {
            return customerId;
        }
    
        public void setCustomerId(String customerId) {
            this.customerId = customerId;
        }
    
        public String getBillNumber() {
            return billNumber;
        }
    
        public void setBillNumber(String billNumber) {
            this.billNumber = billNumber;
        }
    
        public String getMobileNumber() {
            return mobileNumber;
        }
    
        public void setMobileNumber(String mobileNumber) {
            this.mobileNumber = mobileNumber;
        }
    
        public String getBillDate() {
            return billDate;
        }
    
        public void setBillDate(String billDate) {
            this.billDate = billDate;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        public String getCount() {
            return count;
        }
    
        public void setCount(String count) {
            this.count = count;
        }
    
        public List<BillData> getData() {
            return data;
        }
    
        public void setData(List<BillData> data) {
            this.data = data;
        }
    
    }
    

    【讨论】:

      【解决方案3】:
      1. 您的 API 服务器是否正常工作?

        HTTP status 500 means internal server error。首先使用可靠的客户端测试您的 API 服务器。查看服务器上的错误日志,确定是哪一方导致了问题。

      2. 您是否在改造实例中添加了 Gson 或 Jackson 转换器?

        如果你的服务器是通畅的,那么客户端,你的应用就有问题。格式错误的请求正文可能导致服务器错误。

        您是否添加了 Gson(或 Jackson)转换器?您的 @Headers 注释不会自动将您的对象转换为 json。如果您的服务器需要 json 请求,则您发送的不是“对象”,而是对象的 json 表示字符串。不需要实现Serializable 接口。 Gson转换器会自动将任意对象转换为json,如果你添加它,你必须使用RequestBody

        来自Retrofit github page (REQUEST BODY section)

        如果不添加转换器,则只能使用RequestBody

      【讨论】:

        猜你喜欢
        • 2018-07-05
        • 1970-01-01
        • 2019-06-14
        • 2021-08-20
        • 2016-03-07
        • 1970-01-01
        • 2014-02-07
        • 1970-01-01
        相关资源
        最近更新 更多