如何通过带有标头的 volley 发布 JSON 请求?

Posted

技术标签:

【中文标题】如何通过带有标头的 volley 发布 JSON 请求?【英文标题】:How to post JSON request via volley with header? 【发布时间】:2020-01-07 22:33:11 【问题描述】:

我尝试通过 Volley 发布 JSON 请求并收到错误 BasicNetwork.performRequest: Unexpected response code 500 这个API URL在POSTMAN中测试正常,可以被ios版app调用。

我怀疑标题值没有添加到我的代码中(如果我错了,请纠正我)

我尝试在我的代码中添加getHeaders() 函数,但似乎无法正常工作。有人可以告诉我如何解决这个问题吗?

邮递员结果

这是我当前的代码:-

 override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.clipped_product_page)
        setTitle("Clipped Product")
        val actionbar = supportActionBar

        actionbar?.setDisplayHomeAsUpEnabled(true)
        actionbar?.setDisplayHomeAsUpEnabled(true)

        val URL = "https://api.sample.com/Api/user_id"

        val json = JSONObject()
        json.put("user_id", "1")
        json.put("code", "AB")

        val jsonOblect = object : JsonObjectRequest(
                Request.Method.POST,
                URL,
                json,
                Response.Listener response ->
                    // Get your json response and convert it to whatever you want.
                    Toast.makeText(this, "You Clicked: $response", Toast.LENGTH_SHORT).show()
                ,
                Response.ErrorListener 
                    Toast.makeText(this, "Error $it .message", Toast.LENGTH_SHORT).show()
                
        ) 
            @Throws(AuthFailureError::class)
            override fun getHeaders(): Map<String, String> 
                val headers = HashMap<String, String>()
                headers.put("Content-Type", "application/json")
                return headers
            
        

        VolleySingleton.getInstance(this).addToRequestQueue(jsonOblect)

    

如何实现这一点并将我的输出转换为数组列表?

请帮忙谢谢。

【问题讨论】:

这可能对您有帮助 androidhive.info/2014/05 并且响应代码 500 是服务器错误响应代码表示服务器遇到了阻止其完成请求的意外情况 显示您如何尝试使用getHeaders()。到目前为止,您的代码与标题无关。 @VladyslavMatviienko 很抱歉错过了。在我尝试了 Mahdi 解决方案后仍然无法正常工作。您可以检查上面编辑的示例代码。 好的,我现在明白了。您出于某种奇怪的原因将用户 ID 和代码放入 JSONObject 中,而不是像在邮递员中那样将它们作为 post 参数发送,为什么? 【参考方案1】:

使用 Volley 发送 post 请求

String URL = "";

JSONObject json = new JSONObject();
json.put("email", "abc@abc.com");
json.put("password", "");
json.put("user_type", "");

 JsonObjectRequest jsonOblect = new JsonObjectRequest(Request.Method.POST, URL, json, new Response.Listener<JSONObject>() 
        @Override
        public void onResponse(JSONObject response) 
             // Get your json response and convert it to whatever you want.
        
    , new Response.ErrorListener() 
          @Override
          public void onErrorResponse(VolleyError error) 
                // Error
          
    ) 
          @Override
          public Map<String, String> getHeaders() throws AuthFailureError 
             final Map<String, String> headers = new HashMap<>();
             headers.put("Authorization", "TOKEN");//put your token here
             return headers;
          
;

VolleyApplication.getInstance().addToRequestQueue(jsonOblect);

【讨论】:

嗨@Mahdi-Malv,感谢您的帮助。但是我尝试应用您的代码它仍然无法正常工作,知道吗?我在上面编辑了示例代码和邮递员结果【参考方案2】:

最后我通过使用如下示例代码解决了我的问题:-

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.clipped_product_page)
        setTitle("Clipped Product")
        val actionbar = supportActionBar

        actionbar?.setDisplayHomeAsUpEnabled(true)
        actionbar?.setDisplayHomeAsUpEnabled(true)

        val URL = "https://api.sample.com/Api/user_id"

        val stringRequest = object : StringRequest(Request.Method.POST, URL,
                Response.Listener  response -> Toast.makeText(this, response, Toast.LENGTH_LONG).show() ,
                Response.ErrorListener  error -> Toast.makeText(this, error.toString(), Toast.LENGTH_LONG).show() ) 
            override fun getParams(): Map<String, String> 
                val params = HashMap<String, String>()
                params["user_id"] = "7"
                params["code"] = "MY"

                return params
            

        

        VolleySingleton.getInstance(this).addToRequestQueue(stringRequest)

我将 JsonObjectRequest 更改为 StringRequest

【讨论】:

以上是关于如何通过带有标头的 volley 发布 JSON 请求?的主要内容,如果未能解决你的问题,请参考以下文章

删除带有标头和参数的请求 Volley

在 json 对象参数 Volley post 中发送令牌头

使用 Volley 发送带有 JSON 数据的 POST 请求

Android-Volley:为JsonArrayRequest设置HTTP标头

如何使用带有标头的改造来检索 JSON?

HttpClient postasync,带有自定义标头和应用程序/json,用于正文 C#