2017-08-04 2 views
0

Comment puis-je envoyer cette demande dans le corps de ma demande de volley, merci à l'avanceComment envoyer des objets JSON imbriqués dans un corps de demande

{ 
    "amount": "000", 
    "card": { 
    "number": "00000", 
    "expiry_month": "00", 
    "expiry_year": "00", 
    "cvv": "000", 
    "pin": "000" 
    } 
} 

c'est mes paramètres de la requête, j'ai essayer l'api est me dire parametes invalide, s'il vous plaît aidez-moi guzs

@Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      Map<String, String> headers = new HashMap<String, String>(); 
      headers.put("Authorization", User_Token); 
      headers.put("Content-Type", "application/json"); 
      return headers; 
     } 

     @Override 
     public String getBodyContentType() { 
      return "application/json"; 
     } 



     @Override 
     public byte[] getBody() { 
      Map<String, String> params = new HashMap<String, String>(); 
      params.put("amount", amount); 
      params.put("card", String.valueOf(come())); 

      return new JSONObject(params).toString().getBytes(); 
     } 
     private byte[] come() { 
      Map<String, String> params = new HashMap<String, String>(); 
      params.put("number", number); 
      params.put("expiry_month", month); 
      params.put("expiry_year", year); 
      params.put("cvv", cvv); 
      params.put("pin", pin); 
      return new JSONObject(params).toString().getBytes(); 
     } 
+0

API qui vous Spécifiez donne une erreur? C'est la réponse du serveur ou quoi? Également spécifier une erreur elle-même – j2ko

+0

réponse du serveur, l'erreur était paramètres non valides –

+0

la réponse signifie simplement que l'api ne peut pas comprendre ma demande, je veux un meilleur format pour mon code pls –

Répondre

0

utilisation JsonObject au lieu de: la création d'un Map, convertissant en Byte[] puis obtenir son String.valueOf(...). Cela vous permettra d'envoyer votre objet complet en tant que corps de la demande, au lieu du corps incomplet qui est envoyé en ce moment: {"amount":"000","card":"[[email protected]"})

Le problème avec la valeur qui est envoyée pour "card": "[[email protected]" est qu'il est pas une représentation de votre objet avec ses propriétés. Au lieu de cela, il s'agit uniquement de l'adresse mémoire de la matrice d'octets que vous avez créée.

Dans votre code, utilisez JsonObject pour vos objets et seulement faire la conversion en Byte[] à la fin de la méthode getBody(), puisque c'est l'endroit où vous revenez enfin votre objet complet:

@Override 
public Map<String, String> getHeaders() throws AuthFailureError { 
    Map<String, String> headers = new HashMap<String, String>(); 
    headers.put("Authorization", User_Token); 
    // headers.put("Content-Type", "application/json"); // This is probably redundant, as you are already setting it on getBodyContentType() 
    return headers; 
} 

@Override 
public String getBodyContentType() { 
    return "application/json"; 
} 

@Override 
public byte[] getBody() { 
    JSONObject jsonObject = new JSONObject(); 
    try { 
     jsonObject.put("amount", amount); 
     jsonObject.put("card", come()); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    return jsonObject.toString().getBytes(); 
} 

private JSONObject come() throws JSONException { 
    JSONObject params = new JSONObject(); 
    params.put("number", number); 
    params.put("expiry_month", month); 
    params.put("expiry_year", year); 
    params.put("cvv", cvv); 
    params.put("pin", pin); 
    return params; 
} 
+0

il retourne la même erreur, pls –

+0

Avez-vous essayé de faire la demande à votre service en utilisant postier, curl ou un autre outil? – spuente

+0

Suis en utilisant postmn, ça marche parfaitement sur le facteur, l'autre guz écrit le web est fait. C'est le lien https //: api.myflex. ng/wallet/fund –

0

Si vous Vous avez besoin du format exact dont vous avez besoin pour vous assurer que les valeurs number, month etc. sont passées en tant que chaînes mais pas entières. Aussi, pour rendre le code plus court et moins destructeur, vous pouvez enchaîner put appels. Voici une version un peu remaniée:

@Override 
public byte[] getBody() { 
    try { 
     final JSONObject card = new JSONObject() 
       .put("number", String.valueOf(number)) 
       .put("expiry_month", String.valueOf(month)) 
       .put("expiry_year", String.valueOf(year)) 
       .put("cvv", String.valueOf(cvv)) 
       .put("pin", String.valueOf(pin)); 

     return new JSONObject() 
       .put("amount", String.valueOf(amount)) 
       .put("card", card) 
       .toString() 
       .getBytes();  
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    //Empty json return will not help us as in this case 
    //we will send useless empty body to the server. 
    return null; 
} 

Je ne sais pas ce que sur le côté de l'appelant de getBody() se passe et si oui ou non vous êtes en mesure de modifier ce code. Mais vous devez en quelque sorte suivre ce retour null ou à la place introduire votre propre classe d'exception qui devrait être vérifiée sur getBody() côté de l'appelant. Mais au cas où vous avez aucun contrôle sur getBody() côté de l'appelant, vous avez besoin de retour une non null, retour à vide:

return new byte[0]; 
+0

il donne la même erreur "paramètres invalides" pls m'aider –

+0

Le code que j'ai fourni devrait générer l'objet JSON avec la même structure que vous avez demandé. Si le serveur répond avec des "paramètres invalides", comment pouvons-nous vous aider sans savoir ce que le serveur attend et que ne pas? – j2ko

+0

Ceci est le lien api https //: api.myflex.ng/wallet/fund –