如何确定请求格式

问题前景

最近在整理一个项目的相关接口时,发现原有的接口接收参数各式各样。与负责项目的前端对了一下,发现前端并没有维护一个全局性的请求模块,也没有
具体的请求规则。基本上只要开发业务的与前端商量好,能跑就行。这就经常性的带来一些问题----1.前端传参方式与后端接收参数经常不一致,增加了
沟通成本。2.前端传参方式与业务场景不一致,容易引起误解。

常见的前端请求传参方式

一个HTTP请求的格式如下:

在这里插入图片描述

请求方法

(1)GET方法

注意GET方法不要传参数在body里面

(2)POST方法

(3)其他方法PUT,DELETE(一般不推荐使用)

参数存放位置

(1)param

param中的参数会直接体现在请求url后面的字符串中。一般用作GET,PUT方法中的的业务请求参数传递。

(2)header

header中的参数会直接体现在HTTP请求报文中的请求头。一般用于除了一些Cookie,Content-Type常见字段,以及一些业务自定义的通用属性字段。

注意:不建议在header中传递具体的业务请求参数,header主要用来存放一些表示请求属性的通用字段

(3)body

header中的参数会直接体现在HTTP请求报文中的请求体中。一般用作PUT方法中的业务请求参数传递。body中的数据存在多种格式类型,一般建议项目
统一使用一种类型,非必要不要混用。这里的类型与header里面的Content-Type字段对应。

1----application/json(json数据格式,这里推荐大家统一使用这种。)

2----application/x-www-form-urlencoded(表单默认的提交数据的格式。)

3----multipart/form-data(文件上传使用。)

常见的Controller收参数方式

接收请求方法

@RequestMapping(路径)----不限方法

@GetMapping(路径)----限定GET请求

@PostMapping(路径)----限定POST请求

接收参数格式

(1)使用默认接收方法

示例:

@RequestMapping("test.do")
public Object sendCommentSms(VipCommentReq vipCommentReq) {
    return (Object) vipCommentReq;
}

这里spring框架会默认先读取param里面的信息,再读取application/x-www-form-urlencoded类型传的信息

(2)使用@RequestBody接收

示例:

@RequestMapping("test.do")
public Object sendCommentSms(VipCommentReq vipCommentReq) {
    return (Object) vipCommentReq;
}

这里读取请求的Body中的信息,并且类型默认为application/json

(3)接收整个Http请求对象,再从中获取具体信息

示例:

@RequestMapping("test.do")
public Object sendCommentSms(HttpRequest req) {
    return (Object) req.getHeaders();
}

第三种相当于接收整个HTTP报文对象,可以根据自己需要读取其中的信息。

注意请求方式与接收参数方式一定要对应,不对应可能出现报错,也可能接收对象为空

这里推荐大家优先使用前两种

推荐的传参接收组合(建议,具体根据公司业务以及统一规范来决策)

(1)简单的查询请求:例如查询一个资源

建议使用GET请求方法,参数加在param中。

(2)提交数据,涉及数据变动的请求:例如提交个人信息

建议使用POST请求方法,参数放在body中。

(3)需要对请求鉴权(对所有请求的筛选)

建议在请求时将token或者其他的凭证字段加在Header中,做一个拦截器统一处理。

禁忌点

(1)POST方法里面的参数格式一会使用application/x-www-form-urlencoded格式,一会使用application/json格式。

(2)所有方法都用GET或者POST。(有些公司会要求统一使用POST,说明公司人员开发不规范,乱用GET与POST,所以一刀切)

推荐大家的一款管理接口工具

(1)Yapi接口管理平台

按照业务需求将接口纳入Yapi管理,开发时,后端先在Yapi规范格式。前端根据后端规范进行传参。这个也是主流平台。

(2)postman

postman功能更全,更丰富。但是postman必须要下载客户端,没有Yapi的网页便捷。

切忌:千万不要口头约束或者想一个是一个,会给后续的开发带来困扰

在 Java 发起 HTTP 请求时,如果请求参数格式处理不当,会导致服务器返回错误,例如 `400 Bad Request` 或 `500 Internal Server Error`。这类问题通常源于 URL 编码、参数拼接方式或请求格式不符合预期。 ### 参数中含有空格的处理 当 URL 中的参数包含空格等特殊字符时,必须进行 URL 编码以确保其在网络传输中被正确解析。Java 提供了 `URLEncoder.encode()` 方法来对参数进行编码,应使用该方法对每个参数值进行单独编码[^1]。例如: ```java String param = "hello world"; String encodedParam = URLEncoder.encode(param, "UTF-8"); ``` 这样可以将空格转换为 `%20`,从而避免因空格导致的请求失败问题。 ### GET 请求参数格式错误 GET 请求的参数直接附加在 URL 后面,因此必须确保整个 URL 的构造是正确的。常见做法是手动拼接查询字符串,并对每个参数值进行 `URLEncoder.encode()` 处理[^1]。例如: ```java String baseUrl = "http://example.com/api?"; String query = "q=" + URLEncoder.encode("java http", "UTF-8"); URL url = new URL(baseUrl + query); ``` ### POST 请求参数格式错误 POST 请求的参数一般位于请求体中,根据 `Content-Type` 的不同,参数格式也有所不同: - **application/x-www-form-urlencoded**:参数形式为 `key=value&key2=value2`,需要对键和值分别进行 URL 编码。 - **application/json**:参数应为 JSON 格式字符串,可以通过 `JSONObject` 或 `Gson` 等库构建。 示例(x-www-form-urlencoded): ```java String postData = "username=" + URLEncoder.encode("user name", "UTF-8") + "&password=" + URLEncoder.encode("pass 123", "UTF-8"); ``` 示例(application/json): ```java JSONObject jsonParam = new JSONObject(); jsonParam.put("username", "user name"); jsonParam.put("password", "pass 123"); String postData = jsonParam.toString(); ``` ### 设置请求头与内容类型 确保设置正确的 `Content-Type` 请求头,以便服务器能正确解析请求数据。例如,对于 JSON 数据应设置: ```java connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); ``` 对于表单数据则设置为: ```java connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); ``` ### 完整示例:使用 HttpURLConnection 发送 POST 请求(JSON 格式) ```java try { URL url = new URL("http://example.com/api/login"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); connection.setDoOutput(true); JSONObject jsonParam = new JSONObject(); jsonParam.put("username", URLEncoder.encode("user name", "UTF-8")); jsonParam.put("password", URLEncoder.encode("pass 123", "UTF-8")); try (OutputStream os = connection.getOutputStream()) { byte[] input = jsonParam.toString().getBytes(StandardCharsets.UTF_8); os.write(input, 0, input.length); } int responseCode = connection.getResponseCode(); System.out.println("Response Code: " + responseCode); } catch (Exception e) { e.printStackTrace(); } ``` ### 常见错误排查建议 - 检查是否所有参数都进行了正确编码,尤其是含有空格、中文或特殊符号的情况。 - 使用 Postman 或 curl 验证请求结构是否正确,排除客户端代码问题。 - 查看服务器日志,获取更详细的错误信息,确认是请求格式还是服务端逻辑导致的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值