Appels SOAP via un proxy SOCKS en Java


J'ai une situation où je communique avec un fournisseur via les services REST. Au sein de notre organisation, il y a des pare-feu à gogo, et faire ce genre de chose nécessite l'utilisation d'une configuration de proxy spécifique SOCKS.
Notez qu'il doit s'agir de ce proxy SOCKS; un proxy HTTP ne fonctionnera pas dans notre environnement.
Une fois les configurations de proxy effectuées, la connexion via le proxy est gérée avec une relative facilité en utilisant le code ci-dessous:

URL url = new URL("https://url.for.the.web.service.com");
Proxy proxy = new Proxy(Proxy.Type.SOCKS,new InetSocketAddress("our.socks.proxy.server.com",1080));
HttpsURLConnection con = (HttpsURLConnection)url.openConnection(proxy);

J'ai reçu un supplément exigence de joindre à certains services Web supplémentaires pour le fournisseur. Malheureusement, ce sont des traitements plus anciens pour le fournisseur et sont effectués en tant que services SOAP.
Bien que je sois vieux et grisonné, c'est ma première course côté client SOAP. En utilisant l'aide que j'ai déjà obtenue de votre site (merci pour le site btw; je l'utilise tout le temps pour référence, y compris pour passer à travers l'implémentation REST et le premier tour de SOCKS au printemps dernier), j'ai pu obtenir mes SOAP classes proxy générées par Eclipse. Mais lorsque j'essaie d'exécuter le code généré pour accéder à un service que m'exécuter directement dans le pare-feu, car il n'est pas spécifié dans le code généré.

Je l'ai parcouru et je pense avoir identifié la classe générée où mes modifications doivent aller, c'est-à-dire la classe WSDLName_Locator étendue à partir du service de classe client Axis. Bien que je puisse trouver un objet URL pour l'emplacement WSDL dans le code généré, il n'y a pas d'ouverture équivalente d'une connexion à que je peux joindre mon proxy SOCKS. La manipulation descend dans les entrailles de la manipulation de l'axe et je ne sais pas quoi. Il peut également être dans le BasicHttpBinding_IWSDLNameStub.

J'ai googlé et regardé Javadoc pour chaque classe utilisée dans ce code généré, à la recherche de références à proxy et je viens vide. Mais cela est compliqué par le fait que dans la langue vernaculaire SOAP, le code généré lui-même s'appelle un proxy, donc j'obtiens un grand nombre de faux positifs sur toute recherche que j'essaie, et aussi par le fait que toutes les informations les plus récentes en ligne semblent se rapporter au développement d'applications Android, ce que je ne fais pas. Les classes AxisEngine et AxisEngineConfiguration semblent prometteuses, mais je n'ai pas non plus trouvé de moyen de connecter un proxy là-bas.

Mon besoin est simplement le suivant: où et comment dans ce code SOAP généré puis-je faire la pièce jointe équivalente au proxy, de sorte que cette liaison soit transportée dans la gestion de l'axe? Mon espoir est que quelqu'un a fait cela avant.

Je n'ai inclus aucun du code généré parce que j'aurais besoin de l'obscurcir au-delà de la capacité de fonctionner de toute façon, c'est volumineux car il couvre un certain nombre de services, et mon hypothèse est que la sortie générée est similaire d'une génération WSDL à la suivante. Mais je fournirai tout détail supplémentaire requis.

Merci d'avance pour toute aide que vous pouvez fournir.

Author: S1LENT WARRIOR, 2014-10-20

1 answers

J'ai essayé de googler à nouveau pour voir si ma question viendrait dans les résultats... et oui, à droite en haut. Mais aussi retourné était un lien vers cette question:

Appelez le service Web SOAP à l'aide des paramètres proxy Windows dans Java

Dans cette réponse, les techniques de définition des valeurs de proxy en tant que propriété système sont affichées, bien que la question concerne l'utilisation d'une autre classe, ProxySelector, que je soupçonne d'être la raison pour laquelle mes recherches étaient vides. Je n'avais pas essayé cette technique parce que cela n'avait pas fonctionné pour définir le proxy SOCKS lorsque je faisais la partie REPOS au printemps dernier.

En spécifiant simplement:

    System.setProperty("socksProxyHost","our.socks.proxy.server.com");
    System.setProperty("socksProxyPort","1080");

Avant d'appeler l'appel de service Web était tout ce qui était nécessaire.

J'ai donc répondu à ma propre question... Je gagne des points pour ça, non?

 1
Author: dan.brunton, 2017-05-23 12:20:29