Как я могу изменить свой код, чтобы я мог добавить параметр тела в запрос post

#android #json #post #httprequest #internal-server-error

#Android #json #Публикация #httprequest #внутренняя ошибка сервера

Вопрос:

У меня есть проект, в котором у меня есть несколько URL-адресов, каждый из которых ведет к конечной точке. У меня есть подключение к этим конечным точкам через запрос post с JSON, в который я должен вставить параметр (т. Е.: «электронная почта»:»mail@etc.com «), чтобы получить токен, который я помещу в тело следующего запроса конечной точки, к которой я хочу подключиться.

Я попытался использовать addRequestProperty() и setRequestProperty() и я не могу понять, что не так. В журнале появляется сообщение об ошибке внутреннего сервера (код 500) при попытке выполнить http-запросы.

У меня есть конечная точка, которой мне не нужно передавать какие-либо параметры, и она отлично работает, предоставляя список «вещей», каждый из которых имеет идентификатор в своем результате JSON от конечной точки. Затем я должен использовать каждый идентификатор, поэтому, когда я нажимаю на «материал» из списка на экране, вызывается другая конечная точка, предоставляющая мне результаты с деталями этого «материала» в другом действии — для этой конечной точки мне нужно передать для любого элемента, который я нажимаю, его конкретный идентификатор, взятый из более раннего результата JSON.

частная статическая строка makeHttpRequestGetUser(URL url) вызывает исключение IOException {

     String jsonResponse = "";

    if(url == null)
        return jsonResponse;

    HttpURLConnection urlConnection = null;
    InputStream inputStream = null;
    try {
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setReadTimeout(10000);
        urlConnection.setConnectTimeout(15000);
        //urlConnection.setRequestProperty("Content-Type", "application/json");
        urlConnection.addRequestProperty("email", "t1@gmail.com");
        urlConnection.setRequestMethod("POST");
        urlConnection.connect();

        if(urlConnection.getResponseCode() == 200) {
            inputStream = urlConnection.getInputStream();
            jsonResponse = readFromStream(inputStream);
        } else {
            Log.e(TAG, "Error response code in GetUser request: "   urlConnection.getResponseCode());
        }
    } catch (IOException e) {
        Log.e(TAG, "Problem retrieving the "stuff" JSON result.", e);
    } finally {
        if(urlConnection != null)
            urlConnection.disconnect();
        if(inputStream != null)
            inputStream.close();
    }

    return jsonResponse;
}
  

частная статическая строка extractTokenFromJson (строка spotJSON) {

     if(TextUtils.isEmpty(spotJSON))
        return null;

    String tokenValue = "";

    try {
        JSONObject baseJsonResponse = new JSONObject(spotJSON);
        JSONObject result = baseJsonResponse.getJSONObject("result");
        tokenValue = result.getString("token");

    } catch (JSONException e) {
        Log.e(TAG, "Problem parsing the token", e);
    }

    return tokenValue;
}
  

Ответ №1:

Во-первых, почему вы не используете библиотеку Volley (рекомендованную Google) для взаимодействия с вашими rest API? Если вы решили изменить его на volley, запустите его здесь: Библиотека Volley для Android и упростите его с помощью небольшого класса, который я написал доVOLLEWEBCLIENT, вам просто нужно добавить его в свой проект и наслаждаться.

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

 setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
  

Я хочу, чтобы это помогло вам и спасло ваш день.

Комментарии:

1. Привет, Раваи! Спасибо, что нашли время ответить! Я посмотрю на библиотеку Volley и попытаюсь изменить ее, если это проще. Также спасибо за отзыв о моем коде!