使用JSONObject作为参数发送JSON请求?

时间:2014-12-01 16:44:04

标签: android-json-rpc

我想用httpClient向web服务发出一个android-json请求。 我尝试调用的方法是"验证" 请求应具有以下结构:

{" ID":" ID""方法":"验证"" PARAMS":{ "用户":"机器人&#34 ;, "密码":"密码","客户":"客户"}," jsonrpc":" 2.0"}

必填参数:?school = SCHOOLNAME

这就是我的尝试:

class MyAsnycTask extends AsyncTask<String, String, String>{

    protected String doInBackground(String... params) {
        String apiUrl = "https://arche.webuntis.com/WebUntis/jsonrpc.do";
        JSONObject jsonParams = new JSONObject();
        JSONObject params1 = new JSONObject();


        HttpClient client = new DefaultHttpClient(); 

        // Prepare a request object
        HttpPost post = new HttpPost(apiUrl);
        post.setHeader("Content-type", "application/json");
        try {
            params1.put("?school","litec");
            params1.put("user", "40146720133271");
            params1.put("password", "1234567");

            jsonParams.put("id", "ID");
            jsonParams.put("method", "authenticate");
            jsonParams.put("params", params1);
            jsonParams.put("jsonrpc", "2.0");

            StringEntity se = new StringEntity(jsonParams.toString());
            post.setEntity(se);

        } catch (JSONException e1) {
            e1.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        // Execute the request
        try {
            HttpResponse response = client.execute(post);
            Log.d("log_response: ", response.getStatusLine().toString());

            // Get hold the response entity
            HttpEntity entity = response.getEntity();

            // if the response does not enclose the entity, there is no need
            // to worry about it

            if(entity != null){
                // a simple JSON Response read
                InputStream instream = entity.getContent();
                String result;

                // convert content of response to bufferedreader
                BufferedReader reader = new BufferedReader(new InputStreamReader(instream));
                StringBuilder sb = new StringBuilder();

                String line = null;
                try {
                    while ((line = reader.readLine()) != null){
                        sb.append(line + "\n");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }finally{
                    try{
                        instream.close();
                    }catch(IOException exp){
                        exp.printStackTrace();
                    }
                }
                result = sb.toString();
                Log.d("Result of the Request: ", result);
            }


        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return "OK";
    }
    protected String doInBackground(String result) {
        return result;
        // TODO Auto-generated method stub

    }
}

执行此操作后,我收到了请求:

{&#34; jsonrpc&#34;:&#34; 2.0&#34;&#34; ID&#34;:&#34;错误&#34;&#34;错误&#34 ;: {&#34;消息&#34;:&#34;无效的学校名称&#34;,&#34;代码&#34;: - 8500}}

所以它告诉我,我们的学校名称是假的。 那么我能做什么,是我传递参数错误的方法吗?

1 个答案:

答案 0 :(得分:0)

前段时间我看到了你的问题,但我无法回答。我也在使用WebUntis API,我不知道你是否解决了这个错误,但这是一个简单的错误。正如在API中提到的那样,方法'truenthicate'的强制参数是?school=SCHULNAME。您的代码中的网址为“https://arche.webuntis.com/WebUntis/jsonrpc.do”,但未提供必填参数SCHULNAME。您的网址应如下所示:https://arche.webuntis.com/WebUntis/jsonrpc.do?school=SCHULNAME。也许您必须添加请求的长度。例如。如果您使用方法truenthicate:{"id":"ID","method":"authenticate","params":{"user":"USR", "password":"PW", "client":"MyApp"},"jsonrpc":"2.0"} 在这种情况下,长度将是109.我希望这有帮助,即使这个问题超过一个月。对于其他Google员工:如果您没有使用AsyncTask,则必须返回true,不行。

编辑:

代码看起来像这样(我还没有测试过,我希望它有效):

class MyAsnycTask extends AsyncTask<String, String, String>{

protected String doInBackground(String... params) {
    String apiUrl = "https://arche.webuntis.com/WebUntis/jsonrpc.do?school=SCHULNAME"; //Changes here
    JSONObject jsonParams = new JSONObject();
    JSONObject params1 = new JSONObject();


    HttpClient client = new DefaultHttpClient(); 

    // Prepare a request object
    HttpPost post = new HttpPost(apiUrl);
    post.setHeader("Content-type", "application/json");
    try {
        params1.put("user", "40146720133271");
        params1.put("password", "1234567");
        params1.put("client", "seriouslysAndroidApp"); //You can change the name

        jsonParams.put("id", "ID");
        jsonParams.put("method", "authenticate");
        jsonParams.put("params", params1);
        jsonParams.put("jsonrpc", "2.0");

        StringEntity se = new StringEntity(jsonParams.toString());
         post.setHeader("Content-length",""+se.getContentLength()); //header has to be set after jsonparams are complete
        post.setEntity(se);

    } catch (JSONException e1) {
        e1.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    // Execute the request
    try {
        HttpResponse response = client.execute(post);
        Log.d("log_response: ", response.getStatusLine().toString());

        // Get hold the response entity
        HttpEntity entity = response.getEntity();

        // if the response does not enclose the entity, there is no need
        // to worry about it

        if(entity != null){
            // a simple JSON Response read
            InputStream instream = entity.getContent();
            String result;

            // convert content of response to bufferedreader
            BufferedReader reader = new BufferedReader(new InputStreamReader(instream));
            StringBuilder sb = new StringBuilder();

            String line = null;
            try {
                while ((line = reader.readLine()) != null){
                    sb.append(line + "\n");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                try{
                    instream.close();
                }catch(IOException exp){
                    exp.printStackTrace();
                }
            }
            result = sb.toString();
            Log.d("Result of the Request: ", result);
        }


    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return "OK";
}
protected String doInBackground(String result) {
    return result;
    // TODO Auto-generated method stub

}