向Android Studio中的Api发出POST请求

时间:2019-03-23 11:07:16

标签: java android api post android-volley

我正在尝试向我在Visual Studio中创建的api发出POST请求。该api有效,最终我找到了一些可以连接到它的代码(并且不推荐使用)。问题是此代码是为GET请求而编写的,而我需要进行POST。我创建了两个框,在其中插入要传递的数据(密码,密码),并创建了一个按钮,该按钮从boxex中获取数据并将其转换为字符串。

我已经尝试搜索了很多示例和教程,这些示例和教程显示了如何发出POST请求,但是大多数示例已经很老了,无法在Android Studio中正常工作,或者至少我无法使它们正常工作。

现在,这是应该发送数据的函数,因为我除了请求方法之外真的不知道要修改什么,所以我没有触及代码。

private StringRequest searchNameStringRequest(String utente, String password)
    {
        String url = "http://192.168.1.11:57279/api/utente";
        return new StringRequest(Request.Method.POST, url,
                new Response.Listener<String>()
                {
                    @Override
                    public void onResponse(String response)
                    {
                        try
                        {
                            JSONObject result = new JSONObject(response).getJSONObject("list");
                            int maxItems = result.getInt("end");
                            JSONArray resultList = result.getJSONArray("item");
                        }
                        catch (JSONException e)
                        {
                            Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
                        }
                    }
                },
                new Response.ErrorListener()
                {
                    @Override
                    public void onErrorResponse(VolleyError error)
                    {
                        Toast.makeText(MainActivity.this, "Food source is not responding (USDA API)", Toast.LENGTH_LONG).show();
                    }
                });
    }

有人可以向我解释如何获取数据并像具有

的JSON对象一样发送数据

键=用户,密码

values = utente,密码(这些值来自前面提到的两个框中)

感谢任何愿意帮助我的人,我希望寻求如此多的帮助不会违反站点规则。

我正在使用Volley,因为它并不那么复杂,并且因为它似乎可以工作。

使用GET方法可以向我显示现有的带消息的json无法转换为JSON对象(我不在乎,这只是确认它已连接到api)

使用POST方法,它会在最后抛出ErrorResponse(食物来源没有响应)

编辑:添加了OnCreate方法,因为我需要StringRequest返回

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        queue = Volley.newRequestQueue(this);
        Button invia = findViewById(R.id.submit);
        final EditText utenteInserito = findViewById(R.id.utente);
        final EditText passwordInserito = findViewById(R.id.password);

        invia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String utente = utenteInserito.getText().toString();
                String password = passwordInserito.getText().toString();
                queue.cancelAll(R.id.submit);
                StringRequest stringRequest = searchNameStringRequest(utente, password);
                stringRequest.setTag(R.id.submit);
                queue.add(stringRequest);
            }
        });
    }

编辑:我已经按照给出的建议答案进行了操作,但它似乎不起作用

结果代码如下所示,但是我得到了OnErrorResponse,我认为这不是api的问题,因为尝试使用GET响应会给我退出的json数组,所以我认为这是代码的问题。

private StringRequest searchNameStringRequest(final String utente, final String password)
    {
        String url = "http://192.168.1.11:57279/api/utente";
        StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>()
        {
            @Override
            public void onResponse(String response)
            {
                System.out.println(response);
            }
        }, new Response.ErrorListener()
        {

            @Override
            public void onErrorResponse(VolleyError error)
            {
                Toast.makeText(MainActivity.this,"Service Unavailable",Toast.LENGTH_SHORT).show();
                error.printStackTrace();
            }
        })
        {
            @Override
            protected Map<String, String> getParams()
            {
                Map<String,String> map = new HashMap<>();
                map.put("user", utente.trim());
                map.put("password",password.trim());
                return map;
            }
        };
        RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
        requestQueue.add(request);
        return request;
    }

3 个答案:

答案 0 :(得分:0)

        String url = "your url";
    StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            System.out.println(response);
            dialog.dismiss();
            try {
// your logic when API sends your some data
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                dialog.dismiss();
                Toast.makeText(context,"Service Unavailable",Toast.LENGTH_SHORT).show();
                error.printStackTrace();
            }
        }){
//This is how you will send the data to API
            @Override
            protected Map<String, String> getParams(){
                Map<String,String> map = new HashMap<>();
                map.put("name",username.getText().toString());
                map.put("password",password.getText().toString());
                return map;
            }
        };
        RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
        requestQueue.add(request);
    }

答案 1 :(得分:0)

这是一个很好的教程,我已经尝试过并且可以无缝地工作。

Android Login and Registration with PHP, MySQL and SQLite

您可以跳过sqlite和phpMyAdmin部分。

答案 2 :(得分:0)

正在解决以下问题:

How to send a POST request using volley with string body?

感谢大家的关注。