Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Résumé
Cet article explique comment résoudre les problèmes d’une API basée sur SOAP qui retourne des erreurs HTTP 404 et HTTP 500 dans Gestion des API Azure.
Cet article correspond au deuxième scénario du laboratoire de la série de dépannage Gestion des API Azure. Veillez à suivre les instructions de configuration du labo en fonction des instructions de la série de résolution des problèmes de gestion des API.
Version du produit d’origine : service Gestion des API
Numéro de base de connaissances d’origine : 4464934
Symptômes
L’API Calculatrice trouvée à l’adresse http://www.dneonline.com/calculator.asmx effectue quatre opérations : Ajouter, Soustraire, Multiplier et Diviser, en fonction de deux paramètres d’entrée : intA et intB. Cette API utilise un service basé sur des fichiers ASMX qui utilise le protocole SOAP (Simple Object Access Protocol) 1.1 afin que les paramètres d’entrée soient transmis dans le corps de l’enveloppe SOAP.
Dans ce scénario, les opérations Ajouter et soustraire fonctionnent comme prévu, mais vous rencontrez des erreurs HTTP 404 lors de l’exécution d’une opération De multiplication et des erreurs HTTP 500 lors de l’exécution d’une opération de division .
La sortie attendue d’une opération De multiplication doit ressembler à l’exemple suivant :
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<MultiplyResponse xmlns="http://tempuri.org/">
<MultiplyResult>int</MultiplyResult>
</MultiplyResponse>
</soap:Body>
</soap:Envelope>
La sortie attendue d’une opération de division doit ressembler à l’exemple suivant :
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<DivideResponse xmlns="http://tempuri.org/">
<DivideResult>int</DivideResult>
</DivideResponse>
</soap:Body>
</soap:Envelope>
Résolution des problèmes
Pour déterminer les causes des réponses HTTP 404 et HTTP 500 (qu’il s’agisse de gestion des API ou de l’API SOAP principale), collectez une trace de l’inspecteur gestion des API pour inspecter la demande et la réponse.
Si plusieurs opérations provoquent des erreurs HTTP 404 ou HTTP 500 , cela indique que le serveur d’origine ne peut pas trouver de représentation actuelle pour la ressource cible ou qu’il n’est pas en mesure de divulguer celui-ci.
Lorsque vous examinez la section back-end d’une trace d’inspecteur gestion des API, la même observation est évidente à partir du message, comme illustré dans l’exemple suivant :
{
"backend": [
{
"source": "configuration",
"timestamp": "2018-07-29T12:30:08.3500317Z",
"elapsed": "00:00:00.7276962",
"data": {
"message": "Unable to identify Api or Operation for this request. Responding to the caller with 404 Resource Not Found."
}
}
]
}
Vous devez d’abord examiner l’URL de requête et les en-têtes envoyés de Gestion des API à l’API back-end à partir de Test et les comparer avec un exemple de requête SOAP pour l’opération De multiplication que vous avez effectuée à l’adresse http://www.dneonline.com/calculator.asmx.
Les en-têtes de requête d’une trace de l’inspecteur API Management se présentent comme dans l’exemple suivant :
{
"data": {
"request": {
"method": "POST",
"url": "https://pratyay.azure-api.net/calc",
"headers": [
{
"name": "Ocp-Apim-Subscription-Key",
"value": "34ae22db7f2c4c5da7b74a55adf03223"
},
{
"name": "X-Forwarded-For",
"value": "223.226.79.35"
},
{
"name": "Cache-Control",
"value": "no-cache"
},
{
"name": "Connection",
"value": "Keep-Alive"
},
{
"name": "Content-Length",
"value": "292"
},
{
"name": "Content-Type",
"value": "application/soap+xml; action=http://tempuri.org/Multiply"
},
{
"name": "Accept",
"value": "*/*"
},
{
"name": "Accept-Encoding",
"value": "gzip,deflate,br"
},
{
"name": "Accept-Language",
"value": "en-US,en;q=0.5"
},
{
"name": "Host",
"value": "pratyay.azure-api.net"
},
{
"name": "Referer",
"value": "https://apimanagement.hosting.portal.azure.net/apimanagement/Content/1.0.385.3/apimap/apimap-apis/index.html?locale=en&trustedAuthority=https://ms.portal.azure.com"
}
]
}
}
}
La requête SOAP 1.1 a besoin d’un en-tête SOAPAction de requête manquant dans la requête initiale envoyée par Gestion des API, comme indiqué dans l’exemple suivant :
Host: www.dneonline.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/Multiply"
L’ajout de l’en-tête SOAPAction avec la valeur http://tempuri.org/Multiply résout le problème. Ajoutez l’en-tête de requête sous la Frontend définition de l’opération Multiplier , puis définissez la valeur comme valeur par défaut dans l’onglet En-têtes . Vous n’avez plus besoin d’envoyer cette valeur d’en-tête pour chaque requête.
Une opération de division provoquant des erreurs HTTP 500 (erreur de serveur interne) indique que le serveur a rencontré une condition inattendue qui l’a empêché de répondre à la demande. Cette condition signifie que le service principal ne peut pas traiter votre corps de requête envoyé à partir de Gestion des API.
Vous pouvez maintenant examiner le corps de la demande envoyé à partir de Gestion des API. Le dénominateur (intB) est défini sur zéro, ce qui entraîne une exception non gérée. Cette condition est la cause de l’erreur HTTP 500 (erreur de serveur interne).
L’exemple suivant montre le corps de la requête envoyé depuis la trace de l’inspecteur API Management pour une opération Divide :
POST calc HTTP/1.1
Host: pratyay.azure-api.net
SOAPAction: http://tempuri.org/Divide
Cache-Control: no-cache
Ocp-Apim-Trace: true
Content-Type: application/soap+xml; action=http://tempuri.org/Divide
Ocp-Apim-Subscription-Key: ********************************
<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns="http://www.w3.org/2003/05/soap-envelope">
<Body>
<Divide xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/">
<intA>1</intA>
<intB>0</intB>
</Divide>
</Body>
</Envelope>
Lorsque vous vérifiez la représentation du contenu de la requête dans l’onglet Requête figurant dans la définition Frontend de l’opération Divide, vous pouvez voir que la valeur intB est définie à zéro. Remplacez la valeur de intB par une valeur non nulle. Cette modification doit résoudre le problème.