1

我正在尝试向 valance 发送用户更新,并且我正在寻找一个如何执行 put 的示例,特别是更新用户的 put。

我环顾四周,但没有看到如何使用 UserContext 使用 Java 发送 json 块的示例。

任何指向文档的指针将不胜感激。

4

2 回答 2

1

在对此进行了修补之后,并得到了我同事的大量建议(我不确定他是否想被确认,所以我就叫他比尔)。我们想出了以下Java方法(确实应该拆分为单独的方法但可以理解)

private static String getValanceResult(ID2LUserContext userContext,
        URI uri, String query, String sPost, String sMethod, int attempts) {

    String sError = "Error: An Unknown Error has occurred";
    if (sMethod == null) {
        sMethod = "GET";
    }

    URLConnection connection;
    try {
        URL f = new URL(uri.toString() + query);

        //connection = uri.toURL().openConnection();
        connection = f.openConnection();
    } catch (NullPointerException e) {
        return "Error: Must Authenticate";
    } catch (MalformedURLException e) {
        return "Error: " + e.getMessage();
    } catch (IOException e) {
        return "Error: " + e.getMessage();
    }


    StringBuilder sb = new StringBuilder();

    try {
        // cast the connection to a HttpURLConnection so we can examin the
        // status code
        HttpURLConnection httpConnection = (HttpURLConnection) connection;
        httpConnection.setRequestMethod(sMethod);
        httpConnection.setConnectTimeout(20000);
        httpConnection.setReadTimeout(20000);
        httpConnection.setUseCaches(false);
        httpConnection.setDefaultUseCaches(false);
        httpConnection.setDoOutput(true);


        if (!"".equals(sPost)) {
            //setup connection
            httpConnection.setDoInput(true);
            httpConnection.setRequestProperty("Content-Type", "application/json");


            //execute connection and send xml to server
            OutputStreamWriter writer = new OutputStreamWriter(httpConnection.getOutputStream());
            writer.write(sPost);
            writer.flush();
            writer.close();
        }

        BufferedReader in;
        // if the status code is success then the body is read from the
        // input stream
        if (httpConnection.getResponseCode() == 200) {
            in = new BufferedReader(new InputStreamReader(
                    httpConnection.getInputStream()));
            // otherwise the body is read from the output stream
        } else {
            in = new BufferedReader(new InputStreamReader(
                    httpConnection.getErrorStream()));
        }

        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            sb.append(inputLine);
        }
        in.close();

        // Determine the result of the rest call and automatically adjusts
        // the user context in case the timestamp was invalid
        int result = userContext.interpretResult(
                httpConnection.getResponseCode(), sb.toString());
        if (result == ID2LUserContext.RESULT_OKAY) {
            return sb.toString();
            // if the timestamp is invalid and we haven't exceeded the retry
            // limit then the call is made again with the adjusted timestamp
        } else if (result == userContext.RESULT_INVALID_TIMESTAMP
                && attempts > 0) {
            return getValanceResult(userContext, uri, query, sPost, sMethod, attempts - 1);
        } else {
            sError = sb + " " + result;
        }
    } catch (IllegalStateException e) {
        return "Error: Exception while parsing";
    } catch (FileNotFoundException e) {
        // 404
        return "Error: URI Incorrect";
    } catch (IOException e) {
    }
    return sError;
}
于 2012-05-14T21:33:50.980 回答
0

我可以从使用 api 的项目中共享一个 php 代码片段(与 java 的粗略逻辑相同)。用户上下文只准备 url 和特定环境的框架(java 运行时或 php 库)用于发布和检索结果(在这种情况下它使用 php CURL)。

        $apiPath = "/d2l/api/le/" . VERSION. "/" . $courseid . "/content/isbn/";
        $uri = $opContext->createAuthenticatedUri ($apiPath, 'POST');
        $uri = str_replace ("https", "http", $uri);
        curl_setopt ($ch, CURLOPT_URL, $uri);
        curl_setopt ($ch, CURLOPT_POST, true);

        $response = curl_exec ($ch);
        $httpCode = curl_getinfo ($ch, CURLINFO_HTTP_CODE);
        $contentType = curl_getinfo ($ch, CURLINFO_CONTENT_TYPE);
        $responseCode = $opContext->handleResult ($response, $httpCode, $contentType);

        $ret = json_decode($response, true);

        if ($responseCode == D2LUserContext::RESULT_OKAY)
        {
            $ret = "$response";
            $tryAgain = false;
        }
        elseif ($responseCode == D2LUserContext::RESULT_INVALID_TIMESTAMP)
        {
            $tryAgain = true;
        }
        elseif (isset ($ret['Errors'][0]['Message']))
        {
            if ($ret['Errors'][0]['Message'] == "Invalid ISBN")
            {
                $allowedOrgId[] = $c;
            }
            $tryAgain = false;
        }

发布消息的跟踪示例是:

PUT https://valence.desire2learn.com/d2l/api/lp/1.0/users/3691?x_b=TwULqrltMXvTE8utuLCN5O&x_a=L2Hd9WvDTcyiyu5n2AEgpg&x_d=OKuPjV-a0ZoSBuZvJkQLpFva2D59gNjTMiP8km6bdjk&x_c=UjCMpy1VNHsPCJOjKAE_92g1YqSxmebLHnQ0cbhoSPI&x_t=1336498251 HTTP/1.1
Accept-Encoding: gzip,deflate
Accept: application/json
Content-Type: application/json

{
"OrgDefinedId": "85033380",
"FirstName": "First",
"MiddleName": "Middle",
"LastName": "Last",
"ExternalEmail": "me@somehostname.com",
"UserName": "Username",
"Activation": {
        "IsActive": true
}
}
于 2012-05-08T21:54:25.497 回答