REST POST HTTP JSON对象400错误Android [英] REST POST HTTP JSON Objects 400 error Android

查看:748
本文介绍了REST POST HTTP JSON对象400错误Android的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Since I got some bad reviews I am rewriting this question...

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

I have an HTTP REST server and a client (Android app). I have programmed several APIs that work just fine, however there is one that is giving me a 400 error, and if I put a breakpoint in the server, it does not even triggers it. So, I would like to understand why it fails :( ...

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

It is very simple, I have a value object called Alarm with a few attributes, that I want to POST to the server for registration of object in the database.

这是输出:

 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)

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

This is my client side Android button listener:

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

            }

        }
    };

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

This is the code where I generate the Json body for the POST in the client:

public String makeJsonBodyForAlarmRegistration (Alarm alarm) {

        Gson gson = new Gson();

        String jsonAlarm = gson.toJson(alarm);

        return jsonAlarm;

    }

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

This is the actual POST code in the client (Android) side:

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

这是我的服务器端代码:

This is my server side code:

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

        }

    }

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

This is my Alarm value object (identical class in client and server):

public class Alarm {

    public Alarm() {

    }

    protected int id;
    protected int userId;
    protected int assetId;
    protected int tagId;
    protected int operatorId;
    protected float threshold;
    protected String networkAssetCode;

    public String getNetworkAssetCode() {
        return networkAssetCode;
    }
    public void setNetworkAssetCode(String networkAssetCode) {
        this.networkAssetCode = networkAssetCode;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getUserId() {
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }
    public int getAssetId() {
        return assetId;
    }
    public void setAssetId(int assetId) {
        this.assetId = assetId;
    }
    public int getTagId() {
        return tagId;
    }
    public void setTagId(int tagId) {
        this.tagId = tagId;
    }
    public int getOperatorId() {
        return operatorId;
    }
    public void setOperatorId(int operatorId) {
        this.operatorId = operatorId;
    }
    public float getThreshold() {
        return threshold;
    }
    public void setThreshold(float threshold) {
        this.threshold = threshold;
    }

}

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

I really appreciate any help...

推荐答案

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

I found the issue! After 48 hours looking for the impossible, discovered that I had done a small update at the object attribute at the server side that had not been replicated in the client side...

这篇关于REST POST HTTP JSON对象400错误Android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆