用于curl -T的Java替代方案

时间:2015-09-17 10:22:06

标签: java http post curl

我必须在拍照之前使用java将一个文本字符串发送到IP网络摄像头。因此,在我阅读相机用户手册并在谷歌搜索后,我发现的唯一一件事是使用cURL。我安装它并运行正常,一切正常,文件中的文本出现在视频流中。命令是这样的 curl -T test.xml http://admin:pass@192.168.0.1/Video/inputs/channels/2/overlays/text/2 test.xml的内容是:

<TextOverlay xmlns="http://www.hikvision.com/ver10/XMLSchema" version="1.0"> 
<id>2</id>
<enabled>true</enabled>
<posX>5</posX>
<posY>5</posY>
<message>Text here </message>
</TextOverlay>

所以我想用Java发送这个内容,我已经尝试过使用post和java.net但是我收到一个错误“Server返回HTTP响应代码:403 for URL”

这是我的代码:

 System.out.println("Starting......");
URL url = new URL("http://192.168.0.1/Video/inputs/channels/2/overlays/text/2/");
String data = "<TextOverlay xmlns=\"http://www.hikvision.com/ver10/XMLSchema\" version=\"1.0\">\n"
    + "<id>2</id>\n"
    + "<enabled>true</enabled>\n"
    + "<posX>5</posX>\n"
    + "<posY>5</posY>\n"
    + "<message>Text here</message>\n"
    + "</TextOverlay>";
HttpURLConnection httpConnection = prepareConn(url, null, "admin", "pass");
httpConnection.setDoOutput(true);
httpConnection.setDoInput(true);
httpConnection.setRequestMethod("POST");
httpConnection.setRequestProperty ( "Content-Type", "text/xml" );
OutputStreamWriter out = new OutputStreamWriter(httpConnection.getOutputStream());
out.write(data);
out.flush();
out.close();
System.out.println("Printing......");
System.out.println(httpConnection.getResponseCode());
System.out.println(httpConnection.getResponseMessage());
InputStreamReader reader = new InputStreamReader(httpConnection.getInputStream());
StringBuilder buf = new StringBuilder();
char[] cbuf = new char[2048];
int num;

while(-1 != (num = reader.read(cbuf)))
{
  buf.append(cbuf, 0, num);
}

String result = buf.toString();
System.out.println("\nResponse received from server after POST" + result);  
}


static  private HttpURLConnection prepareConn(final URL url, Properties request_props, String username, String password) throws Error, IOException
{
System.out.println("Authorization......");
if (!url.getProtocol().equalsIgnoreCase("http"))
  throw new Error(url.toString() + " is not HTTP!");

final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(300);
conn.setRequestMethod("POST");

final Properties DEFAULT_REQUEST_PROPS = new Properties();
DEFAULT_REQUEST_PROPS.setProperty("charset", "utf-8");

final Properties props = new Properties(DEFAULT_REQUEST_PROPS);
if (request_props != null)
  for (final String name : request_props.stringPropertyNames())
    props.setProperty(name, request_props.getProperty(name));

for (final String name : props.stringPropertyNames())
  conn.setRequestProperty(name, props.getProperty(name));
if(null != username && null != password)
  conn.setRequestProperty("Authorization", "Basic " + new BASE64Encoder().encode((username+":"+password).getBytes()));
return conn;
}

希望有人可以帮忙:) 一切顺利!

1 个答案:

答案 0 :(得分:1)

我只是使用错误的RequestMethod,经过深入研究后我发现我必须PUT而不是POST请求。现在只需更改setRequestMethod(“POST”)тоsetRequestMethod(“PUT”)并像魅力一样工作。