JSON Post To Rails с Android - PullRequest
       20

JSON Post To Rails с Android

5 голосов
/ 26 ноября 2011

В настоящее время я работаю над приложением для Android, которое взаимодействует с приложением Ruby on Rails через XML и JSON.

В настоящее время я могу извлекать все свои сообщения со своего веб-сайта через XML, но, похоже, не могуpost через JSON.

В настоящее время мое приложение создает объект JSON из формы, которая выглядит примерно так:

{
    "post": {
        "other_param": "1", 
        "post_content": "Blah blah blah"
    }
}

На моем сервере я считаю, что метод Create в моем контроллере сообщений - этоустановить правильно: def create @post = current_user.posts.build (params [: post])

respond_to do |format|
  if @post.save
    format.html { redirect_to @post, notice: 'Post was successfully created.' }
    format.json { render json: @post, status: :created, location: @post }
    format.xml { render xml: @post, status: :created, location: @post }
  else
    format.html { render action: "new" }
    format.json { render json: @post.errors, status: :unprocessable_entity }
    format.xml { render xml: @post.errors, status: :unprocessable_entity }
  end
 end
end

И в моем приложении для Android у меня есть метод, который принимает объект JSON, который я опубликовал ранее в качестве параметранаряду с именем пользователя и паролем для аутентификации (аутентификация работает, я проверил ее, и да, простая HTTP-аутентификация, вероятно, не лучший выбор, но это быстрое и грязное исправление), и затем он отправляет объект JSON через HTTP POST врельсы сервер.Вот этот метод:

public static void sendPost(JSONObject post, String email, String password)
{
    DefaultHttpClient client = new DefaultHttpClient();
    client.getCredentialsProvider().setCredentials(new AuthScope(null,-1), new UsernamePasswordCredentials(email,password));
    HttpPost httpPost = new HttpPost("http://mysite.com/posts");
    JSONObject holder = new JSONObject();


    try {   
        holder.put("post", post);

        StringEntity se = new StringEntity(holder.toString());
        Log.d("SendPostHTTP", holder.toString());
        httpPost.setEntity(se);
        httpPost.setHeader("Content-Type","application/json");


    } catch (UnsupportedEncodingException e) {
        Log.e("Error",""+e);
        e.printStackTrace();
    } catch (JSONException js) {
        js.printStackTrace();
    }

    HttpResponse response = null;

    try {
        response = client.execute(httpPost);
    } catch (ClientProtocolException e) {
        e.printStackTrace();
        Log.e("ClientProtocol",""+e);
    } catch (IOException e) {
        e.printStackTrace();
        Log.e("IO",""+e);
    }

    HttpEntity entity = response.getEntity();

    if (entity != null) {
        try {
            entity.consumeContent();
        } catch (IOException e) {
            Log.e("IO E",""+e);
            e.printStackTrace();
        }
    }

}

В настоящее время, когда я вызываю этот метод и передаю ему правильный объект JSON, он ничего не делает, и я понятия не имею, почему или как выяснить, что происходит не так.

Правильно ли отформатирован мой JSON, действительно ли должен быть этот держатель вокруг других данных?Или мне нужно использовать что-то кроме HTTP POST?Или это просто что-то на конце Rails?Неправильный маршрут или диспетчер?

Буду очень признателен, если кто-нибудь укажет мне правильное направление, потому что я не знаю, куда идти отсюда.

1 Ответ

2 голосов
/ 26 ноября 2011

Я не в Rails, но, возможно, это проверка csrf , которую вы должны отключить (это случилось со мной раньше).

Вы можете использовать этот код для проверки статуса ответа:

HttpResponse response = client.execute(httpPost);       
StatusLine statusLine = response.getStatusLine();
Log.i(TAG, "HTTP Status Code: " + statusLine.getStatusCode());

РЕДАКТИРОВАТЬ: У меня есть JSONResponseHandler , который работал нормально для меня, когда я делаю запросы API. Вам просто нужно установить его в качестве второго параметра в вашем методе execute объекта HttpClient. Ответом будет JSONObject, и он выдаст исключение, если запрос был неудачным. Может быть, это поможет вам быстрее обойти эту проблему.

...