这两天在写一个tr069的simulator,原理很简单啦,用httpclient模拟tr069的client端,发送soap message到我们的acs server.
发送soap message的代码如下:
public class MessageSender {
/**
* Logger for this class
*/
private static final Log logger = LogFactory.getLog(MessageSender.class);
private HttpClient httpClient;
private PostMethod postMethod;
private MessageFactory messageFactory;
private String url;
private NameValuePair sessionId;
public MessageSender(String ip){
this.httpClient = new HttpClient();
try {
this.messageFactory = MessageFactory.newInstance();
} catch (SOAPException e) {
logger.error(e.getMessage());
}
this.url = generateRequestUrl(ip);
}
private String generateRequestUrl(String ip) {
return "http://" + ip + ":8080/vantage/TR069";
}
public SOAPMessage sendMessage(SOAPMessage input) throws IOException, SOAPException {
this.postMethod = new PostMethod(this.url);
byte[] dataAsBytes = null;
if (input == null) {
logger.debug("Send a empty post");
dataAsBytes = new byte[0];
} else {
ByteArrayOutputStream data = new ByteArrayOutputStream();
input.writeTo(data);
dataAsBytes = data.toByteArray();
}
RequestEntity entity = new ByteArrayRequestEntity(dataAsBytes);
this.postMethod.setRequestEntity(entity);
if (this.sessionId != null) {
this.postMethod.addParameter(this.sessionId);
}
this.httpClient.executeMethod(this.postMethod);
sessionId = this.postMethod.getParameter("SessionID");
InputStream in = this.postMethod.getResponseBodyAsStream();
if (null == in) {
return null;
}
return this.messageFactory.createMessage(null, in);
}
}
最初的code里面,只有一个PostMethod,这样每次会一直keep一个http连接.因为在server端,只直接用http session来保存server的状态的,所以必须要是保持是一个session.用一个PostMethod可以做到这点.不过奇怪的是,在发第二次请求的时候,怎么都拿不到http connection.也不知道是不是httpclient的bug.后来才每次调用都重新create一个PostMethod,但是把第一次得到的sessionID add进去.
分享到:
相关推荐
在实际应用中,解析SOAP消息通常结合网络请求,例如使用Apache HttpClient发送SOAP请求并接收响应,然后使用DOM4J解析响应内容。了解DOM4J库的其他功能,如XPath查询、命名空间处理等,可以帮助更高效地处理复杂SOAP...
- Java中可以通过`java.net.HttpURLConnection`或者第三方库如Apache HttpClient来发送SOAP请求。 - 构建SOAP消息的方式与VB.NET类似,但需要注意字符串转义的不同,例如在Java中XML的双引号需要用`\"`来表示。 -...
例如,在Java中,可以使用`javax.xml.soap`包中的`SOAPConnectionFactory`和`SOAPMessage`类来创建并发送SOAP请求。 3. **接收并解析SOAP响应**:Web服务执行操作后,会返回一个SOAP响应,同样也是XML格式。客户端...
在上述代码中,`soapMessage`变量包含了SOAP请求的XML结构,其中包含了方法名和参数。`open`方法设置了请求类型为POST,并提供了Web服务的URL。`send`方法将SOAP消息作为请求体发送出去。 当接收到服务器的响应时,...
4. **发送请求**:使用`HttpURLConnection`或第三方库如Apache HttpClient发送请求。 5. **处理响应**:解析API返回的结果,确认短信是否成功发送。 ```java import java.net.HttpURLConnection; import java.net....
在ASP.NET中,我们可以使用`System.Web.Services.Protocols.SoapHttpClientProtocol`类或者`HttpClient`类来调用这种基于SOAP或RESTful的Web服务。 1. **注册与激活** 在使用亿美短信服务之前,你需要先在亿美短信...
在.NET框架中,调用API通常通过HTTP客户端库或Web服务客户端实现,例如使用HttpClient类来发送HTTP请求,或者使用WCF(Windows Communication Foundation)来访问SOAP服务。下面将详细阐述这一主题。 首先,...
本篇文章将深入探讨如何使用C#结合Web Service来实现手机短信的发送功能。 首先,我们需要理解Web Service的基本概念。Web Service是一种基于互联网的、能够通过标准协议(如SOAP)交换数据的服务。在C#中,我们...
1. **SMS协议理解**:首先,你需要了解短信传递所使用的协议,如Short Message Peer-to-Peer (SMPP)或Simple Object Access Protocol (SOAP)。这些协议定义了与短信网关交互的规则。 2. **Java网络编程**:发送短信...
开发者可以使用Java的`HttpURLConnection`类或者第三方库如Apache HttpClient或OkHttp来发起HTTP请求。这些库简化了设置请求头、处理响应以及管理连接的过程。 其次,理解短信服务提供商的API至关重要。通常,你...
4. **发送请求**:使用HttpClient的`GetAsync`或`PostAsync`方法发送请求。对于POST请求,可能需要传递JSON或表单数据。 5. **处理响应**:等待异步操作完成,然后从HttpResponseMessage对象中获取响应内容。根据...
3. **调用发送短信的接口方法**:源码中会有具体的函数调用来发送短信,例如`SendSMS(string phoneNumber, string message)`。此函数将电话号码和短信内容作为参数传递,然后通过WebService接口发送出去。 4. **...
这通常涉及到使用System.Web.Services.ProtocolsSoapHttpClientProtocol类或者更现代的HttpClient类,以及相关的序列化和反序列化技术。以下是对这个主题的详细讲解: 一、SOAP协议与Web服务 SOAP(Simple Object ...
在C#中,我们可以使用HttpClient类来实现POST请求。以下是一个基本的POST请求步骤: - 创建HttpClient对象:首先,需要创建一个`HttpClient`实例,它是HTTP客户端服务的基础类,用于发送HTTP请求。 - 设置请求头...
对于.NET Core和.NET 5及更高版本,推荐使用`HttpClient`类进行WebService调用,它更加轻量级且易于管理。Weather Forecast WebService通常会提供一个SOAP或RESTful的API,这里以REST为例: ```csharp using System...
下面是一个简单的示例,展示如何发送SOAP请求并接收响应。 ##### 发送SOAP请求 ```java import javax.xml.namespace.QName; import javax.xml.ws.Service; import java.net.URL; public class SOAPClient { ...
ACK Handler的代码示例显示了如何使用Java的SOAP API来创建和处理SOAP消息,包括生成ACK响应,涉及到诸如DocumentBuilderFactory、MessageFactory、SOAPElement等类的使用。 总的来说,AXIS在SAP PI环境中的配置和...
以下是一个示例,展示如何使用`HttpClient`发送POST请求获取信息: ```csharp using (HttpClient client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue...
使用`HttpClient`或`WebClient`类来发送POST请求。`HttpClient`是.NET Framework 4.5及更高版本中推荐的HTTP客户端,因为它提供了更现代、更灵活的API。 ```csharp using System.Net.Http; using System.Net....
2. **Java**:Java可以使用`HttpURLConnection`或第三方库如Apache HttpClient、OkHttp来发送HTTP请求。例如,使用`HttpURLConnection`的基本GET请求:`URL url = new URL("http://example.com"); HttpURLConnection...