这是来自服务器的日志:
POST Request reader reads:--3cd58f21-8ffa-46a0-b1c0-0e4660c2ca28
POST Request reader reads:Content-Disposition: form-data; name="device"
POST Request reader reads:Content-Length: 163
POST Request reader reads:
POST Request reader reads:{"deviceId":"5ccf7f0fb7b1","manufacturer":"Wow Lamp","name":"Wow-b7b1","type":"lamp","userId":"amzn1.account.AGGL3JOPQ3UTF74KQY2TJCYSYNAQ","timer":0,"chosen":true}
POST Request reader reads:--3cd58f21-8ffa-46a0-b1c0-0e4660c2ca28--
以上结果是读者从请求中读取的内容。但是如果从请求实例调用getParameter,则参数map为null。
这是参数图的内容:
POST Request:{}
如您所见,地图不包含参数,但读者可以读取客户端发送的数据。
这是服务器的代码:
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException
{
System.out.println("POST Request:" + req.getParameterMap());
if(isPostRequestValid(req))
{
try
{
handleRequest(req);
}
catch (JSONException e)
{
e.printStackTrace();
}
}
sendResponse(resp);
try
{
BufferedReader reader = req.getReader();
String inputLine;
while((inputLine = reader.readLine()) != null)
{
System.out.println("POST Request reader reads:" + inputLine);
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
客户端必须存在编码错误
这是客户的代码:
new Thread(new Runnable() {
@Override
public void run() {
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new MultipartBuilder()
.type(MultipartBuilder.FORM) //this is what I say in my POSTman (Chrome plugin)
.addFormDataPart("device", device)
.build();
Request request = new Request.Builder()
.url(Constant.BASE_URL + "update_device.html")
.post(requestBody)
.build();
try {
Response response = client.newCall(request).execute();
String responseString = response.body().string();
response.body().close();
// do whatever you need to do with responseString
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
但是客户端确实使用了表单数据,那么这里有什么问题呢?
答案 0 :(得分:1)
我通过将我的OKHttpClient更新到版本3.6然后将我的代码的请求正文部分更改为此
来解决问题application/x-www-form-urlencoded
以前我的OKHttpClient版本似乎不包含发送内容类型multipart/form-data
参数的功能。
在更新之前,OKHttpClient只能发送内容类型getPart("key")
的参数。但是对于servlet方面,我无法解析这种内容类型。我尝试使用方法FormBody
但是在访问该方法后抛出了异常。
因此,将OKHttpClient更新到版本3.6将允许我使用application/x-www-form-urlencoded
类来发送具有request.getParameter("key")
内容类型的请求参数。这样,servlet端现在可以通过{{1}}方法获取参数。
答案 1 :(得分:0)
通过请求参数在Servlet中接收HTTP POST参数,而不是通过读取请求正文。