2017-06-01 5 views
-1

Ich verweise diese SO Thread aber nicht in der Lage, richtige API-Anfrage zu generieren. api Anfrage ist als untennicht in der Lage, ganze JSON als Body-Parameter in Api Retrofit senden 2

Anfrage:

{ 
    "clientId": "[email protected]", 
    "products": { 
    "productNumber": "8123456789123", 
    "batchNumber": "123456789", 
    "quantity": 50, 
    "salesPrice": 500, 
    "purchasePrice": 500, 
    "MRP": 600, 
    "mfgDate": "15/05/2017", 
    "expDate": "15/05/2017" 
    } 
} 

Api Schnittstelle

@FormUrlEncoded 
@POST("/products/addBatch") 
public Observable<AddBatchResponse> doAddBatch(@Header(WebServicesTags.TAG_AUTHORIZATION) String token, 
               @Field(WebServicesTags.TAG_CLIENT_ID) String clientId, 
               @Body BatchModel product); 

und finden meine Api Anruf

BatchModel model = new BatchModel(productNumber, batchNumber, quantity, salesPrice, purchasePrice, mRP, mfgDate, expDate); 
Observable<AddBatchResponse> addBatch = apiservice.doAddBatch(sessionManager.getKeyToken(), sessionManager.getKeyEmail(), model); 
     addBatch.subscribeOn(Schedulers.newThread()) 

nennen diese api zeigt mir unter Fehler

java.lang.IllegalArgumentException: @Body Parameter können nicht mit Form oder mehrteilige Codierung verwendet werden.

+0

remove @FormUrlEncoded von Api-Schnittstelle –

+0

dann zeigt es @Field-Parameter können nur mit Formularcodierung verwendet werden. –

+0

Fügen Sie dann clientId in der JSON-Modellklasse hinzu und verwenden Sie @HEADER zum Senden des Header-Werts. Endlich sieht Ihre Schnittstelle wie folgt aus: public Observable doAddBatch (@Body BatchModel product); –

Antwort

1

Sie können entweder mit @FormUrlEncoded oder @Body verwenden @Field .. Sie können nicht beide bei einer gleichzeitig verwenden

so etwas wie

Do
@POST("/products/addBatch") 
public Observable<AddBatchResponse> doAddBatch(@Header(WebServicesTags.TAG_AUTHORIZATION) String token, 
              @Body HashMap<String, Object> map); 

und während Buchungsdaten eine Karte erstellen

Übergeben Sie diese Karte als body-Parameter zum Aufruf der API Ich hoffe, dass dies Ihr Problem lösen wird

+0

Vielen Dank. es hat den Trick gemacht. –