【问题标题】:@POST array with retrofit带有改造的@POST 数组
【发布时间】:2016-12-17 14:08:10
【问题描述】:

我在发送@POST 请求方面需要帮助。现在我的 post 方法如下所示:

@FormUrlEncoded

    @POST("/api/mobile/{language}/{apiVersion}/beacons/try-save-settings")
    void trySaveBeaconParams(@Field("beacon_id") long beaconId,
                             @Field("password") String password,
                             @Field("ib[turn_on]") int turn_on,
                             @Field("ib[minor]") int minor ,
                             @Field("ib[major]") int major ,
                             @Field("ib[tx_power]") int tx_power ,
                             @Field("ib[interval]") int interval,
                             @Field("ib[secure_uuid]") int secure_uuid,
                             @Field("euid[turn_on]") int euid_turn_on,
                             @Field("euid[interval]") int euid_interval,
                             @Field("euid[tx_power]") int euid_tx_power,
                             @Field("euid[namespace]") String euid_namespace,
                             @Field("euid[instance]") String euid_instance,
                             @Field("eeid[turn_on]") int eeid_turn_on,
                             @Field("eeid[interval]") int eeid_interval,
                             @Field("eeid[tx_power]") int eeid_tx_power,
                             @Field("eurl[turn_on]") int eurl_turn_on,
                             @Field("eurl[interval]") int eurl_interval,
                             @Field("eurl[tx_power]") int eurl_tx_power,
                             @Field("eurl[url]") String eurl_url,
                             @Field("etlm[turn_on]") int etlm_turn_on,
                             @Field("etlm[interval]") int etlm_interval,
                             @Field("etlm[tx_power]") int etlm_tx_power,
                             @Field ("sleep_modes[]") List<SleepMode> model,
                             Callback<BasicResponse<Object>> callback);

问题出在数组 sleep_mode 上。当我按照我写的方式发送它时,我正在发送这样的数据:

虽然我需要以这样的格式发送:

我尝试用@Body 来做,但当时没有用。有什么帮助吗?提前致谢。 我的 SleepMode.class :

@Table(name = "SleepMode")
public class SleepMode {

    @Column
    @Expose
    @SerializedName("turn_on")
    public int turn_on;
    @Column
    @Expose
    @SerializedName("time_from")
    public String time_from;
    @Column
    @Expose
    @SerializedName("time_to")
    public String time_to;

--------------- 编辑,带有“@BODY”的版本------------ -------------

@POST("/api/mobile/{language}/{apiVersion}/beacons/try-save-settings")
    void trySaveBeaconParams(
            @Body EonBeaconModel model,

            Callback<BasicResponse<Object>> callback);

EonBeacon.class

@Table(name = "eonBeacon")
public class EonBeaconModel extends Model {
    @Column(unique = true, onUniqueConflict = Column.ConflictAction.REPLACE, index = true)
    public long beacon_id;
    @Column
    public long bridge_id;
    @Column
    public long mesh_id;
    @Column
    public String name;
    @Column
    public String location;
    @Column
    public String mac_address;
    @Column
    public String firmware;
    @Column
    public String pcb_revision;
    @Column
    public int battery_level;
    @Column
    public String password;
    @Column
    public String assigned_bridge_id;

    @Column(name="Eeid")
    public Eeid eeid;
    @Column(name="Etlm")
    public Etlm etlm;
    @Column
    public Euid euid;
    @Column(name="Eurl")
    public Eurl eurl;
    @Column(name="Ib")
    public IbModel ibBeaconModel;
    @Column
    public String jsonIB;
    @Column
    public String jsonEeid;
    @Column
    public String jsonEtlm;
    @Column
    public String jsonEuid;
    @Column
    public String jsonEurl;
    @Column
    public boolean isBeacon;
    @Column(name="sleep_modes")
    public List<SleepMode> sleep_modes;
    @Column
    public String jsonSleep;

这就是我创建回调的方式:

@Subscribe
    public void validateNewBeaconData(ValidateNewBeaconDataCommand command) {
        Callback<BasicResponse<Object>> callback = new Callback<BasicResponse<Object>>() {
            @Override
            public void success(BasicResponse<Object> basicResponse, Response response) {
                if (ResponseStatus.SUCCESS.statusCode == basicResponse.status) {
                    EventBus.post(new BeaconsSettingsValidatedEvent());
                    Log.e(TAG, "success: ");
                }
                else {
                    EventBus.post(new NetworkFailureEvent(ResponseStatus.getByStatus(basicResponse.status), basicResponse.status_msg));
                    Log.e(TAG, "failure validate: " );

                }
            }

            @Override
            public void failure(RetrofitError error) {
                EventBus.post(new NetworkFailureEvent(ResponseStatus.NETWORK_ERROR, messageString));
                Log.e(TAG, "failure: " + error.getCause() );

            }
        };
        service.trySaveBeaconParams(command.model
                ,
             callback);


    }

验证类:

public class ValidateNewBeaconDataCommand extends ApiCommand {
   public EonBeaconModel model;


    public ValidateNewBeaconDataCommand(EonBeaconModel model) {

       this.model=model;
    }
}

这就是我创建请求的方式:

EventBus.post(new ValidateNewBeaconDataCommand(beaconModel));

感谢和抱歉这么多代码:)

【问题讨论】:

  • 也发布你的睡眠模式课程
  • @Nas 我已将其添加到帖子中。

标签: android post retrofit


【解决方案1】:
instead of Field use FieldMap

@FieldMap Map<String, String> model;

put your data with your key("sleep_mode[0]") in map

【讨论】:

  • 你的意思是:@FieldMap List> 模型,?
  • @FieldMap 参数类型必须是地图
  • 然后 @Field ("sleep_modes[]") List> 模型将为您工作
  • 完成:@FieldMap Map 字段,然后:Map fields = new HashMap(); for (int i = 0; i
  • 是的:)谢谢!
【解决方案2】:

您应该尝试使用类似的 @Body 注释

@FormUrlEncoded
@POST("/api/mobile/{language}/{apiVersion}/beacons/try-save-settings")
void trySaveBeaconParams(@Body BodyRequest request);

并使用您的所有参数创建一个 BodyRequest 类:

class BodyRequest {
  long beaconId;
  String password;
  // ....
}

【讨论】:

  • 我按照你的建议做了,但现在应用程序没有向 API 发送任何内容;/如果你愿意,我可以编辑我的帖子。
  • 我编辑了帖子:)
  • 你的方法上还有@FormUrlEncoded 吗?
  • 不,我没有。我不得不删除它,因为它导致了异常
  • 哪个例外?
【解决方案3】:

这样做

@FormUrlEncoded
@POST("/api/mobile/{language}/{apiVersion}/beacons/try-save-settings")
void trySaveBeaconParams(@Body HashMap<String, Object> map);

然后你可以把任何东西作为值放在那个地图中

HashMap<String, Object> map = new HashMap<String, Object>();
map.put("beacon_id" ,beaconId);
map.put("beacon_id" ,beaconId);
map.put("password" , password);
map.put("ib[turn_on]" , turn_on);
map.put("ib[minor]" , minor);
map.put("ib[major]" , major); 

您甚至可以在该地图中添加列表或数组

【讨论】:

  • 感谢您的帮助,但是当我创建 map 时,请向其中添加字段,因为您建议服务器在每个字段中返回 null。没有发送任何内容:/
  • in void trySaveBeaconParams(@Body HashMap map);而不是“Body”尝试使用“FieldMap”
  • 同样的问题:/
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 2018-11-25
  • 2020-02-25
  • 1970-01-01
  • 2018-02-09
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多