Как отправить почтовый запрос с Android на веб-API C # - PullRequest
0 голосов
/ 28 января 2019

Как говорится в моем вопросе, у меня есть AC # web API (MVC.NET web API 2) с контроллером, имеющим метод POST, который получает запрос post (Json String) и просто записывает его в файл журнала (для простоты простоубедившись, что я получил его из Android-приложения).С другой стороны, у меня есть приложение для Android, которое использует Volley для отправки запроса строки сообщения в указанный API.Я использовал пару подходов, таких как использование Stringrequest, запрос JsonObject и т. Д., Но ни один из них, похоже, не работал (я получаю 400 кодов ошибок).Я проверил API в почтальоне, и все в порядке ... Я получаю опубликованную строку в методе API post.Пожалуйста, помогите мне, ребята, или моя работа висит на волоске, если я не смог выполнить эту задачу.Заранее спасибо.Ниже приведен мой код:

Контроллер веб-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: Неожиданный код ответа 400 для http://10.0.2.2:1106/api/test E / Volley: 1 6.onErrorResponse: Ошибка:

Результат теста почтальона Скриншот для результата теста Web API

1 Ответ

0 голосов
/ 02 августа 2019

Мой случай был очень похож, веб-API C # возвращает 400, когда я звоню с Android Volley (с помощью пользовательских заголовков).Решение (в моем случае) было простым, просто я удалил «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" };
    }
...