2016-12-14 47 views
1

我需要发送@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。当我把它作为我写了我要送的数据是这样的:RESPONSE_UNCORRECT

当我需要的格式传送这样的:

enter image description here

我试着用@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); 


    } 

Validate类:

public class ValidateNewBeaconDataCommand extends ApiCommand { 
    public EonBeaconModel model; 


    public ValidateNewBeaconDataCommand(EonBeaconModel model) { 

     this.model=model; 
    } 
} 

,这是我如何创建请求:

EventBus.post(新ValidateNewBeaconDataCommand(beaconModel));

感谢和这么多的代码:)

+0

发表您的睡眠模式类太 – Nas

+0

@Nas我把它添加到里面的列表或数组该职位。 – Bartos

回答

1
instead of Field use FieldMap 

@FieldMap Map<String, String> model; 

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

你的意思是:@FieldMap List > model,? – Bartos

+0

是的,试试看你得到了什么。 – Nas

+0

@FieldMap参数类型必须是Map < - 不能发送地图列表 – Bartos

1

你应该尝试@Body标注有类似的东西

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

,并创建一个BodyRequest类所有的参数遗憾:

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

我做了你的建议,但现在的应用程序不发送任何内容的API; /如果你愿意,我可以编辑自己的帖子。 – Bartos

+0

是的请编辑您的帖子,我们会看到的。 – Yoleth

+0

我eddited后:) – Bartos

1

像这样做

@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); 

值,你甚至可以添加地图

+0

感谢您的帮助,但是当我创建地图时,如您所建议的那样向其添加字段服务器在每个字段返回空值。什么都没有发送:/ – Bartos

+0

in void trySaveBeaconParams(@Body HashMap map);而不是“身体”尝试使用“FieldMap” –

+0

相同的问题:/ – Bartos