我想将此作为XML发送到我的Web服务。我该怎么做?
<dmi:ShipNoticeRequest xmlns:dmi="http://portal.suppliesnet.net">
<dmi:RequesterISA>xxxxxxxxxx</dmi:RequesterISA>
<dmi:ShipDateRange>
<dmi:ShipDateFrom>2009-09-09</dmi: ShipDateFrom>
<dmi:ShipDateTo>2009-09-10</dmi: ShipDateTo>
</dmi: ShipDateRange >
</dmi:ShipNoticeRequest>
我的Web服务方法需要此类请求消息:
POST /ShipNotice/WebServiceShipNotice.asmx HTTP/1.1
Host: portal.suppliesnet.net
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://portal.suppliesnet.net/RequestShipmentNoticeXML"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<RequestShipmentNoticeXML xmlns="http://portal.suppliesnet.net">
<ShipNoticeRequestNode>xml</ShipNoticeRequestNode>
</RequestShipmentNoticeXML>
</soap:Body>
</soap:Envelope>
我正在尝试这种方法,但是会出现未知错误你能弄清楚这段代码有什么问题吗?
try {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory
.newDocumentBuilder();
Document document = documentBuilder.newDocument();
Element rootElement = document.createElement("soap:Envelope");
rootElement.setAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
rootElement.setAttribute("xmlns:xsd","http://www.w3.org/2001/XMLSchema");
rootElement.setAttribute("xmlns:soap", "http://schemas.xmlsoap.org/soap/envelope/");
document.appendChild(rootElement);
Element SoapBody = document.createElement("soap:Body");
rootElement.appendChild(SoapBody);
Element RequestShipmentNoticeXML = document.createElement("RequestShipmentNoticeXML");
RequestShipmentNoticeXML.setAttribute("xmlns","http://portal.suppliesnet.net");
SoapBody.appendChild(RequestShipmentNoticeXML);
Element ShipmentNoticeRequestNode = document.createElement("ShipNoticeRequestNode");
RequestShipmentNoticeXML.appendChild(ShipmentNoticeRequestNode);
Element shipNoticeRequest = document.createElement("dmi:ShipNoticeRequest");
shipNoticeRequest.setAttribute("xmlns:dmi", "http://portal.suppliesnet.net");
ShipmentNoticeRequestNode.appendChild(shipNoticeRequest);
Element ContactElement = document.createElement("dmi:RequesterISA");
shipNoticeRequest.appendChild(ContactElement);
ContactElement.appendChild(document.createTextNode("XXXXXX"));
// 1969-12-31
Element articleElement = document.createElement("dmi:ShipDateRange");
Element ShipDateFrom = document.createElement("dmi:ShipDateFrom");
articleElement.appendChild(ShipDateFrom);
ShipDateFrom.appendChild(document.createTextNode("2012-07-06"));
Element ShipDateTo = document.createElement("dmi:ShipDateTo");
articleElement.appendChild(ShipDateTo);
ShipDateTo.appendChild(document.createTextNode("2012-07-06"));
shipNoticeRequest.appendChild(articleElement);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
Properties outFormat = new Properties();
outFormat.setProperty(OutputKeys.INDENT, "yes");
outFormat.setProperty(OutputKeys.METHOD, "xml");
outFormat.setProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
outFormat.setProperty(OutputKeys.VERSION, "1.0");
outFormat.setProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperties(outFormat);
DOMSource domSource = new DOMSource(document.getDocumentElement());
OutputStream output = new ByteArrayOutputStream();
StreamResult result = new StreamResult(output);
transformer.transform(domSource, result);
xmlString = output.toString();
} catch (ParserConfigurationException e) {
} catch (TransformerConfigurationException e) {
} catch (TransformerException e) {
}
SoapObject request = new SoapObject(namespace, methodName);
request.addProperty("RequestShipmentNoticeXMl",xmlString);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
// envelope.headerIn.
final HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.debug = true;
try {
androidHttpTransport.call(Soap_Action, envelope);
//androidHttpTransport.
SoapObject SoapResult = (SoapObject)envelope.bodyIn;
tv.setText("Status" + SoapResult);
} catch (Exception ex) {
ex.printStackTrace();
Log.e("static", "Exception in making call to server");
}
答案 0 :(得分:2)
您想发送SOAP消息,而Android没有直接支持发送这类消息。你可以试试KSOAP2-android等第三方库 每个SOAP msg应该如何由服务器端的WSDL文件给出。尝试在服务器上找到它并查看每个msg的外观。您可以使用soapUI为您解析WSDL文件 如果你不使用上面提到的任何第三方库,你必须自己编写msg。您将需要创建某种类型的HTTP客户端:
HttpURLConnection conn = null;
conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "text/xml");
conn.setRequestProperty("Content-Length", "" + postMessageInBytes.length);
请求体将使用例如XmlSerializer创建,它将帮助您编写所需的标签等。
答案 1 :(得分:1)
您可以使用KSOAP2访问Web服务,并且可以轻松地将XML数据作为String发送...
1.下载ksoap2 jar文件
2.启动eclipse并创建新的android项目
3.右键点击你的项目
4.点击属性
5.单击左窗格中的java构建路径
6.选择库选项卡
7.点击添加外部jar
8.浏览下载的jar文件
您的活动应如下所示......
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.*;
import android.util.Log;
import android.widget.TextView;
import android.os.Bundle;
public class FinalWebServiceDemoActivity extends Activity {
// some parameters regarding your web-service to be invoked
private static final String SOAP_ACTION = "http://tempuri.org/WebServiceMethod";
private static final String METHOD_NAME = "WebServiceMethod";
private static final String NAMESPACE = "http://tempuri.org/";
private static final String URL = "http://10.0.2.2:2256/WebService.asmx";
TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv=(TextView)findViewById(R.id.text1);
call();
}
public void call()
{
try {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("message","Put your XML data here...");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive result = (SoapPrimitive)envelope.getResponse();
String strRes = result.toString();
tv.setText(strRes);
} catch (Exception e) {
tv.setText("Exception...");
Log.i("exception", e.toString());
StackTraceElement elements[] = e.getStackTrace();
for (int i = 0, n = elements.length; i < n; i++) {
Log.i("File", elements[i].getFileName());
Log.i("Line", String.valueOf(elements[i].getLineNumber()));
Log.i("Method", elements[i].getMethodName());
}
}
}
}
不要忘记在清单文件中添加<uses-permission android:name="android.permission.INTERNET" />
权限。
注意:编写此代码是为了访问在本地计算机上运行的.NET Web服务,而IP将通过Android Emulator进行访问。必要时进行修改。
希望这会有所帮助......
答案 2 :(得分:1)
试试这个(纯Java标准):
private WebServiceConnection(String xmlString) {
InputStream responseInputStream = null;
OutputStream requestOutputStream = null;
HttpURLConnection httpURLConnection = null;
try {
// Form the URL
URL url = new URL(URL_BASE + "?serviceId=3");
// Set the HTTP URL connection
httpURLConnection = (HttpURLConnection)url.openConnection();
httpURLConnection.setDoOutput(true);
httpURLConnection.setConnectTimeout(15000);
httpURLConnection.setRequestProperty("Accept-Charset", "UTF-8");
httpURLConnection.setRequestProperty("Content-Type", "text/html");
// Send request
requestOutputStream = httpURLConnection.getOutputStream();
requestOutputStream.write(xmlString.getBytes("UTF-8"));
// Receive response, then do anything with it
responseInputStream = httpURLConnection.getInputStream();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch(SocketTimeoutException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
答案 3 :(得分:0)
package com.example.xmlfilecreator;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
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.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.xmlpull.v1.XmlSerializer;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.util.Xml;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class XmlFileCreator extends Activity implements OnClickListener {
public int i=0;
Button b3;
HttpEntity resEntity;
public TextView tv;
public String filename="";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
b3 = (Button)findViewById(R.id.upload);
tv = (TextView)findViewById(R.id.tv);
b3.setOnClickListener(this);
filename="addupload.xml";
String[] no = new String[] {
"1",
"2",
"3",
"4",
"5",
};
String[] questype = new String[] {
"type1",
"type2",
"type3",
"type4",
"type5",
};
String[] ques = new String[] {
"2+2",
"3+3",
"4+4",
"5+5",
"6+6",
};
String[] cans = new String[] {
"4",
"6",
"8",
"10",
"12",
};
String[] uans = new String[] {
"4",
"5",
"8",
"9",
"10",
};
//create a new file called "addupload.xml" in the SD card
File newxmlfile = new File(Environment.getExternalStorageDirectory()+"/"+filename);
try{
newxmlfile.createNewFile();
}catch(IOException e){
Log.e("IOException", "exception in createNewFile() method");
}
//we have to bind the new file with a FileOutputStream
FileOutputStream fileos = null;
try{
fileos = new FileOutputStream(newxmlfile);
}catch(FileNotFoundException e){
Log.e("FileNotFoundException", "can't create FileOutputStream");
}
//we create a XmlSerializer in order to write xml data
XmlSerializer serializer = Xml.newSerializer();
try {
//we set the FileOutputStream as output for the serializer, using UTF-8 encoding
serializer.setOutput(fileos, "UTF-8");
//Write <?xml declaration with encoding (if encoding not null) and standalone flag (if standalone not null)
serializer.startDocument(null, Boolean.valueOf(true));
//set indentation option
serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
//start a tag called "root"
serializer.startTag(null, "Worksheet");
while(i<no.length)
{
//i indent code just to have a view similar to xml-tree
serializer.startTag(null, "Question");
//set an attribute called "attribute" with a "value" for <child2>
serializer.attribute(null, "number", no[i]);
serializer.endTag(null, "Question");
serializer.startTag(null, "QuestionType");
//write some text inside <child3>
serializer.text(questype[i]);
serializer.endTag(null, "QuestionType");
serializer.startTag(null, "Question");
serializer.text(ques[i]);
serializer.endTag(null, "Question");
serializer.startTag(null, "CorrectAnswer");
serializer.text(cans[i]);
serializer.endTag(null, "CorrectAnswer");
serializer.startTag(null, "UserAnswer");
serializer.text(uans[i]);
serializer.endTag(null, "UserAnswer");
i=i+1;
}
serializer.endTag(null, "Worksheet");
serializer.endDocument();
//write xml data into the FileOutputStream
serializer.flush();
//finally we close the file stream
fileos.close();
TextView tv = (TextView)this.findViewById(R.id.result);
tv.setText("file has been created on SD card");
} catch (Exception e) {
Log.e("Exception","error occurred while creating xml file");
}
}
public void onClick(View v)
{
if(v==b3)
{
// if(!(selectedPath1.trim().equalsIgnoreCase("NONE")) && !(selectedPath2.trim().equalsIgnoreCase("NONE"))){
Thread thread=new Thread(new Runnable(){
public void run(){
doFileUpload();
runOnUiThread(new Runnable(){
public void run() {
tv.setText("uploaded successfully");
}
});
}
});
thread.start();
}
}
private void doFileUpload(){
File file1 = new File("/mnt/sdcard/"+filename);
File file2 = new File("/mnt/sdcard/mfqsheet.xml");
String urlString = "http://192.168.1.20:8080/NpTest/fileUpload";
try
{
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(urlString);
FileBody bin1 = new FileBody(file1);
FileBody bin2 = new FileBody(file2);
MultipartEntity reqEntity = new MultipartEntity();
reqEntity.addPart("uploadedfile1", bin1);
reqEntity.addPart("uploadedfile2", bin2);
reqEntity.addPart("user", new StringBody("User"));
post.setEntity(reqEntity);
HttpResponse response = client.execute(post);
resEntity = response.getEntity();
final String response_str = EntityUtils.toString(resEntity);
if (resEntity != null) {
Log.i("RESPONSE",response_str);
runOnUiThread(new Runnable(){
public void run() {
try {
// Toast.makeText(getApplicationContext(),"Upload <span id="IL_AD4" class="IL_AD">Complete</span>. Check the server uploads directory.", Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
catch (Exception ex){
Log.e("Debug", "error: " + ex.getMessage(), ex);
}
}
}