J'essaie d'écrire une demande HTTP Post codée en dur avec l'action SOAP, en utilisant l'api org.Apache.http. Mon problème est que je n'ai pas trouvé de moyen d'ajouter un corps de demande (dans mon cas - SOAP). Je serai heureux de vous donner quelques conseils.
import Java.net.URI;
import org.Apache.http.HttpResponse;
import org.Apache.http.client.HttpClient;
import org.Apache.http.client.methods.HttpPost;
import org.Apache.http.entity.StringEntity;
import org.Apache.http.impl.client.DefaultHttpClient;
import org.Apache.http.impl.client.RequestWrapper;
import org.Apache.http.protocol.HTTP;
public class HTTPRequest
{
@SuppressWarnings("unused")
public HTTPRequest()
{
try {
HttpClient httpclient = new DefaultHttpClient();
String body="DataDataData";
String bodyLength=new Integer(body.length()).toString();
System.out.println(bodyLength);
// StringEntity stringEntity=new StringEntity(body);
URI uri=new URI("SOMEURL?Param1=1234&Param2=abcd");
HttpPost httpPost = new HttpPost(uri);
httpPost.addHeader("Test", "Test_Value");
// httpPost.setEntity(stringEntity);
StringEntity entity = new StringEntity(body, "text/xml",HTTP.DEFAULT_CONTENT_CHARSET);
httpPost.setEntity(entity);
RequestWrapper requestWrapper=new RequestWrapper(httpPost);
requestWrapper.setMethod("POST");
requestWrapper.setHeader("LuckyNumber", "77");
requestWrapper.removeHeaders("Host");
requestWrapper.setHeader("Host", "GOD_IS_A_DJ");
// requestWrapper.setHeader("Content-Length",bodyLength);
HttpResponse response = httpclient.execute(requestWrapper);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Le soapAction doit être passé en tant que paramètre d'en-tête http - lorsqu'il est utilisé, il ne fait pas partie du http-body/payload.
Regardez ici un exemple avec Apache httpclient: http://svn.Apache.org/repos/asf/httpcomponents/oac.hc3x/trunk/src/examples/PostSOAP.Java
Ceci est un exemple de travail complet:
import org.Apache.http.HttpEntity;
import org.Apache.http.HttpResponse;
import org.Apache.http.client.HttpClient;
import org.Apache.http.client.methods.HttpPost;
import org.Apache.http.entity.StringEntity;
import org.Apache.http.impl.client.DefaultHttpClient;
import org.Apache.http.util.EntityUtils;
public void callWebService(String soapAction, String soapEnvBody) throws IOException {
// Create a StringEntity for the SOAP XML.
String body ="<?xml version=\"1.0\" encoding=\"UTF-8\"?><SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns1=\"http://example.com/v1.0/Records\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><SOAP-ENV:Body>"+soapEnvBody+"</SOAP-ENV:Body></SOAP-ENV:Envelope>";
StringEntity stringEntity = new StringEntity(body, "UTF-8");
stringEntity.setChunked(true);
// Request parameters and other properties.
HttpPost httpPost = new HttpPost("http://example.com?soapservice");
httpPost.setEntity(stringEntity);
httpPost.addHeader("Accept", "text/xml");
httpPost.addHeader("SOAPAction", soapAction);
// Execute and get the response.
HttpClient httpClient = new DefaultHttpClient();
HttpResponse response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
String strResponse = null;
if (entity != null) {
strResponse = EntityUtils.toString(entity);
}
}
... using org.Apache.http api. ...
Vous devez inclure SOAPAction
comme en-tête dans la demande. Comme vous disposez des poignées httpPost
et requestWrapper
, il existe trois façons d'ajouter l'en-tête.
1. httpPost.addHeader( "SOAPAction", strReferenceToSoapActionValue );
2. httpPost.setHeader( "SOAPAction", strReferenceToSoapActionValue );
3. requestWrapper.setHeader( "SOAPAction", strReferenceToSoapActionValue );
La seule différence est que addHeader
autorise plusieurs valeurs avec le même nom d'en-tête et setHeader
n'autorise que des noms d'en-tête uniques. setHeader(...
over remplace le premier en-tête du même nom.
Vous pouvez aller avec n'importe lequel de ces éléments selon vos besoins.
Il donnait 415 Code de réponse Http comme erreur,
J'ai donc ajouté
httppost.addHeader("Content-Type", "text/xml; charset=utf-8");
Tout va bien maintenant, Http: 200
Voici l'exemple que j'ai essayé et cela fonctionne pour moi:
Créez le fichier XML SoapRequestFile.xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header/>
<soapenv:Body>
<tem:GetConversionRate>
<!--Optional:-->
<tem:CurrencyFrom>USD</tem:CurrencyFrom>
<!--Optional:-->
<tem:CurrencyTo>INR</tem:CurrencyTo>
<tem:RateDate>2018-12-07</tem:RateDate>
</tem:GetConversionRate>
</soapenv:Body>
</soapenv:Envelope>
Et voici le code en Java:
import Java.io.File;
import Java.io.FileInputStream;
import org.Apache.http.client.methods.CloseableHttpResponse;
import org.Apache.http.client.methods.HttpPost;
import org.Apache.http.entity.InputStreamEntity;
import org.Apache.http.impl.client.CloseableHttpClient;
import org.Apache.http.impl.client.HttpClients;
import org.Apache.http.util.EntityUtils;
import org.junit.Assert;
import org.testng.annotations.Test;
import io.restassured.path.json.JsonPath;
import io.restassured.path.xml.XmlPath;
@Test
public void getMethod() throws Exception {
//wsdl file :http://currencyconverter.kowabunga.net/converter.asmx?wsdl
File soapRequestFile = new File(".\\SOAPRequest\\SoapRequestFile.xml");
CloseableHttpClient client = HttpClients.createDefault(); //create client
HttpPost request = new HttpPost("http://currencyconverter.kowabunga.net/converter.asmx"); //Create the request
request.addHeader("Content-Type", "text/xml"); //adding header
request.setEntity(new InputStreamEntity(new FileInputStream(soapRequestFile)));
CloseableHttpResponse response = client.execute(request);//Execute the command
int statusCode=response.getStatusLine().getStatusCode();//Get the status code and assert
System.out.println("Status code: " +statusCode );
Assert.assertEquals(200, statusCode);
String responseString = EntityUtils.toString(response.getEntity(),"UTF-8");//Getting the Response body
System.out.println(responseString);
XmlPath jsXpath= new XmlPath(responseString);//Converting string into xml path to assert
String rate=jsXpath.getString("GetConversionRateResult");
System.out.println("rate returned is: " + rate);
}
Le moyen le plus simple d'identifier ce qui doit être défini sur l'action soap lors de l'appel du service WCF via un client Java chargerait le wsdl, accédez au nom de l'opération correspondant au service. l'URI de l'action et définissez-le dans l'en-tête de l'action soap. Vous avez terminé.
par exemple: à partir de wsdl
<wsdl:operation name="MyOperation">
<wsdl:input wsaw:Action="http://tempuri.org/IMyService/MyOperation" message="tns:IMyService_MyOperation_InputMessage" />
<wsdl:output wsaw:Action="http://tempuri.org/IMyService/MyServiceResponse" message="tns:IMyService_MyOperation_OutputMessage" />
Maintenant, dans le code Java Java, nous devons définir l'action soap comme URI d'action.
//The rest of the httpPost object properties have not been shown for brevity
string actionURI='http://tempuri.org/IMyService/MyOperation';
httpPost.setHeader( "SOAPAction", actionURI);