当使用 okhttp 发送 post 请求时,服务器接收到的请求体为空。可能是什么问题?
Server receives the request body as null, when sending post request using okhttp. what could be the issue?
这是将参数 fname
selectedFile(byteArray)
作为 post 请求正文的一部分从 android 发送到 tomcat 服务器的代码。
public void uploadFile(){
EditText filename=findViewById(R.id.fileName);
//content://
try {
InputStream inputStream=getContentResolver().openInputStream(filePath);
selectedFile= IOUtils.toByteArray(inputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
String purl="http://192.168.1.11:8080/placement/V2TryUploadFile";
RequestBody requestBody=new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("fname",filename.getText().toString())
.addFormDataPart("selectedFile",filename.getText().toString(),RequestBody.create(MediaType.parse("application/pdf"),selectedFile))
.build();
Request request=new Request.Builder()
.url(purl)
.post(requestBody)
.build();
Toast.makeText(MainActivity.this,filename.getText().toString(),Toast.LENGTH_SHORT).show();
Toast.makeText(MainActivity.this,selectedFile.length+":",Toast.LENGTH_SHORT).show();
OkHttpClient okHttpClient=new OkHttpClient();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
call.cancel();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"Failed to Upload",Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String responseString=response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,responseString,Toast.LENGTH_SHORT).show();
}
});
}
});
Servlet 代码(tomcat 服务器上的 运行)处理从 android add
发送的 post 请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String fname=request.getParameter("fname")+".pdf";
Part selectedFile=request.getPart("selectedFile");
System.out.println(fname);
System.out.println(selectedFile+"");
InputStream filecontent = selectedFile.getInputStream();
byte[] fileAsByteArray = IOUtils.toByteArray(filecontent);
FileOutputStream imageOutFile = new FileOutputStream("C:\Users\VAISHAK`\placeWorkSpace\placement\ResumeUploads\" + fname);
imageOutFile.write(fileAsByteArray);
imageOutFile.close();
doGet(request, response);
}
问题是 fname 和 selectedFile 在 android app 中未显示为空,但在 tomcat 服务器控制台中都显示为空。
下面还有tomcat服务器登录eclipse
null.pdf
null
Apr 13, 2020 11:56:20 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [trial.V2TryUploadFile] in context with path [/placement] threw exception
java.lang.NullPointerException
at trial.V2TryUploadFile.doPost(V2TryUploadFile.java:49)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:688)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:615)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:818)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1623)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
我终于想出了解决办法
servlet 默认不处理
MutipartBody FORM
因此,为了使其支持该功能,我们需要将以下注释添加到 servlet
@MultipartConfig
这是将参数 fname
selectedFile(byteArray)
作为 post 请求正文的一部分从 android 发送到 tomcat 服务器的代码。
public void uploadFile(){
EditText filename=findViewById(R.id.fileName);
//content://
try {
InputStream inputStream=getContentResolver().openInputStream(filePath);
selectedFile= IOUtils.toByteArray(inputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
String purl="http://192.168.1.11:8080/placement/V2TryUploadFile";
RequestBody requestBody=new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("fname",filename.getText().toString())
.addFormDataPart("selectedFile",filename.getText().toString(),RequestBody.create(MediaType.parse("application/pdf"),selectedFile))
.build();
Request request=new Request.Builder()
.url(purl)
.post(requestBody)
.build();
Toast.makeText(MainActivity.this,filename.getText().toString(),Toast.LENGTH_SHORT).show();
Toast.makeText(MainActivity.this,selectedFile.length+":",Toast.LENGTH_SHORT).show();
OkHttpClient okHttpClient=new OkHttpClient();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
call.cancel();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"Failed to Upload",Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String responseString=response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,responseString,Toast.LENGTH_SHORT).show();
}
});
}
});
Servlet 代码(tomcat 服务器上的 运行)处理从 android add
发送的 post 请求 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String fname=request.getParameter("fname")+".pdf";
Part selectedFile=request.getPart("selectedFile");
System.out.println(fname);
System.out.println(selectedFile+"");
InputStream filecontent = selectedFile.getInputStream();
byte[] fileAsByteArray = IOUtils.toByteArray(filecontent);
FileOutputStream imageOutFile = new FileOutputStream("C:\Users\VAISHAK`\placeWorkSpace\placement\ResumeUploads\" + fname);
imageOutFile.write(fileAsByteArray);
imageOutFile.close();
doGet(request, response);
}
问题是 fname 和 selectedFile 在 android app 中未显示为空,但在 tomcat 服务器控制台中都显示为空。
下面还有tomcat服务器登录eclipse
null.pdf
null
Apr 13, 2020 11:56:20 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [trial.V2TryUploadFile] in context with path [/placement] threw exception
java.lang.NullPointerException
at trial.V2TryUploadFile.doPost(V2TryUploadFile.java:49)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:688)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:615)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:818)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1623)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
我终于想出了解决办法
servlet 默认不处理
MutipartBody FORM
因此,为了使其支持该功能,我们需要将以下注释添加到 servlet
@MultipartConfig