Sugar get_entry_list возвращает «неверный идентификатор сеанса» при запросе собраний для определенного пользователя - PullRequest
2 голосов
/ 28 января 2012

Я пытаюсь сделать запрос Sugar через его REST API, используя Java для записей в модуле Meetings для конкретного пользователя, а именно того, кто в данный момент вошел в систему.

Я пробую это уже несколько дней, пока пытаюсь найти решение.

Я сделал вызов login (), где получил идентификатор сеанса, а затем сделал вызов get_user_id (). С возвращенным идентификатором пользователя я пытаюсь запросить модуль Meetings с помощью get_entry_list ().

Чтобы получить Meetings, назначенные для UserID, он работает со следующей строкой запроса, где mUserId содержит возвращенный идентификатор пользователя get_user_id ():

queryString = "meetings.assigned_user_id='"+mUserId+"'";

Но я хочу не только получать собрания, на которые назначен пользователь, но и все собрания, в которых он участвует. Для этого я пытаюсь выполнить подзапрос к таблице встречи_пользователей в своем запросе.

Вот строки запроса, которые я пробовал, и которые работают на приглашение MySQL. Но когда я пытаюсь выполнить это через REST, возвращается «Неверный идентификатор сеанса»:

queryString = "meetings.id IN ( SELECT meetings_users.meeting_id FROM meetings_users WHERE meetings_users.user_id = '"+mUserId+"' )";

Кто-нибудь намекает на это? Какие условия приводят к «Неверному идентификатору сеанса» вообще?

Что также не работает, например добавляет "и удалено = '0'" к первому указанному запросу:

queryString = "meetings.assigned_user_id='"+mUserId+"' and deleted = '0'";

также не работает.

В соответствии с приведенным здесь полным примером кода, платформа Android, API уровня 8:

private JSONArray getEntryList(String moduleName,
        String selectFields[], String queryString, String orderBy, int max_results) throws JSONException, IOException, KeyManagementException, NoSuchAlgorithmException
{
    JSONArray jsoSub = new JSONArray();
    if (selectFields.length > 0)
    {
        for (int i = 0; i < selectFields.length; i++)
        {
            jsoSub.put(selectFields[i]);
        }
    }

            // get_entry_list expects parameters to be ordered, JSONObject does
            // not provide this, so I built my JSON String on my own
    String sessionIDPrefix = "{\"session\":\""+ mSessionId+ "\"," +
            "\"modulename\":\""+ moduleName+ "\"," +
            "\"query\":\""+ queryString + "\"," +
            "\"order_by\":\""+ orderBy + "\"," +
            "\"offset\":\""+ mNextOffset+ "\"," +
            "\"select_fields\":["+ jsoSub.toString().substring(
                    1, jsoSub.toString().length()-2)+ "\"],"+
            "\"max_results\":\""+ 20 + "\"}";

    String restData = sessionIDPrefix;
    Log.d(TAG, restData);

    String data = null;
    String baseurl = mUrl + REST_URI_APPEND;

    data = httpPost(baseurl+"?method=get_entry_list&input_type=json&response_type=json&rest_data="+restData);

    Log.d(TAG, data);   
    JSONObject jsondata = new JSONObject(data);

    mResultCount = jsondata.getInt("result_count");
    mNextOffset = jsondata.getInt("next_offset");

    return jsondata.getJSONArray("entry_list");
}

private String httpPost(String urlStr) throws IOException{
    String urlSplitted [] = urlStr.split("/", 4);
    String hostPort[] = urlSplitted[2].split(":");
    String hostname = hostPort[0];
    int port = 80;
    if (hostPort.length > 1)
        port = new Integer(hostPort[1]);

    String file = "/"+urlSplitted[3];

    Log.d(TAG, hostname + ", " + port + ", " +file);

    URL url = null;
    try {
        url = new URL("http", hostname, port, file);
    } catch (MalformedURLException e) {
        throw new IOException(mContext.getText(R.string.error_malformed_url).toString());
    }

    Log.d(TAG, "URL "+url.toString());
    HttpURLConnection conn = null;
    try {
        conn = (HttpURLConnection) url.openConnection();
    } catch (IOException e) {
        throw new IOException(mContext.getText(R.string.error_conn_creat).toString());  
    }
    conn.setConnectTimeout(60 * 1000);
    conn.setReadTimeout(60 * 1000);
    try {
        conn.setRequestMethod("POST");
    } catch (ProtocolException e) {
        throw new IOException(mContext.getText(R.string.error_post).toString());
    }
    conn.setDoOutput(true);
    conn.setDoInput(true);
    conn.setUseCaches(false);
    conn.setAllowUserInteraction(false);
    conn.setRequestProperty("Content-Type",
    "application/x-www-form-urlencoded");

    try {
        conn.connect();
    } catch (IOException e) {
        throw new IOException(mContext.getText(R.string.error_conn_open).toString()
                 + "\n" + e.getMessage());
    }

    int response = 0;
    String responseMessage = null;
    try {
        response = conn.getResponseCode();
        responseMessage = conn.getResponseMessage();
    } catch (IOException e) {
        conn.disconnect();
        throw new IOException(mContext.getText(R.string.error_resp_io).toString());
    }
    Log.d(TAG, "Exception Response "+ response);
    if (response != 200) {
        conn.disconnect();
        throw new IOException(mContext.getText(R.string.error_http).toString()
                 + "\n" + response + " " + responseMessage);
    }

    StringBuilder sb = null;
    try {
        BufferedReader rd = new BufferedReader(
        new InputStreamReader(conn.getInputStream()));
        sb = new StringBuilder();
        String line;
        while ((line = rd.readLine()) != null) {
            Log.d(TAG,"line " + line);
            sb.append(line);
        }
        rd.close();
    } catch (IOException e) {
        conn.disconnect();
        throw new IOException(mContext.getText(R.string.error_resp_read).toString());
    }

    conn.disconnect();

    if (sb.toString() == null)
    {
        throw new IOException(mContext.getText(R.string.error_resp_empty).toString());
    }

    return sb.toString();
}

Позвонив по коду выше:

        if (login() != OK)
    return null;

    mResultCount = -1;
    mNextOffset = 0;

    mUserId = getUserId();

    String fields[] = new String [] {
        "id",
        "name",
        "description",
        "location",
        "date_start",
        "date_end",
        "status",
        "type",
        "reminder_time",
        "parent_type",
        "parent_id",
        "deleted",
        "date_modified"
    };

    String queryString = null;
    if (syncAllUsers)
        queryString = "";
    else
    {
        queryString = "meetings.assigned_user_id = 'seed_sarah_id' and meetings.deleted = '0'"; 
        //queryString = "meetings.id IN ( SELECT meeting_id FROM meetings_users WHERE user_id ='"+mUserId+"'";
    }

    entryList.clear();

    while (mResultCount != 0)
    {
        if (!seamless_login())
            return null;

        JSONArray serverEntryList = getEntryList( 
                 "Meetings", fields, queryString, "date_start", 0);

        //... do sth with data
        }
        totalContactsResults += mResultCount;
    }
    logout();

login () возвращает действительный идентификатор сессии, а getUserId () возвращает правильный идентификатор. Весь код уже работает для извлечения контактов, а также для простого запроса, как указано выше.

Заранее спасибо

Марк

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

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

Мне не удалось зашифровать весь URL в моих методах httpPost (кажется, это не нужно).Но замена пробелов на «+» в строке запроса работает для меня:

queryString = "meetings.id+IN+(SELECT+meetings_users.meeting_id+FROM meetings_users+WHERE+meetings_users.user_id='"+mUserId+"')";

Если у кого-то есть более элегантный способ сделать это, пожалуйста, дайте мне знать.

1 голос
/ 04 февраля 2012

Возможно, вам лучше использовать вызов веб-службы get_relationships.

SugarRest.call('get_relationships', [SugarRest.session, 'Users', SugarRest.user_id, 'meetings', '', ['name'], 0, ''])

Это должно быть все, что тебе нужно. В параметре после «встреч» вы также можете передать дополнительный фильтр.

...