我正在尝试调用Web服务:
以下卷曲命令适用于该
curl -F fa=c.apiupload -F sessiontoken=EA3237F922644115A0F7DB75D0AE388F -F destfolderid=52482BD488DB4AD6887C5C7BF47BD6FC -F filedata=@/Users/cpinera/tmp/panda2.jpg -F zip_extract=1 -F metadata=1 -F meta_img_description="This is a very nice panda" -F meta_img_keywords="panda,happy panda" http://domain.com/razuna/raz1/dam/index.cfm
但是作为访问RESTFul API的HttpURLConnection,我生成的等价URL不是:
http://domain.com/razuna/raz1/dam/index.cfm?fa=c.apiupload&sessiontoken=F46D2226463C4ADE866819AACD7D2F5E&filedata=C:'JobInterview'BatchUpload'auth.xml&destfolderid=52482BD488DB4AD6887C5C7BF47BD6FC&zip_extract=1
我收到REST请求的响应:
The content was :: <?xml version="1.0" encoding="UTF-8"?><Response><responsecode>1</responsecode><message>Upload failed This was not an uploaded form type</message></Response>
这是Java代码
使用查询URL的方法:
public static String doQuery(String loginUrl) throws IOException{
URL url = new URL(loginUrl);
HttpURLConnection conn =
(HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
if (conn.getResponseCode() != 200) {
throw new IOException(conn.getResponseMessage());
}
InputStream is = conn.getInputStream();
//Buffer the result into a string
BufferedReader rd = new BufferedReader(
new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
line = StringEscapeUtils.unescapeHtml4(line);
sb.append(line);
}
rd.close();
conn.disconnect();
System.out.println("The content was :: " + sb.toString());
return sb.toString();
}
应上传的方法:
public static void testUpload(String seesionToken, String file ) throws IOException{
String upload = "http://domain.com:8080/razuna/raz1/dam/index.cfm?fa=c.apiupload&sessiontoken="+seesionToken+"&filedata="+file+"&destfolderid=52482BD488DB4AD6887C5C7BF47BD6FC&zip_extract=1" ;
System.out.println(upload);
Authenticate.doQuery(upload);
}
在doQuery中添加后:conn.setRequestProperty("内容类型","多部分/表单数据");
并将RESTFul URL更改为:
http://domain.com:8080/razuna/raz1/dam/index.cfm?fa=c.apiupload&sessiontoken="+seesionToken+"&filedata="+files.toURI()+"&destfolderid=52482BD488DB4AD6887C5C7BF47BD6FC&zip_extract=1"
它似乎检测到URL正在尝试发送文件,但仍然无法上传文件:
The content was :: <?xml version="1.0" encoding="UTF-8"?><Response><responsecode>1</responsecode><message>Upload failed There was no appropriate FILE found in the upload</message></Response>
您的curl命令正在上传文件@/Users/cpinera/tmp/panda2.jpg。单独使用URL不会,它只会访问页面,因此您会错误地说"这不是上传的表单"。
当您使用-F参数运行curl
时,它会发送一个HTTP POST请求,该请求具有在HTTP请求正文中传递的指定名称-值对。当您使用查询字符串参数访问URL时,将执行HTTP GET。服务器处理这两种请求方法的方式可能不同。
更新,现在您已经发布了一些Java代码:
URL的查询字符串部分中的值用于向将处理请求的web服务器传递信息。当然,这个远程服务器不会知道C:/path/to/your/file
是什么,因为这是本地机器上文件的路径。发送该文件数据的正确方法是用Java打开该文件,然后读取并将其写入HttpUrlConnection
的输出流。
例如,请参阅Android文档对HttpUrlConnection
的讨论中"发布内容"下的代码片段:http://developer.android.com/reference/java/net/HttpURLConnection.html