2017-08-03 4 views
0

Je souhaite appeler une API (@POST) qui utilise des données XML. Et je ne sais pas exactement comment l'envoyer '-'. J'ai appris à faire avec JSON, mais différent avec XMLUtilisation de la retrofit avec des données XML

je recherche comme 3/4 jours et je ne pouvais pas trouver une solution qui convient pour moi:/

Voici la demande que je dois envoyer :

<qosFeatureData xmlns:qos="urn:oma:xml:rest:netapi:qos:1"> 
<clientCorrelator>v1234</clientCorrelator> 
<predefinedQosFeatureId>Pred_Coca</predefinedQosFeatureId> 
<media> 
    <mediaNumber>1</mediaNumber> 
    <mediaType>Other</mediaType> 
    <ipFlow> 
     <flowNumber>1</flowNumber> 
     <flowDescription> 
       <direction>Downlink</direction> 
       <protocol>6</protocol> 
       <otherPartyIpAddress> 
       <ipV4Address>X.X.X.X</ipV4Address> 
      </otherPartyIpAddress> 
       <otherPartyPortNumber> 
       <port>XX</port> 
       </otherPartyPortNumber> 
       <userIpAddress> 
       <ipV4Address>Y.Y.Y.Y</ipV4Address> ????? 
       </userIpAddress> 
     </flowDescription> 
     <flowDescription> 
       <direction>Uplink</direction> 
       <protocol>6</protocol> 
       <otherPartyIpAddress> 
       <ipV4Address>X.X.X.X</ipV4Address> 
       </otherPartyIpAddress> 
       <otherPartyPortNumber> 
       <port>XX</port> 
       </otherPartyPortNumber> 
       <userIpAddress> 
       <ipV4Address>Y.Y.Y.Y</ipV4Address> ????? 
       </userIpAddress> 
     </flowDescription> 
     <flowStatus>Enabled</flowStatus> 
    </ipFlow> 
    <flowStatus>Enabled</flowStatus> 
</media> 

je l'ai déjà mis en place le code pour l'appel « post » (avec rien dedans) et je suis une réponse (pas une bonne réponse: 500, mais je pense qu'il est à cause de mon données qui ne sont pas envoyées)

Voici mon code d'interface

public interface ApiHttpPost { 

@Headers({"Content-Type: application/xml; charset=utf-8"}) 
@POST("confidential") 
Call<qosFeature> getqosFeature (@Header("Authorization") String authHeader); 

}

Voici ma principale activité

private void AppelHttpPost() { 
    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl("CONFIDENTIAL") 
      .client(getUnsafeOkHttpClient()) 
      .addConverterFactory(SimpleXmlConverterFactory.create()) 
      .build(); 

    ApiHttpPost service = retrofit.create(ApiHttpPost.class); 

    String userName = "CONFIDENTIAL"; 
    String passWord = "CONFIDENTIAL"; 
    String base = userName + ":" + passWord; 

    String authHeader = "Basic " + Base64.encodeToString(base.getBytes(), Base64.NO_WRAP); 

    Call<qosFeature> qosFeatureCall = service.getqosFeature(authHeader); 

    qosFeatureCall.enqueue(new Callback<qosFeature>() { 
     @Override 
     public void onResponse(Call<qosFeature> call, Response<qosFeature> response) { 
      int statusCode = response.code(); 
      qosFeature qosFeature = response.body(); 
      Log.d(TAG, "onResponse: " + statusCode); 
     } 

     @Override 
     public void onFailure(Call<qosFeature> call, Throwable t) { 
      Log.d(TAG, "onFailure: " + t.getMessage()); 
     } 
    }); 
} 

Thx pour votre aide: s

EDIT: Je reviens à demander à nouveau votre aide, la solution proposée par Potapov Anton ne travailler dans mon cas. Sur le studio Android, en mode debug je vois quelque chose de bien! (Capture d'écran)

enter image description here

Mais quand je regarde sur Wireshark ce n'est pas bon, il y a la chaîne/chaîne que je ne veux pas + xml ne semble pas bien (Capture d'écran)

enter image description here

Donc, toute autre idée d'envoyer des données XML? : x Thx

Répondre

0

Vous pouvez simplement envoyer votre code XML sous forme de texte, n'est-ce pas?

public interface ApiHttpPost { 

@Headers({"Content-Type: application/xml; charset=utf-8"}) 
@POST("confidential") 
Call<qosFeature> getqosFeature (@Header("Authorization") String authHeader, @Body String body); 
} 
+0

Mais ne i besoin de créer un "corps" de classe et l'appeler pour pouvoir l'utiliser ici? –

+0

Vous n'avez pas besoin de créer d'autres classes. Il suffit de le passer comme une ficelle dans le corps param. Il a type String. –

+0

Donc, dans mon activité principale, je dois ajouter quelque chose comme ça: String body = "tout le XML demande ici" Et appelez-le dans: service.getqosFeature (authHeader, corps) Droit? –

0

Ok les gars j'ai trouvé la solution exacte de mon problème.

Le problème avec la solution ci-dessus était, en envoyant les données XML en tant que type de chaîne, ce que je ne veux pas.

donc j'ai trouvé cette réponse sur un autre fil, je l'applique et ça a marché '-' (création d'un objet avec l'application de type/xml)

ici le fil: https://stackoverflow.com/a/33738730/8342943