kotlin volley android POST 多部分/表单数据

Posted

技术标签:

【中文标题】kotlin volley android POST 多部分/表单数据【英文标题】:kotlin volley android POST multipart/form-data 【发布时间】:2019-08-01 04:13:37 【问题描述】:

我有以下 curl 将 GPS 数据发送到我的 odoo 服务器。它工作得很好。但是当我尝试在 volley kotlin/androidstudio 中这样做时,它不起作用。请帮忙。

curl -X POST -H"Content-Type: multipart/form-data" -F coordinates=[4.5232, -96.4242] url

这是我目前尝试过的代码 sn-p:

var lat: Float = intent.getFloatExtra("LATITUDE",0f)
var lng: Float = intent.getFloatExtra("LONGITUDE",0f)
val coordinatesRequest = object: JsonObjectRequest(Request.Method.POST,
                "http://url.com",
                null,
                Response.Listener<JSONObject>response ->
                    Log.d(TAG,"Response: $format(response.toString())")

                ,
                Response.ErrorListener  error ->
                    com.android.volley.VolleyLog.e(TAG,"/post request failed! Error: $error.message")
                ) 

                //override fun getBodyContentType(): String 
                    //return MULTIPART_FORMDATA
                //

                override fun getBody(): ByteArray 
                    val params1 = HashMap<String, String>()
                    params1.put("coordinates","[$lat,$lng]")
                    val charset = Charsets.US_ASCII
                    //val map: List<String> = params.map 
                            //(key, value) -> "--$BOUNDARY\nContent-Disposition: form-data; name=\"$key\"\n\n$value\n"
                    //
                    //val endResult = "$map.joinToString("")\n--$BOUNDARY--\n"
                    return params1.toString().toByteArray(charset)
                

                override fun getHeaders(): MutableMap<String, String> 
                    val headers = HashMap<String,String>()
                    headers.put("Content-Type","multipart/form-data")
                    return headers
                

            

            Log.d(TAG, "lo que envío: $coordinatesRequest.body")
            HttpRequestSingleton.getInstance(context.applicationContext).addToRequestQueue(coordinatesRequest)
        

【问题讨论】:

【参考方案1】:

我在下面的 curl 命令中遇到了类似的问题 -

curl 'https://ws.test.com/handle_email?embed_load_code=undefined' -H 'Accept: /' -H 'Referer: https://cdn1.test.com/widgets/12345/12345/widget.html' -H 'Origin: https://cdn1.test.com' -H 'User-Agent: Test App' -H 'DNT: 1' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' --data 'campaign=12345&merchant=12345&original_data=%257B%2522site%2522%253A%2522site-11111-www.test.com%2522%257D&share_id=&email=test%40test.com' —compressed

弄清楚如何将不同的 cUrl 查询组织到 Volley Request 的简单方法是首先在 Post Man 中运行此 cUrl 查询并在 Charles Proxy 中拦截请求对象 - 参考:Simulate a specific CURL in PostMan

就我而言-

-H 值被添加为标题项 --数据值作为正文添加 Content-Type 设置为 application/x-www-form-urlencoded

【讨论】:

谢谢,我仍然无法解决问题,但决定切换到内容类型 json 并将 JSONRPC 发送到我的服务器。【参考方案2】:

使用 Content-Type:application/json 解决了

【讨论】:

Volley android 存在 multipart/form-data 问题,因此需要一个特殊的扩展存档才能正常工作。我更改了服务器和安卓应用程序中的内容类型。

以上是关于kotlin volley android POST 多部分/表单数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 kotlin android 中使用 volley 获取 json

Kotlin编程开发Android运用程序(Volley+Gson依赖库)

Android Kotlin Volley 如何从 JSONArray 中获取价值

kotlin volley android POST 多部分/表单数据

如何纠正 android kotlin 发送格式错误的 JSON

android Retrofig RxJava写法基于Kotlin在优化