# HTTP网络请求extraData参数问题

#### 问题现象

*   问题一：HTTP表单方式POST后抓包发现Body中没有对应的内容，HTTP表单POST方式应该如何传递Body？
*   问题二：extraData值为'aaaa'可以正常发送，但发'aa%3D%3Da'报错{"status":"-1","message":"非法请求！"}。
*   问题三：构建GET请求时，请求URL会被自动附加一个多余的&符号。

#### 解决方案

*   问题一：参考HTTP请求如何以表单形式进行传输。
*   问题二：
    1.  检查服务端配置：确保服务端能够正确处理URL编码字符。如果服务端不支持直接传递编码后的字符串，需要在客户端解码后再发送。
    2.  修改extraData的值：尝试在发送前将extraData中的URL编码字符转换回原始字符。使用JavaScript的decodeURIComponent函数来解码，然后将decodedData作为extraData的值发送。
    3.  确认请求格式：检查extraData的格式是否符合服务端的要求。

*   问题三：检查extraData的值是否为空字符串：当HTTP请求为GET，有extraData参数且不为undefined或者null，URL中已有?参数分隔符时，会在URL末尾拼接&和extraData参数。如果extraData的值为空字符串，会表现为URL结尾只拼接了多余的&分隔符。

#### 总结

extraData支持string、Object、ArrayBuffer三种数据类型，且长度没有限制，根据业务场景extraData入参也有所不同：

1.  当HTTP请求为POST、PUT等方法时，此字段为HTTP请求的content，以UTF-8编码形式作为请求体。
    *   当'content-Type'为'application/x-www-form-urlencoded'时，请求提交的信息主体数据必须在key和value进行URL转码后（encodeURIComponent/encodeURI），按照键值对"key1=value1&key2=value2&key3=value3"的方式进行编码，该字段对应的类型通常为string。
    *   当'content-Type'为'text/xml'时，该字段对应的类型通常为string。
    *   当'content-Type'为'application/json'时，该字段对应的类型通常为Object。
    *   当'content-Type'为'application/octet-stream'时，该字段对应的类型通常为ArrayBuffer。
    *   当'content-Type'为'multipart/form-data'且需上传的字段为文件时，该字段对应的类型通常为ArrayBuffer。
2.  当HTTP请求为GET、OPTIONS、DELETE、TRACE、CONNECT等方法时，此字段为HTTP请求参数的补充。开发者需传入Encode编码后的string类型参数，Object类型的参数无需预编码，参数内容会拼接到URL中进行发送。ArrayBuffer类型的参数不会做拼接处理。
3.  发起HTTP请求时，extraData为可选配置参数，发送请求的额外数据，默认无此字段。没有额外数据时，避免添加该参数；若必须添加，请填写undefined或者null，避免直接传入空字符串。