L'envoi de message SOAP par Procuration en Java
J'ai besoin de savoir comment configurer un Proxy et confirmer qu'il fonctionne.
J'ai fait un programme de test qui ressemble à ceci:
Où vous pouvez spécifier une adresse de proxy et le numéro de port.
(J'ai trouvé l'adresse et le port sur:
http://www.freeproxylists.net/)
Le SAVON d'appel est à la recherche de ce genre quand "Utiliser un Proxy" est cochée:
Socket socket = new Socket();
SocketAddress sockaddr = new InetSocketAddress(PROXY_ADDRESS, PROXY_PORT);
socket.connect(sockaddr, 10000);
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(socket.getInetAddress(), PROXY_PORT));
URL url = new URL(urlStr);
HttpURLConnection uc = (HttpURLConnection) url.openConnection(proxy);
return connection.call(message, uc);
Problème ici est que la dernière ligne SOAPConnection.call(..)
dose permettent pas HttpURLConnection
comme entrée et donne ainsi:
Mauvais point de terminaison de type
Aucune idée de comment ajouter une adresse de proxy à un appel SOAP et vérifier que le proxy est en cours d'utilisation?
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.URL;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
public class TestProxy implements ActionListener {
public JTextField proxyField;
public JTextField portField;
public JCheckBox useProxy;
//GUI
public TestProxy() {
JFrame f = new JFrame("Proxy tester");
f.getContentPane().setLayout(new BoxLayout(f.getContentPane(), BoxLayout.Y_AXIS));
proxyField = new JTextField("103.247.43.218");
portField = new JTextField("8081");
useProxy = new JCheckBox("Use Proxy");
JButton b = new JButton("Connect!");
b.addActionListener(this);
f.getContentPane().add(proxyField);
f.getContentPane().add(portField);
f.getContentPane().add(useProxy);
f.getContentPane().add(b);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
//ACTION
@Override
public void actionPerformed(ActionEvent e) {
SOAPMessage response = null;
try {
SOAPMessage msg = createSOAPRequest();
String urlStr = "http://www.webservicex.net/CurrencyConvertor.asmx?WSDL";
response = sendSOAPMessage(msg, urlStr);
} catch (MalformedURLException e1) {
e1.printStackTrace();
} catch (SOAPException e1) {
e1.printStackTrace();
} catch (Exception e2) {
e2.printStackTrace();
}
if (response == null)
JOptionPane.showMessageDialog(null, "Null returned...");
else
JOptionPane.showMessageDialog(null, "Returned response!!!");
}
//SOAP CALL
public SOAPMessage sendSOAPMessage(SOAPMessage message, String urlStr) throws SOAPException, MalformedURLException {
String PROXY_ADDRESS = proxyField.getText();
int PROXY_PORT = Integer.parseInt(portField.getText());
try {
SOAPConnectionFactory factory = SOAPConnectionFactory.newInstance();
SOAPConnection connection = factory.createConnection();
if (useProxy.isSelected()) {
Socket socket = new Socket();
SocketAddress sockaddr = new InetSocketAddress(PROXY_ADDRESS, PROXY_PORT);
socket.connect(sockaddr, 10000);
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(socket.getInetAddress(), PROXY_PORT));
URL url = new URL(urlStr);
HttpURLConnection uc = (HttpURLConnection) url.openConnection(proxy);
//This "call" is not allowed!!
return connection.call(message, uc);
} else {
return connection.call(message, urlStr);
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
//SOAP MESSAGE
private static SOAPMessage createSOAPRequest() throws Exception {
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
return soapMessage;
}
public static void main(String[] args) {
new TestProxy();
}
}
OriginalL'auteur Grains | 2014-01-28
Vous devez vous connecter pour publier un commentaire.
De travail sendSOAPMessage méthode que l'utilisation de proxy:
connection
utilisé.Oh, et deux variables différentes appelé
url
. Ce qui fait que mon mal à la tête.OriginalL'auteur Grains
Vous pouvez utiliser Java
Proxy
classe - plus de détails ici. En essence, vous pouvez essayez si votreProxy
adresse estreachable
ou pas. Dans le cas où c'est que vous pouvez établir unURL
de connexion (connexion HTTP, comme indiqué ci-dessous, ou de votre propre protocole - comme le SAVON)EDIT:
À l'aide de
SocketAddress
essayer d'utiliser la valeur du portDans l'exemple ci-dessus, vous établissez une connexion proxy et de vérifier si le
InetAddress
est accessible ou pas. Si oui, vous allez de l'avant et à l'utilisation de votre proxy pour établir une connexion http.EDIT: Depuis
isReachable()
'crédibilité est douteuse, vous pouvez essayer d'attraper les exceptions et immeuble de votre propreboolean
drapeau, travail exemple ci-dessous.Ici, vous essayez de la connexion de la
proxy
à l'aide de son adresse et de port parSocket
de connexion et d'intercepter les exceptions. J'ai testé les deux exemples avec mon propre serveur proxy et cela fonctionne, c'est très certainement échoue pour laIP
mentionné dans l'exemple.De sortie (avec un proxy valide l'adresse/port):
oui, il peut être inaccessible en raison de diverses raisons. Vous pourriez vouloir essayer avec l'augmentation de la valeur de délai d'expiration - plus de détails ici. J'ai essayé de faire la démonstration que le proxy est accessible à l'aide de cette approche, mais vous pouvez travailler autour de trop, la capture des différentes exceptions.
Ok. Ma conjecture est que j'ai besoin de spécifier le port aussi. Mais il semble comme une "InetAddress" je ne peux pas prendre des numéros de port?
Regardez les modifier ci-dessus, vous pouvez consommer Port par
SocketAddress
classe. Je tire laInetAddress
de lui, mais dans le cas où vous obtenez toujours un faux, se débarrasser de l'extrême isRechable vérifier et il suffit de prendre unSocketTimeoutException
Ok. Encore des faux dont je ne sais pas comment le résoudre. Modifié la question avec un exemple de code à la place.
OriginalL'auteur PopoFibo