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

将C# Azure ML模型HTTP请求转为Android Volley实现遇请求体问题

解决Android Volley调用Azure ML模型的请求体构造问题

我仔细看了你的代码,核心问题是你没有把构造好的ScoreRequest对象转换成的JSON传入到JsonObjectRequest的请求体中——现在你传的是null,这就导致Azure ML服务根本没收到需要的特征数据,自然无法正确处理请求。

问题根源对比

你的C#代码是通过PostAsJsonAsync把scoreRequest对象直接序列化为JSON作为请求体发送的,但Android代码里,虽然你用Gson生成了正确的JSON字符串,却没把它作为请求体传递给Volley请求,相当于发了一个空的POST请求,这肯定会失败。

修正方案

这里给你两种可行的修正方式,选一种适合你的就行:

方案1:修复JsonObjectRequest的请求体传递

把Gson生成的JSON字符串转换成JSONObject,然后传入到JsonObjectRequest的第三个参数(也就是请求体参数):

// ... 前面的ScoreData、ScoreRequest构造代码保持不变 ...

Gson gson = new Gson();
String json = gson.toJson(SR);
try {
    // 把JSON字符串转成JsonObjectRequest需要的JSONObject
    JSONObject requestBody = new JSONObject(json);
    
    JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST, url, requestBody,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.d("response", response.toString() );
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // 这里添加详细错误日志,方便排查问题
                    Log.e("VolleyError", error.toString());
                    if (error.networkResponse != null) {
                        Log.e("ErrorStatus", "状态码:" + error.networkResponse.statusCode);
                        Log.e("ErrorData", "错误内容:" + new String(error.networkResponse.data));
                    }
                }
            }) {
        @Override
        public Map getHeaders() throws AuthFailureError {
            HashMap headers = new HashMap();
            headers.put("Content-Type","application/json");
            headers.put("Authorization","Bearer "+api_key);
            return headers;
        }
    };
    
    MyApplication.getInstance().addToRequestQueue(jsonObjReq, "headerRequest");
} catch (JSONException e) {
    e.printStackTrace();
    Log.e("JSONError", "JSON转换失败:" + e.getMessage());
}

方案2:用StringRequest替代JsonObjectRequest(更省心)

如果不想处理JSONObject的转换,直接用StringRequest会更简单,还能避免JSON转换时的异常:

// ... 前面的ScoreData、ScoreRequest构造代码保持不变 ...

Gson gson = new Gson();
final String json = gson.toJson(SR);

StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
        new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Log.d("response", response);
                // 要是需要处理JSON响应,这里可以把String转成JSONObject
                try {
                    JSONObject jsonResponse = new JSONObject(response);
                    // 这里写你的响应处理逻辑
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        },
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("VolleyError", error.toString());
                if (error.networkResponse != null) {
                    Log.e("ErrorStatus", "状态码:" + error.networkResponse.statusCode);
                    Log.e("ErrorData", "错误内容:" + new String(error.networkResponse.data));
                }
            }
        }) {
    @Override
    public Map getHeaders() throws AuthFailureError {
        HashMap headers = new HashMap();
        headers.put("Content-Type","application/json");
        headers.put("Authorization","Bearer "+api_key);
        return headers;
    }

    @Override
    public String getBodyContentType() {
        return "application/json; charset=utf-8";
    }

    @Override
    public byte[] getBody() throws AuthFailureError {
        try {
            return json.getBytes("utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }
};

MyApplication.getInstance().addToRequestQueue(stringRequest, "headerRequest");

额外提醒

  • 一定要保证你的ScoreData和ScoreRequest类的字段名和C#里的完全一致(比如FeatureVector、Instance这些首字母大写的字段),因为Gson默认会用字段名作为JSON的key,Azure ML服务需要完全匹配的字段才能正确解析特征数据。
  • 错误回调里的详细日志一定要保留,Azure ML服务经常会返回具体的错误原因(比如字段缺失、格式不对),这些日志能帮你快速定位问题。

内容的提问来源于stack exchange,提问作者Yousha Arif

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:48:17