Android経由でWebサービスを呼び出したいです。 POST HTTP経由でURLにXMLを追加する必要があります。POSTを送信するためにこれを省略しましたが、XMLデータ自体を含める/追加する方法がわかりません。
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
}
}
これは、完全なPOSTメッセージを模倣する必要があります:
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>
何かのようなもの:
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());
ここでは、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();
}
}
}
それが役に立てば幸い。誰かがallowAllSSL()
メソッドを不思議に思うなら、グーグルで検索してください:)。
だからあなたが使用する場合:
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
それはまだ休みですが、使用する場合:
StringEntity se = new StringEntity(SOAPRequestXML,HTTP.UTF_8);
httppost.setEntity(se);
石鹸です???
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);
HTMLを送信するためのコードは次のとおりです。データが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();
}
ここでは、SOAPサービスでxmlをポストし、代わりにWebからInputstreamを取得するために使用しているコードのコードスニペットです。
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
}
ここでxml:は、サービスを呼び出すために使用されるビルドされたxmlリクエストです。
楽しむ;
AndroidもHTTPポスト経由でXMLを送信する必要がありました。
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);
うまくいくことを願っています!
OkHTTPを使用すると簡単です
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);
}
});
ここで完全なチュートリアルを読む- https://www.studytutorial.in/Android-sending-xml-or-soap-rest-api-request-using-okhttp-tutorial
別の方法は、 Apache Call を使用することです。 API URL、アクションURI、およびAPIボディを提供する必要があります
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();