postman工具的json和XML请求格式以及数据接收和转换

本文介绍了在接口开发中如何使用Postman进行JSON和XML请求,包括对象格式、直接传参和对象数组等,并详细讲解了数据接收和转换的方法,如通过HttpServletRequest转换为String处理,以及使用@RequestBody和@RequestParam注解接收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序员新手,第一次写博客,自己的工作记录和学习笔记,如有不当之处,欢迎指正。

在接口开发工程中,我们会经常使用postman模拟数据请求,用来调试或测试代码,其中经常遇到类似于数据格式转换问题,下面是我个人对自己已解决问题的总结.
直接上图:
1.json使用对象格式请求:
check对象
2.json直接传参数请求:
直接传参数
3.json对象数组
对象数组json
4.xml请求格式
xml请求格式
json/xml格式的数据接收和处理:
数据接收方式有很多种,下面罗列一下我用过的方式:
1.使用HttpServletRequest 接收,将接收到的数据转为String,然后再做相应的处理。

接收数据代码 json/xml 格式请求均适用。

 @ResponseBody
	 @RequestMapping(value = "/add",produces = {"text/plain;charset=UTF-8"})
	 public Object check(HttpServletRequest request) {
	 	 String respData="";
		 String mapStr = HttpDataUtil.getReqData(request);
		 logger.info(mapStr);
		 String code = checkService.applyCheck(mapStr);
		 try {
			 respData = HttpDataUtil.buildPushResponse(code,"000000".equals(code) ? "接收成功":"内部异常",null);
		 } catch (IOException e) {
			 e.printStackTrace();
		 } catch (DocumentException e) {
			 e.printStackTrace();
		 }
		 return respData;
	 }

json/xml 格式的请求的数据处理

xml格式的处理。

    @Override
    public String applyCheck(String xmlStr) {
        String result = "000500";
        try {
           //将String转为map
            Map<String, Object> map = XmlJsonUtil.xml2map(xmlStr, true);
            //直接获取map里面的对象
            Map<String, Object> pushRequest = (Map<String, Object>) map.get("PUSHREQUEST");
            Map<String, Object> requestData = (Map<String, Object>) pushRequest.get("REQUESTDATA");
            Map<String, Object> functionRequestDetails = (Map<String, Object>) requestData.get("FUNCTIONREQUESTDETAILS");
            //map转bean
            Check check = (Check) MapUtil.transMap2Bean2(requestData, Check.class);
            result = checkRequest(check);
        } catch (Exception e) {
            logger.error("异常信息:" + e.getMessage());
            e.printStackTrace();
            return result;
        }
        return result;
    }

json格式的处理

@Override
    public String checkFromSelect(String jsonStr) {
        String result = "000500";
        try {
            //string 转map
            Map<String, Object> map = XmlJsonUtil.json2Map(jsonStr);
            //这里可以直接获取到check对象
            Map<String, Object> objectMap  =(Map<String, Object>)  map.get("check");
            
            //如果是对象数组,这边获取到的是数组,可以使用for循环取到object再转换
           /* ArrayList list  =(Map<String, Object>)  map.get("check");
            for (Check check : list ) {
                Map<String, Object> objectmap = (Map<String, Object>)list;
                Check check = (Check) MapUtil.transMap2Bean2(objectmap, Check.class);
            }*/
            
               //map转bean
            Check check = (Check) MapUtil.transMap2Bean2(objectMap, Check.class);
            result = checkRequest(check);
        } catch (Exception e) {
            logger.error("异常信息:" + e.getMessage());
            e.printStackTrace();
            return result;
        }
        return result;
    }

还有一些用过的接收数据方式:
1)使用 @RequestBody注解接收

    @ResponseBody
    @RequestMapping("/getPatient")
    public RespDataModel getPatientInfo(@RequestBody Map patientMap,HttpSession session) {
        try{
	        Patient patient = appPatientService.getPatientByNo((String)patientMap.get("health_card_no")); 
	        session.setAttribute("patientInfo",patient);
	        if(patient == null){
	        	return RespData.setData(RespData.ERROR, "查询无数据", null);
	        }
	        return RespData.setData(RespData.OK, "查询成功", patient);
        }catch (Exception e) {
        	return RespData.setData(RespData.ERROR, "查询异常", null);
		}
    }

2)使用 @RequestParam注解和HttpServletRequest 接收

   @ResponseBody
	@RequestMapping("/formUpload")
	public RespDataModel formUpload(
			@RequestParam("file") MultipartFile[] files,
			@RequestParam("account_id") int accountId,HttpServletRequest request) throws Exception {
		Map<String, Object> retData = new HashMap<String, Object>();
		String path = request.getSession().getServletContext()
				.getRealPath("/image/appImg");
		Img img =new Img();
		img.setCreate_user(Long.parseLong(String.valueOf(accountId)));
		if (appImgService.uploadImgList(files, img, path,"/image/appImg")) {
			return RespData.setData(RespData.OK, "上传成功", retData);
		} else {
			return RespData.setData(RespData.ERROR, "上传失败", retData);
		}
	}
import { http } from '@kit.NetworkKit'; import { BusinessError } from '@kit.BasicServicesKit'; let select: string[] = ["全部", "华语男", "华语女", "华语组合", "日韩男", "日韩女", "日韩组合", "欧美男", "欧美女", "欧美组合", "其他"]; @Entry @Component struct Index { @State singerList: ESObject[] = []; @State page: number = 1; aboutToAppear(): void { this.getData(this.page); } async getData(page: number) { let httpObj = http.createHttp(); // 使用完整的 URL let res = await httpObj.request(`https://kuwo.cn/api/www/artist/artistInfo?category=0&pn=${page}&rn=60`, { header: { platformtype: "h5", Referer: "https://kuwo.cn/" }, expectDataType: http.HttpDataType.OBJECT, method: http.RequestMethod.GET, }); console.log(res.result["data"].artistList[1].name) this.singerList = res.result["data"].artistList; httpObj.destroy(); } build() { Tabs({ barPosition: BarPosition.End }) { TabContent() { Column({ space: 5 }) { ForEach(this.singerList, (item: ESObject) => { Text(item.name) }) } } .tabBar('歌手') TabContent() { } .tabBar('蘑菇宠医') } } } // import { http } from '@kit.NetworkKit'; // import { BusinessError } from '@kit.BasicServicesKit'; // // // // let page:number=1; // let select:string[]=["全部","华语男","华语女","华语组合","日韩男","日韩女","日韩组合","欧美男","欧美女","欧美组合","其他"] // @Entry // @Component // struct Index { // @State singerList:ESObject[]=[] // // @State page:number=1; // aboutToAppear(): void { // this.getData(this.page); // } // async getData(page:number) { // let httpObj = http.createHttp(); // let res = await httpObj.request("https://kuwo.cn/api/www/artist/artistInfo?category=0&pn=${page}&&rn=60?page=", { // header: { // platformtype: "h5" // }, // expectDataType: http.HttpDataType.OBJECT, // method: http.RequestMethod.GET, // }); // this.singerList=res.result["data"].artistList // // httpObj.destroy(); // } // // // // build() { // Tabs({ barPosition: BarPosition.End }) { // TabContent() { // Column(){ // ForEach(this.singerList,(item:ESObject)=>{ // Text(item.aartist) // }) // } // } // .tabBar('歌手') // // TabContent() { // // } // .tabBar('蘑菇宠医') // // // } // } // } 在鸿蒙开发中,为什么我请求不到数据
03-12
<think>嗯,用户在鸿蒙开发中遇到了请求不到数据的问题。我需要仔细看一下他们提供的代码,找出可能的原因。首先,我会检查网络请求的部分,因为问题出在数据获取上。 用户使用了`http.createHttp()`创建了一个HTTP对象,然后调用了`request`方法。注意到在第一个代码块中,请求的URL是使用模板字符串构造的,看起来是正确的,参数pnrn分别代表页码每页数量。不过,在第二个注释掉的代码里,URL写错了,用了双问号,比如“pn=${page}&&rn=60?page=”,这可能导致参数解析错误,但用户现在使用的是第一个正确的URL,所以可能不是这个问题。 接下来检查请求头。用户设置了platformtype为h5,以及Referer头为“https://kuwo.cn/”。有些API会检查Referer,如果没有正确的来源可能会拒绝请求。这里看起来是正确的,但可能需要更多的头信息,比如Cookie或者User-Agent。例如,酷我音乐API可能需要csrf token或者登录信息,但用户代码中没有提供,这可能导致403 Forbidden错误。 另外,用户使用了`expectDataType: http.HttpDataType.OBJECT`,这表示期望返回的数据是对象格式。需要确认服务器返回的数据是否是JSON格式,否则解析会失败。可以查看控制台是否有解析错误,或者打印整个响应结果,检查结构是否正确。 在成功获取响应后,用户尝试访问`res.result["data"].artistList`。这里可能存在两个问题:一是响应的数据结构是否与代码中的路径一致,二是数组越界。例如,代码中有`console.log(res.result["data"].artistList[1].name)`,如果artistList为空或长度不足,访问索引1会导致错误,但用户的问题是无法获取数据,可能整个列表为空。 另外,异步请求的处理是否正确?用户使用async/await,应该没问题。但需要确认是否有未捕获的异常,比如网络错误或服务器返回错误。可以添加try-catch块来捕获BusinessError,并打印错误信息,帮助排查问题。 还有,跨域问题?鸿蒙应用作为客户端可能不受浏览器跨域限制,但服务器端是否允许请求?如果服务器检查了请求头中的Origin或Referer,可能需要配置正确的值。 最后,检查网络权限。鸿蒙应用需要在config.json中声明网络权限,否则无法发送HTTP请求。用户可能忘记添加这个权限,导致请求被阻止。 总结可能的原因: 1. 缺少必要的请求头(如Cookie、csrf token)。 2. 网络权限未配置。 3. URL构造错误(但当前代码正确)。 4. 服务器返回数据结构与代码预期不符。 5. 未处理错误导致请求失败但未捕获。</think>在鸿蒙开发中请求不到数据,可能由以下原因导致。让我们逐步分析并提供解决方案: --- ### **一、请求头缺失关键参数(主要原因)** 酷我音乐API需要验证`Cookie``csrf`令牌: ```typescript // 需要补充的请求头 header: { platformtype: "h5", Referer: "https://kuwo.cn/", Cookie: "你的实际Cookie", // 缺少关键认证信息 csrf: "你的CSRF令牌" // 需要从Cookie中提取 } ``` **验证方式**: 1. 通过浏览器开发者工具查看实际请求头 2. 使用Postman测试接口确认必需参数 --- ### **二、网络权限未配置** 在`config.json`中添加权限声明: ```json { "module": { "reqPermissions": [ { "name": "ohos.permission.INTERNET" } ] } } ``` --- ### **三、数据处理问题** #### 1. 安全访问响应数据 ```typescript // 修改前(存在越界风险): console.log(res.result["data"].artistList[1].name) // 修改后(安全写法): if (res.result?.data?.artistList?.length > 0) { this.singerList = res.result.data.artistList; } else { console.error("返回数据格式异常:", res); } ``` #### 2. 增加错误处理 ```typescript async getData(page: number) { try { let httpObj = http.createHttp(); // ...请求逻辑... } catch (error) { console.error("请求失败:", (error as BusinessError).code, error.message); // 显示错误提示 } finally { httpObj.destroy(); } } ``` --- ### **四、跨域/服务器限制** 1. 检查是否返回`403 Forbidden`错误 2. 尝试添加`User-Agent`头: ```typescript header: { ..., "User-Agent": "Mozilla/5.0 (Linux; HarmonyOS) AppleWebKit/537.36" } ``` --- ### **五、其他注意事项** 1. **分页参数验证**:确认`pn=${page}&rn=60`参数是否被服务器接受 2. **HTTPS证书**:检查是否遇到证书校验问题(测试时可临时关闭验证) 3. **数据绑定更新**:确保`@State singerList`的修改能触发UI刷新 --- ### **调试建议** 1. 打印完整响应: ```typescript console.log(JSON.stringify(res, null, 2)); ``` 2. 使用抓包工具(如Fiddler)监控实际请求 3. 测试其他开放API验证网络功能是否正常 通过以上步骤排查,应该能准确定位问题根源。如果服务器需要身份验证,建议联系酷我音乐开放平台获取正规API接入权限。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值