Android Volley — как отправить необработанный текст и получить ответ json

Я новичок в Android и использую залп для связи с веб-сервисами. Сведения о почтальоне

Я обнаружил, что отправка необработанного текста в веб-службу будет работать только на почтальоне. Я пытаюсь использовать grant_type=password&username=myusername&password=mypassowrd, получая myusername и mypassword из двух editText из моей mainActivity, . Есть ли лучший способ добиться этого?

public class MainActivity extends AppCompatActivity {

Button btnLogin,btnFetch,btnExit;
EditText editTxtUsr,editTxtPass;
TextView txtView;
String uRL ="****";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnLogin=findViewById(R.id.buttonLogin);
    btnFetch=findViewById(R.id.buttonFetch);
    btnExit=findViewById(R.id.buttonExit);
    editTxtUsr=findViewById(R.id.editTextUsrname);
    editTxtPass=findViewById(R.id.editTextPassword);
    txtView=findViewById(R.id.textViewData);


    btnLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String wsURL = uRL + "/authtoken";
            //final String appData = "grant_type=password&username=" + editTxtUsr + "&password=" + editTxtPass;

            StringRequest request = new StringRequest(Request.Method.POST, wsURL, new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    if (response.equals("true")) {
                        Toast.makeText(MainActivity.this, "Login Successful", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(MainActivity.this, "Incorrect ", Toast.LENGTH_SHORT).show();
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {
                    Toast.makeText(MainActivity.this, "Some error occured" + volleyError, Toast.LENGTH_SHORT).show();
                }
            }) {
                @Override
                public Map<String,String> getHeaders() throws AuthFailureError {
                    Map<String, String> headers = new HashMap<>();
                    headers.put("Content-Type", "application/text");
                    headers.put("charset", "TYPE_UTF8_CHARSET");
                    return headers;

                }

                @Override
                protected Map<String,String> getParams() throws AuthFailureError {
                    Map<String, String> parameters = new HashMap<>();
                    parameters.put("grand_type", "SET_VALUE");
                    parameters.put("Username", editTxtUsr.getText().toString());
                    parameters.put("Password", editTxtPass.getText().toString());
                    return parameters;

                }
            };

            RequestQueue rQueue= Volley.newRequestQueue(MainActivity.this);
            rQueue.add(request);
        }
    });

    btnExit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            finish();
        }
    });
}
}

Я пробовал разные способы добиться этого, но безуспешно. Это пример моего кода, который я использую, чтобы попытаться подключиться к веб-службе.

Я получаю [253] BasicNetwork.performRequest: Неожиданный код ответа 400 для...

Я тщательно просмотрел StackOverflow, но не могу найти правильный ответ на свой вопрос. Любая помощь будет оценена по достоинству.


person Evangelos Boras    schedule 06.12.2017    source источник


Ответы (1)


Прошли дни, когда я работал над этим, но после того, как я опубликовал свой вопрос, я нашел решение после нескольких попыток. Ответ проще, чем я думал. Что вам нужно сделать, так это сделать объектный запрос и переопределить тело текстом, который вы хотите опубликовать. Ничего не пришлось менять в заголовках или параметрах. Я до сих пор не могу найти ответ, используя Stringrequest.

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

Где requestBody — это необработанный текст, который вы хотите отправить в виде строки.

person Evangelos Boras    schedule 06.12.2017