使用 JavaWS 在表单数据中发布文件
posting file in form data using JavaWS
在 postman 中,我 post 将数据形成到 API 构建在 play2 框架上。现在我想在另一个基于 play2 框架的 API 中进行同样的调用。
ws.url(url).setContentType("application/x-www-form-urlencoded")
.post("key1=value1&key2=value2");
可用于提交表单数据,但如何向同一请求添加文件?
使用播放框架 2.4.X
在play website中,你可以找到下面的代码来实现你想要的。
请注意,该文档适用于播放版本 2.5.X
import play.mvc.Http.MultipartFormData.*;
//the file you want to post
Source<ByteString, ?> file = FileIO.fromFile(new File("hello.txt"));
//generate the right format for posting
FilePart<Source<ByteString, ?>> fp = new FilePart<>("hello", "hello.txt", "text/plain", file);
DataPart dp = new DataPart("key", "value");// the data you want to post
ws.url(url).post(Source.from(Arrays.asList(fp, dp)));
更新:
您应该知道的第一件事是 ws
是建立在 com.ning.http.AsyncHttpClient
之上的。参考 Play Document,
play 2.4.*
的ws
不支持直接上传multi part form。您可以将底层客户端 AsyncHttpClient
与 RequestBuilder.addBodyPart 一起使用。下面的代码可以实现你想要的
import com.ning.http.client.AsyncHttpClient
import com.ning.http.client.multipart.FilePart
AsyncHttpClient myClient = ws.getUnderlying();
FilePart myFilePart = new FilePart("myFile", new java.io.File("test.txt"))
myClient.preparePut("http://localhost:9000/index").addBodyPart(filePart).execute.get()
祝你好运
在 postman 中,我 post 将数据形成到 API 构建在 play2 框架上。现在我想在另一个基于 play2 框架的 API 中进行同样的调用。
ws.url(url).setContentType("application/x-www-form-urlencoded")
.post("key1=value1&key2=value2");
可用于提交表单数据,但如何向同一请求添加文件?
使用播放框架 2.4.X
在play website中,你可以找到下面的代码来实现你想要的。 请注意,该文档适用于播放版本 2.5.X
import play.mvc.Http.MultipartFormData.*;
//the file you want to post
Source<ByteString, ?> file = FileIO.fromFile(new File("hello.txt"));
//generate the right format for posting
FilePart<Source<ByteString, ?>> fp = new FilePart<>("hello", "hello.txt", "text/plain", file);
DataPart dp = new DataPart("key", "value");// the data you want to post
ws.url(url).post(Source.from(Arrays.asList(fp, dp)));
更新:
您应该知道的第一件事是 ws
是建立在 com.ning.http.AsyncHttpClient
之上的。参考 Play Document,
play 2.4.*
的ws
不支持直接上传multi part form。您可以将底层客户端 AsyncHttpClient
与 RequestBuilder.addBodyPart 一起使用。下面的代码可以实现你想要的
import com.ning.http.client.AsyncHttpClient
import com.ning.http.client.multipart.FilePart
AsyncHttpClient myClient = ws.getUnderlying();
FilePart myFilePart = new FilePart("myFile", new java.io.File("test.txt"))
myClient.preparePut("http://localhost:9000/index").addBodyPart(filePart).execute.get()
祝你好运