UnityWebRequest调用Paycell API报406/415错误,求解决方案
解决UnityWebRequest调用Paycell API的406/415错误
问题背景
使用UnityWebRequest向Paycell API发送POST请求时,PostMan能正常返回200 OK,但C#实现要么返回406 Not Acceptable,要么移除请求头后返回415 Unsupported Media Type。
PostMan成功请求示例
请求体:
{ "msisdn": "5380521479", "requestHeader": { "applicationName": "PAYCELLTEST", "applicationPwd": "PaycellTestPassword", "clientIPAddress": "10.252.187.81", "transactionDateTime": "20160309084056197", "transactionId": "12345678901234567893" } }
错误原因分析
原代码存在两处关键问题:
- 初始化请求体后,错误执行
bodyRequest.requestHeader = new RequestHeader();,清空了所有请求头参数,导致发送的JSON中requestHeader为空对象,不符合API要求。 Accept头设置为text/csv,但API实际返回JSON格式,格式不匹配触发406错误。- UnityWebRequest.Post默认以form-data格式发送请求体,即使设置了Content-Type,也可能导致API无法识别JSON格式,触发415错误。
修复后的完整代码
using Newtonsoft.Json; using System.Collections; using System.Text; using UnityEngine; using UnityEngine.Networking; public class GetCardsRequest : MonoBehaviour { private string url = "https://tpay-test.turkcell.com.tr:443/tpay/provision/services/restful/getCardToken/getCards/"; public void GetCards() { StartCoroutine(MakeCardRequest()); } IEnumerator MakeCardRequest() { // 正确初始化请求体,保留完整的requestHeader参数 var bodyRequest = new GetCardRequest() { msisdn = "5380521479", requestHeader = new RequestHeader() { applicationName = "PORTALTEST", applicationPwd = "ZDyXmMLWE2z7OzJU", clientIPAddress = "10.252.187.81", transactionDateTime = "20160309084056197", transactionId = "12345678901234567893" } }; string jsonBody = JsonConvert.SerializeObject(bodyRequest); byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonBody); // 手动构造请求,使用UploadHandlerRaw确保JSON以原始字节发送 UnityWebRequest request = new UnityWebRequest(url, "POST"); request.uploadHandler = new UploadHandlerRaw(bodyRaw); request.downloadHandler = new DownloadHandlerBuffer(); // 设置匹配API要求的请求头 request.SetRequestHeader("Content-Type", "application/json"); request.SetRequestHeader("Accept", "application/json"); yield return request.SendWebRequest(); if (request.result != UnityWebRequest.Result.Success) { Debug.LogError($"请求失败: {request.error}, 状态码: {request.responseCode}"); Debug.Log($"响应内容: {request.downloadHandler.text}"); } else { Debug.Log("请求成功!"); Debug.Log($"响应内容: {request.downloadHandler.text}"); // 此处可反序列化响应结果 // var response = JsonConvert.DeserializeObject<GetCardResponse>(request.downloadHandler.text); } request.Dispose(); } } // 实体类保持不变 public class RequestHeader { public string applicationName { get; set; } public string applicationPwd { get; set; } public string clientIPAddress { get; set; } public string transactionDateTime { get; set; } public string transactionId { get; set; } } public class GetCardRequest { public string msisdn { get; set; } public RequestHeader requestHeader { get; set; } }
关键修复点说明
- 移除清空requestHeader的代码:确保请求体包含完整的认证参数,符合API的结构要求。
- 修正Accept请求头:设置为
application/json,与API返回格式匹配,解决406错误。 - 使用UploadHandlerRaw发送请求:避免Unity默认的form-data格式,确保JSON以原始字节形式发送,解决415错误。
内容的提问来源于stack exchange,提问作者htpck
相关产品推荐
相关产品推荐

