You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"
   }
}     

错误原因分析

原代码存在两处关键问题:

  1. 初始化请求体后,错误执行bodyRequest.requestHeader = new RequestHeader();,清空了所有请求头参数,导致发送的JSON中requestHeader为空对象,不符合API要求。
  2. Accept头设置为text/csv,但API实际返回JSON格式,格式不匹配触发406错误。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:01:18