Java HttpServlet无法使用OKHttp从客户端发出的POST请求中接收任何参数

时间:2017-02-14 08:22:41

标签: java servlets okhttp

这是来自服务器的日志:

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();

但是客户端确实使用了表单数据,那么这里有什么问题呢?

2 个答案:

答案 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参数,而不是通过读取请求正文。