可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I would like to invoke a webservice via Android. I need to POST some XML to a URL via HTTP.
I found this snipped for sending a POST, but i dont know how to include/add the XML data itself.
public void postData() {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://10.10.4.35:53011/");
try {
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("Content-Type", "application/soap+xml"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Where/how to add the XML data?
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
}
This is the complete POST message that i need to imitate:
POST /a8103e90-f1e3-11dd-bfdb-8b1fcff1a110 HTTP/1.1
Host: 10.10.4.35:53011
Content-Type: application/soap+xml
Content-Length: 602
<?xml version='1.0' encoding='UTF-8' ?>
<s12:Envelope xmlns:s12="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
<s12:Header>
<wsa:MessageID>urn:uuid:fc061d40-3d63-11df-bfba-62764ccc0e48</wsa:MessageID>
<wsa:Action>http://schemas.xmlsoap.org/ws/2004/09/transfer/Get</wsa:Action>
<wsa:To>urn:uuid:a8103e90-f1e3-11dd-bfdb-8b1fcff1a110</wsa:To>
<wsa:ReplyTo>
<wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
</wsa:ReplyTo>
</s12:Header>
<s12:Body />
</s12:Envelope>
回答1:
- First, you can create a String template for this SOAP request and substitute user-supplied values at runtime in this template to create a valid request.
- Wrap this string in a StringEntity and set its content type as text/xml
- Set this entity in the SOAP request.
Something like:
HttpPost httppost = new HttpPost(SERVICE_EPR);
StringEntity se = new StringEntity(SOAPRequestXML,HTTP.UTF_8);
se.setContentType("text/xml");
httppost.setHeader("Content-Type","application/soap+xml;charset=UTF-8");
httppost.setEntity(se);
HttpClient httpclient = new DefaultHttpClient();
BasicHttpResponse httpResponse =
(BasicHttpResponse) httpclient.execute(httppost);
response.put("HTTPStatus",httpResponse.getStatusLine().toString());
回答2:
here the alternative to send soap msg.
public String setSoapMsg(String targetURL, String urlParameters){
URL url;
HttpURLConnection connection = null;
try {
//Create connection
url = new URL(targetURL);
// for not trusted site (https)
// _FakeX509TrustManager.allowAllSSL();
// System.setProperty("javax.net.debug","all");
connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("SOAPAction", "**** SOAP ACTION VALUE HERE ****");
connection.setUseCaches (false);
connection.setDoInput(true);
connection.setDoOutput(true);
//Send request
DataOutputStream wr = new DataOutputStream (
connection.getOutputStream ());
wr.writeBytes (urlParameters);
wr.flush ();
wr.close ();
//Get Response
InputStream is ;
Log.i("response", "code="+connection.getResponseCode());
if(connection.getResponseCode()<=400){
is=connection.getInputStream();
}else{
/* error from server */
is = connection.getErrorStream();
}
// is= connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
StringBuffer response = new StringBuffer();
while((line = rd.readLine()) != null) {
response.append(line);
response.append('\r');
}
rd.close();
Log.i("response", ""+response.toString());
return response.toString();
} catch (Exception e) {
Log.e("error https", "", e);
return null;
} finally {
if(connection != null) {
connection.disconnect();
}
}
}
hope it helps. if anyone wonder allowAllSSL()
method, google it :).
回答3:
So if you use:
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
It is still rest, but if you use:
StringEntity se = new StringEntity(SOAPRequestXML,HTTP.UTF_8);
httppost.setEntity(se);
It is soap???
回答4:
Example sending XML to WS via http POST.
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://foo/service1.asmx/GetUID");
//XML example to send via Web Service.
StringBuilder sb = new StringBuilder();
sb.append("<myXML><Parametro><name>IdApp</name><value>1234567890</value></Parameter>");
sb.append("<Parameter><name>UID1</name><value>abc12421</value></Parameter>");
sb.append("</myXML>");
httppost.addHeader("Accept", "text/xml");
httppost.addHeader("Content-Type", "application/x-www-form-urlencoded");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("myxml", sb.toString());//WS Parameter and Value
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
回答5:
Here's my code for sending HTML....
You can see the data is the nameValuePairs.add(...)
HttpClient httpclient = new DefaultHttpClient();
// Your URL
HttpPost httppost = new HttpPost("http://192.71.100.21:8000");
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
// Your DATA
nameValuePairs.add(new BasicNameValuePair("id", "12345"));
nameValuePairs.add(new BasicNameValuePair("stringdata","AndDev is Cool!"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response;
response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
回答6:
I had to send some XML via HTTP Post on Android too.
String xml = "xml-block";
StringEntity se = new StringEntity(xml,"UTF-8");
se.setContentType("application/atom+xml");
HttpPost postRequest = new HttpPost("http://some.url");
postRequest.setEntity(se);
Hope it works!
回答7:
here, the code snippets of code, that I am using for posting xml in SOAP services and in return getting Inputstream from web.
private InputStream call(String soapAction, String xml) throws IOException {
byte[] requestData = xml.getBytes("UTF-8");
URL url = new URL(URL);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Accept-Charset", "UTF-8");
// connection.setRequestProperty("Accept-Encoding","gzip,deflate");
connection.setRequestProperty("Content-Type", "text/xml; UTF-8");
connection.setRequestProperty("SOAPAction", soapAction);
connection.setRequestProperty("User-Agent", "android");
connection.setRequestProperty("Host",
"base_urlforwebservices like - xyz.net");
// connection
// .setRequestProperty("Content-Length", "" + requestData.length);
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setDoInput(true);
os = connection.getOutputStream();
os.write(requestData, 0, requestData.length);
os.flush();
os.close();
is = connection.getInputStream();
return is; // inputStream
}
Here xml: is the built xml request used to call services.
Have fun;
回答8:
Another way of doing it is by using Apache Call. Api URL, Action URI and API Body needs to be provided
InputStream input = new ByteArrayInputStream(apiBody.getBytes());
Service service = new Service();
Call call = (Call) service.createCall();
SOAPEnvelope soapEnvelope = new SOAPEnvelope(input);
call.setTargetEndpointAddress(new URL(apiUrl));
call.setUseSOAPAction(true);
if(StringUtils.isNotEmpty(actionURI)){
call.setSOAPActionURI(actionURI);
}
soapEnvelope = call.invoke(soapEnvelope);
return soapEnvelope.toString();
回答9:
Using OkHTTP it is simple to
String soap_string = "soap string";
public static final MediaType SOAP_MEDIA_TYPE = MediaType.parse("application/xml");
final OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.create(SOAP_MEDIA_TYPE, soap_string);
final Request request = new Request.Builder()
.url("Your URL")
.post(body)
.addHeader("Content-Type", "application/xml")
.addHeader("Authorization", "Your Token")
.addHeader("cache-control", "no-cache")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
String mMessage = e.getMessage().toString();
Log.w("failure Response", mMessage);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String mMessage = response.body().string();
//code = response.code();
getResponse(mMessage, response);
}
});
Read full tutorial here - https://www.studytutorial.in/android-sending-xml-or-soap-rest-api-request-using-okhttp-tutorial