如果是已经有了URL的接口
创新互联-专业网站定制、快速模板网站建设、高性价比和政网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式和政网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖和政地区。费用合理售后完善,十载实体公司更值得信赖。
URL url = new URL(接口);
创建链接对方接口对象
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
设置请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
设置是否向httpUrlConnection输出,设置是否从httpUrlConnection读入
conn.setDoOutput(true);
conn.setDoInput(true);
最后断开链接,保证速度
conn.disconnect();
基本就这样用需要更多的就要自己看api了
1、MESSAGE消息
1)头字段填写说明
Call-id: 必选
CSeq: 必选
From: 必选
To: 必选
Max-Forwards: 必选
Via: 必选
常用的可选参数:
指定的消息体
2)消息实例
发送MESSAGE请求消息给192.168.2.48的6010端口,参考消息如下(带了“Hello”的消息体):
MESSAGE sip:1897778888@192.168.2.48:6010 SIP/2.0
Call-ID: 8e12c17121ac4121bf927f6fd8013358@192.168.2.89
From: sip:01052237300@192.168.2.89;tag=-0037-708c9a5cba8dd878
To: sip:1897778888@192.168.2.89
CSeq: 1 MESSAGE
Via: SIP/2.0/UDP 192.168.2.89:14010;branch=z9hG4bK--22bd7222
Max-Forwards: 30
Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESSAGE
Contact: sip:192.168.2.89:14010
Content-Type: text/plain
Content-Length: 5
Hello
收到来自192.168.2.48的6010端口的返回消息,参考消息如下(修改了消息体的内容,变成了“Hello amigo”):
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.2.89:14010;branch=z9hG4bK--22bd7222
From: sip:01052237300@192.168.2.89;tag=-0037-708c9a5cba8dd878
To: sip:1897778888@192.168.2.89;tag=-002-3c18e810ab17c76f
Call-ID: 8e12c17121ac4121bf927f6fd8013358@192.168.2.89
CSeq: 1 MESSAGE
Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESSAGE
Contact: sip:192.168.2.48:54010
Content-Type: text/plain
Content-Length: 11
主要有以下几点原因:
1、网络不通,在调用的机器上评一下对方服务器ip或域名;
2、如果接口url用的域名,排查是不是DNS问题,这种问题使用方法1时ping域名应该是不通的,直接ping ip可以通;
3、请求接口时设置的超时时间太短,httpclient可以设置超时时间,如果网络不稳定的话会导致请求通信还没有完成就达到超时时间;
4、接口url错误,这种理论上会报404,但是如果人家要求使用https,而你用的http协议,有可能导致超时;
5、对方接口肯定有权限验证,看是以什么方式鉴权,如果用的除token以外的方式鉴权,有可能会鉴权出错一直重试而导致超时;
6、代码错误,这种是你客户端有问题,尤其你提到使用了连接池,确保你从连接池获取的链接是可用的,链接使用完成后需要返还给池,记住是返还而不是关闭。使用连接池有一个缺点,就是对方接口如果不支持长连接的话,你使用连接池是没有效果的,可能一个连接使用一两次就连接不上了,需要重新创建链接。一般接口提供方都会提供demo,可以使用他们提供的demo尝试请求看通不通。
暂时想到可能性只有这么多,你也可以自己查询相关资料。
String sendPost(String jsonStr, String path)
throws IOException {
byte[] data = jsonStr.getBytes();
java.net.URL url = new java.net.URL(path);
java.net.HttpURLConnection conn =
(java.net.HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setConnectTimeout(5 * 1000);// 设置连接超时时间为5秒
conn.setReadTimeout(20 * 1000);// 设置读取超时时间为20秒
// 使用 URL 连接进行输出,则将 DoOutput标志设置为 true
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8");
//conn.setRequestProperty("Content-Encoding","gzip");
conn.setRequestProperty("Content-Length", String.valueOf(data.length));
OutputStream outStream = conn.getOutputStream();// 返回写入到此连接的输出流
outStream.write(data);
outStream.close();//关闭流
String msg = "";// 保存调用http服务后的响应信息
// 如果请求响应码是200,则表示成功
if (conn.getResponseCode() == 200) {
// HTTP服务端返回的编码是UTF-8,故必须设置为UTF-8,保持编码统一,否则会出现中文乱码
BufferedReader in = new BufferedReader(new InputStreamReader(
(InputStream) conn.getInputStream(), "UTF-8"));
msg = in.readLine();
in.close();
}
conn.disconnect();// 断开连接
return msg;
}