REST POST HTTP JSON对象400错误Android

时间:2017-04-05 06:34:12

标签: java android json rest http

由于我收到了一些不好的评论,我正在重写这个问题......

我有一个HTTP REST服务器和一个客户端(Android应用程序)。我编写了几个工作正常的API,但有一个给我400错误,如果我在服务器中放置一个断点,它甚至不会触发它。所以,我想了解它失败的原因:( ...

这很简单,我有一个名为Alarm的值对象,带有一些属性,我希望POST到服务器以便在数据库中注册对象。

这是输出:

Longitude: <%= request.getParameter("Longitude") %>
Latitude: <%= request.getParameter("Latitude") %>

这是我的客户端Android按钮监听器:

 Callback failure for call to http://10.0.0.3:8080/...
 java.io.IOException: Unexpected code Response{protocol=http/1.1, code=400, message=, url=http://10.0.0.3:8080/BiTrack_API/api/assets/registerAlarm}
     at it.bitrack.fabio.bitrack.AlarmView$2$1.onResponse(AlarmView.java:438)
     at okhttp3.RealCall$AsyncCall.execute(RealCall.java:135)
     at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
     at java.lang.Thread.run(Thread.java:761)

这是我在客户端为POST生成Json主体的代码:

View.OnClickListener addAlarmAction = new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            try {

                alarm.setThreshold(Float.parseFloat(thresholdEditText.getText().toString()));
                String alarmJson = j.makeJsonBodyForAlarmRegistration(alarm);
                tagLinearLayout.setVisibility(view.GONE);
                operatorLinearLayout.setVisibility(view.GONE);
                thresholdLinearLayout.setVisibility(view.GONE);
                assetSpinner.setSelection(0);

                r.attemptAddNewAlarm(alarmJson,

                        new Callback() {
                            @Override public void onFailure(Call call, IOException e) {
                                e.printStackTrace();
                            }

                            @Override public void onResponse(Call call, Response response) throws IOException {
                                try (final ResponseBody responseBody = response.body()) {
                                    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

                                    Headers responseHeaders = response.headers();
                                    for (int i = 0, size = responseHeaders.size(); i < size; i++) {
                                        System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
                                    }

                                    final String responseBodyString = responseBody.string();
                                    final int resultCode = response.code();

                                    try {

                                        getActivity().runOnUiThread(new Runnable() {
                                            @Override
                                            public void run() {

                                                Log.i("BiTrack", "attemptAddNewAlarm RESULT: " + resultCode);
                                                executeAlarmRegistration(resultCode);

                                            }
                                        });

                                    } catch (Exception e) {

                                        e.printStackTrace();

                                    }
                                }
                            }
                        });

            } catch (Exception e) {

                e.printStackTrace();

            }

        }
    };

这是客户端(Android)端的实际POST代码:

public String makeJsonBodyForAlarmRegistration (Alarm alarm) {

        Gson gson = new Gson();

        String jsonAlarm = gson.toJson(alarm);

        return jsonAlarm;

    }

这是我的服务器端代码:

public void attemptAddNewAlarm(String json, Callback callback) throws Exception {

        final OkHttpClient client = new OkHttpClient();

        RequestBody body = RequestBody.create(JSON, json);
        Request request = new Request.Builder()
                .url(WEB_SERVER + "BiTrack_API/api/assets/registerAlarm")
                .post(body)
                .build();

        client.newCall(request).enqueue(callback);
    }

这是我的警报值对象(客户端和服务器中的相同类):

@POST
    @Path("/registerAlarm")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Response registerAlarm(Alarm alarm) {

        System.out.println("Received API Call: registerAlarm for alarm tagId: " + alarm.getTagId() + " operatorId: " + alarm.getOperatorId() + " treshold: " + alarm.getThreshold());

        DataProcessor dp = new DataProcessor();
        AssetUpdateDAO aDAO = new AssetUpdateDAO();

        ArrayList<Alarm> customerAlarms = aDAO.getUserAlarmsForAsset(alarm.getUserId(), alarm.getAssetId());


        if (dp.isNewAlarmDuplicate(customerAlarms, alarm)) {

            return Response.status(480).build(); // duplicated error

        } else {

            int response = aDAO.insertAssetUserAlarm(alarm.getUserId(), alarm.getAssetId(), alarm.getTagId(), alarm.getOperatorId(), alarm.getThreshold());

            if (response == -5) {
                return Response.status(484).build(); // something went wrong while inserting alarm into db
            } else {
                return Response.status(200).build();
            }

        }

    }

我非常感谢任何帮助...

2 个答案:

答案 0 :(得分:0)

为了帮助您,需要端点代码。现在甚至不清楚您的API使用了什么技术堆栈。

但是根据现有的信息......端点认为您的json无效。

  

400错误请求

     

由于格式错误,服务器无法理解该请求   句法。客户端不应该重复请求   修改

在jax-rs中,首先对有效负载进行反序列化,然后才能到达绑定到url en http方法的方法。

反序列化可能会失败,它永远不会达到您设置的断点。

有趣的是以下内容:

  • 来自服务器的日志或异常。客户端异常没有用,因为服务器返回此响应。
  • 通过网络发送的实际(json)有效负载。
  • 在服务器端使用什么反序列化机制?反思还是你做了自己的反序列化工程?

答案 1 :(得分:0)

我发现了这个问题!在48小时后寻找不可能的事情,发现我在服务器端的对象属性上做了一个小的更新,但没有在客户端复制......