2017-02-14 10 views
2

Я пытаюсь отправить данные, которые будут отображаться в таком виде:Как отправить вложенные данные json в форме POJO в мультиформатной модификации?

{ 
    "id": , 
    "venue": { 
     "id": , 
     "name": "", 
     "city": "", 
     "address": "", 
     "rating": null, 
     "point": null 
    }, 
    "name": "", 
    "time": "", 
    "event_pic": null, 
    "description": "", 
    "event_type": "Movie", 
    "invite_only": , 
    "free": , 
    "age_restriction": , 
    "ticket_price": , 
    "user": 
} 

Я сделал интерфейс, как это с помощью модификации:

@Multipart 
    @POST("api/events/") 
    Observable<Event> postEvent(
      @Part("venue") Venue venue, 
      @Part("event_pic") RequestBody image, 
      @Part("name") RequestBody name, 
      @Part("description") RequestBody description, 
      @Part("time") RequestBody date, 
      @Part("event_type") RequestBody type, 
      @Part("invite_only") RequestBody isInviteOnly, 
      @Part("age_restriction") RequestBody isAgeRestricted, 
      @Part("free") RequestBody isFree, 
      @Part("ticket_price") RequestBody ticketPrice 

    ); 

И размещен с помощью rxjava так:

public void postEvent() { 
     postEventUseCase.setAgeRestricted(ageRestricted); 
     postEventUseCase.setDate(date); 
     postEventUseCase.setFree(free); 
     postEventUseCase.setInviteOnly(inviteOnly); 
     postEventUseCase.setDescription(description); 
     postEventUseCase.setName(name); 
     postEventUseCase.setPath(path); 
     postEventUseCase.setTicketprice(ticketprice); 
     postEventUseCase.setType(type); 
     postEventUseCase.setVenue(venue); 

     subscription = postEventUseCase.execute().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(); 


    } 

Однако, когда я пытаюсь отправить его, я получаю эту ошибку: 02-14 16: 21: 26,468 7133-7762/com.wyat.wyat D/OkHttp: < - 400 Bad

Request http://zacmwa.pythonanywhere.com/api/events/ (7417ms) 
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: Server: openresty/1.9.15.1 
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: Date: Tue, 14 Feb 2017 13:21:26 GMT 
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: Content-Type: application/json 
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: Transfer-Encoding: chunked 
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: Connection: keep-alive 
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: Vary: Accept 
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: X-Frame-Options: SAMEORIGIN 
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: Allow: GET, POST, OPTIONS 
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: {"venue":["This field is required."]} 
    02-14 16:21:26.468 7133-7762/com.wyat.wyat D/OkHttp: <-- END HTTP (37-byte body) 

EDIT:

Однако ведение журнала показывает, что место создано:

02-14 16:21:18.620 7133-7762/com.wyat.wyat D/OkHttp: Content- Disposition: form-data; name="venue" 
02-14 16:21:18.620 7133-7762/com.wyat.wyat D/OkHttp: Content-Transfer-Encoding: binary 
02-14 16:21:18.620 7133-7762/com.wyat.wyat D/OkHttp: Content-Type: application/json; charset=UTF-8 
02-14 16:21:18.620 7133-7762/com.wyat.wyat D/OkHttp: Content-Length: 59 
02-14 16:21:18.620 7133-7762/com.wyat.wyat D/OkHttp: {"address":"ersysaj","city":"ahgsagya","name":"hdyfjfnfjf"} 

Как разместить данные? Я сделал это успешно с другими средствами, поэтому я знаю, что проблема не в бэкэнде. Что вызывает ошибку?

Местом POJO, как это:

public class Venue { 

    @SerializedName("name") 
    @Expose 
    private String name; 
    @SerializedName("city") 
    @Expose 
    private String city; 
    @SerializedName("address") 
    @Expose 
    private String address; 
    @SerializedName("rating") 
    @Expose 
    private Double rating; 



    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Venue withName(String name) { 
     this.name = name; 
     return this; 
    } 

    public String getCity() { 
     return city; 
    } 

    public void setCity(String city) { 
     this.city = city; 
    } 


    public String getAddress() { 
     return address; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 


    public double getRating() { 
     return rating; 
    } 

    public void setRating(double rating) { 
     this.rating = rating; 
    } 



} 
+0

{ «выставки»: [ «Это поле является обязательным.»]} –

+0

@ZiedRebhi у меня есть добавлены журналы, показывающие, что место встречи создано. – zacmwa

ответ

0
@Headers("Content-Type: application/json; charset=utf-8") 
@POST("api/events/") 
Call<ResponseBody> events(@Body String body); 

отправить JSON в теле

Решение 2:

MultipartBody.Part typedFile = MultipartBody.Part.createFormData("event_pic",imagefile.getName(),RequestBody.create(MediaType.parse("image"), imagefile)); 

String jsonString=""venue": { "id": , "name": "", "city": "", "address": "", "rating": null, "point": null }"; 
RequestBody venue = RequestBody.create(okhttp3.MediaType.parse("application/json‌​; charset=utf-8"),jsonString); 

     @POST("api/events/") 
    Observable<Event> postEvent(
      @Part("venue") RequestBody body, 
      @Part MultipartBody.Part image, 
      @Part("name") RequestBody name, 
      @Part("description") RequestBody description, 
      @Part("time") RequestBody date, 
      @Part("event_type") RequestBody type, 
      @Part("invite_only") RequestBody isInviteOnly, 
      @Part("age_restriction") RequestBody isAgeRestricted, 
      @Part("free") RequestBody isFree, 
      @Part("ticket_price") RequestBody ticketPrice 

    ); 
+0

Я не могу этого сделать, потому что я размещаю данные в формате multipart. – zacmwa

+0

Затем сделать что-то вроде этого Струнный jsonString = "" Место ": { "ID": "имя" : "", "город": "", "адрес": "", " рейтинг ": null, " point ": null }"; RequestBody body = RequestBody.create (okhttp3.MediaType.parse ("application/json; charset = utf-8"), jsonString); –

+0

это тоже не работает. – zacmwa

1

вы можете отправить его в качестве пользовательского объекта вы можете сделать в своем приложении, что будет лучше полей

и может сделать это, как этот

@POST("api/events/") 
Call<ResponseBody> events(@Body CustomObject obj); 

и ваш объект может сделать вложенными из всего, что вы хотите

+0

Как насчет изображения? – zacmwa

+0

вы можете увидеть этот ответ http: // stackoverflow.com/a/34562971/3553843 – Sattar

+0

В этом примере нет аннотации Part, в которой вы отправите класс POJO для вложенного json, который я прошу. – zacmwa