将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
相关产品推荐
相关产品推荐

