首页 > 解决方案 > 在 Android Studio 中向 Api 发出 POST 请求

问题描述

我正在尝试向我在 Visual Studio 中创建的 api 发出 POST 请求。该 api 有效,我终于设法找到了一些允许我连接到它的代码(并且它没有被弃用)。问题是这段代码是为 GET 请求编写的,而我需要进行 POST。我创建了两个框,在其中插入要传递的数据(utente、密码),并创建了一个按钮,该按钮从 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, password(值来自前面提到的两个框)

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

我正在使用 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;
    }

标签: javaandroidapipostandroid-volley

解决方案


它正在遵循这个问题:

如何使用带有字符串正文的 volley 发送 POST 请求?

感谢大家的关注。


推荐阅读