c# - 如何从 Android 向 C# Web API 发送 post 请求
问题描述
正如我的问题所述,我有一个 ac# web API (MVC.NET web API 2) 和一个控制器,该控制器具有一个 POST 方法,该方法接收发布请求 (Json String) 并将其写入日志文件(为简单起见,只需确保我已从 android 应用程序收到它)。另一方面,我有一个 Android 应用程序,它使用 Volley 将帖子字符串请求发送到提到的 API。我使用了几种方法,例如使用 Stringrequest、JsonObject 请求等,但似乎都不起作用(我得到 400 错误代码)。我已经在 postman 中测试了 API,一切正常……我在 API post 方法中接收到发布的字符串。请帮帮我,否则如果我无法完成这项任务,我的工作就会悬而未决。提前致谢。我的代码附在下面:
Web API 控制器
public class TestController : ApiController
{
// POST: api/test
[HttpPost]
[Route("api/test")]
public void Post()
{
string param = Request.Content.ReadAsStringAsync().Result;
EventLogger.writeErrorLog("Posted payload --> " + param)
}
}
发送帖子的Android代码
private void postDummy() {
String url = "http://10.0.2.2:1106/api/test";
RequestQueue requestQueue = Volley.newRequestQueue(this);
JSONObject jsonBodyObj = new JSONObject();
try{
jsonBodyObj.put("payload", "XYZ");
}catch (JSONException e){
e.printStackTrace();
}
final String requestBody = jsonBodyObj.toString();
Log.d("Json :--> ", requestBody);
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,
url, null, new Response.Listener<JSONObject>(){
@Override public void onResponse(JSONObject response) {
Log.i("Response",String.valueOf(response));
}
}, new Response.ErrorListener() {
@Override public void onErrorResponse(VolleyError error) {
VolleyLog.e("Error: ", error.getMessage());
}
}){
@Override
public String getBodyContentType() {
return "application/json";
}
@Override
public byte[] getBody() {
try {
return requestBody == null ? null : requestBody.getBytes("utf-8");
} catch (UnsupportedEncodingException uee) {
VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",
requestBody, "utf-8");
return null;
}
}
};
requestQueue.add(jsonObjectRequest);
}
来自 Android Studio 的错误日志
D/Json :-->: {"payload":"XYZ"}
E/Volley:[561] BasicNetwork.performRequest: http ://10.0.2.2:1106/api/test E/Volley的意外响应代码 400 :1 6.onErrorResponse:错误:
Postman 测试结果 Web API 测试结果截图
解决方案
我的情况非常相似,当我从 android volley(带有自定义标头)调用时,C# Web API 返回 400。解决方案(在我的情况下)很简单,只是我删除了“Content-Type”“application/json”并让 volley 做任何事情。
我的代码工作:ANDROID:
try{
JSONObject postparams = new JSONObject();
postparams.put("param1", "1");
postparams.put("param2", "2");
String URL=sesion.urlAire + "api/adjunto/getArchivo";
RequestQueue requestQueue= Volley.newRequestQueue(context);
JsonObjectRequest objectRequest=new JsonObjectRequest(
Request.Method.POST,
URL,
postparams,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
//do something
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//do something
}
}
)
{
@Override
public Map getHeaders() throws AuthFailureError {
HashMap headers = new HashMap();
//headers.put("Content-Type", "application/json");
headers.put("authorization", sesion.token);
return headers;
}
};
requestQueue.add(objectRequest);
}catch (Exception e){}
C#:
[HttpPost]
public CustomObject getArchivo(PostData postData) {
return new CustomObject{ param1="1" };
}
推荐阅读
- reactjs - 通过高阶组件的反应搜索过滤器(钩子)不起作用
- java - Firebase 实时数据库 - 检索数据 Android Studio
- azure - 当另一个流水线在另一个数据工厂上完成时运行流水线
- hadoop - 决定为 Hadoop map reduce 程序中最快处理指定的最佳 reducer 数量
- node.js - sequelize-hierarchy 未找到
- python - 尝试通过计数多字段 Django 对标签进行排序
- python - 用于文本分类的词嵌入
- reactjs - 停止挂载/卸载,通过防止卸载来保持组件存活
- laravel - laravel 尝试存储多个图像,但只存储它们多次
- java - 为什么我的日志文件没有在本地资源管理器中创建?