1

この質問を投稿する前に、質問の仕方を確認するためにたくさん検索します。

Java を使用して OpenDaylight コントローラーに接続しようとしています。コントローラーによって提供される残りのサービスを使用して接続しようとしています。私の問題は、http 要求を送信すると、ログイン以外に取得できないことです。それが可能かどうかわかりません。コントローラからトポロジやその他の回答を取得する代わりに、ログイン フォームの html を取得しています。

また、このように接続する必要があるかどうかもわかりません。

ヘルプ/ガイダンスは大歓迎です。:)

接続を作成するための私のコードは次のとおりです。

public String getContent(String urls) throws  IOException {

    String cont="";

    CloseableHttpClient httpclient = HttpClients.createDefault();

    HttpPost httpPost = new HttpPost(urls);

    List <NameValuePair> nvps = new ArrayList <NameValuePair>();

    nvps.add(new BasicNameValuePair("j_username", "username"));

    nvps.add(new BasicNameValuePair("j_password", "password"));

    httpPost.setEntity(new UrlEncodedFormEntity(nvps));

    CloseableHttpResponse response2 = httpclient.execute(httpPost);

    try {

        System.out.println(response2.getStatusLine());

        HttpEntity entity2 = response2.getEntity();

        BufferedReader reader =new BufferedReader(new InputStreamReader(entity2.getContent()));

        String line="";

        while((line=reader.readLine())!=null){
            cont+=line+"\n";
        }


    } finally {
        response2.close();

    }           

    return cont;
}

コードを実行すると、次のように出力されます。

HTTP/1.1 200 OK

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>OpenDaylight - Login</title>
<script src="/js/bootstrap.min.js"></script>    
<script type="text/javascript">
    less = {
        env: "production"
    };
</script>
<script src="/js/less-1.3.3.min.js"></script>
</head>
<body>
<form action="j_security_check;jsessionid=LONGID" id="form" method="post">
<div class="container">
 <div class="content">
   <div class="login-form">
     <div id="logo"></div>
       <fieldset>
         <div class="control-group">
           <input type="text" name="j_username" placeholder="Username">
         </div>
         <div class="control-group">
           <input type="password" name="j_password" placeholder="Password">
         </div>
         <button class="btn btn-primary" type="submit" value="Log In" >
        <div class="icon-login"></div> Log In</button>
       </fieldset>
   </div>
 </div>
 </div> 
 </form>
 </body>
 </html>
4

2 に答える 2

2

問題は認証にあるようです。ユーザー名とパスワードは Base64 にエンコードする必要があります。フローの詳細を JSON 形式で取得する以下のサンプル コードをお試しください。同じ方法でトポロジの詳細を取得してみることができます。

commons-codec ライブラリは、ここからダウンロードできます。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import org.apache.commons.codec.binary.Base64;

public class OpenDayLightUtils {

    public static void getFlowDetails() {

    String user = "admin";
    String password = "admin";
    String baseURL = "http://192.168.100.1:8080/controller/nb/v2/flowprogrammer";
    String containerName = "default";

    try {

        // Create URL = base URL + container
        URL url = new URL(baseURL + "/" + containerName);

        // Create authentication string and encode it to Base64
        String authStr = user + ":" + password;
        String encodedAuthStr = Base64.encodeBase64String(authStr.getBytes());

        // Create Http connection
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        // Set connection properties
        connection.setRequestMethod("GET");
        connection.setRequestProperty("Authorization", "Basic " + encodedAuthStr);
        connection.setRequestProperty("Accept", "application/json");

        // Get the response from connection's inputStream
        InputStream content = (InputStream) connection.getInputStream();

        BufferedReader in = new BufferedReader(new InputStreamReader(content));
        String line = "";
        while ((line = in.readLine()) != null) {
        System.out.println(line);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    }
}
于 2014-05-08T06:03:58.667 に答える
0

このリンクは、ODL のすべての RESTConf Api への完全な参照を提供します: OpenDaylight_Controller:MD-SAL:Model_Reference

開始するのに適したもう 1 つの場所: OpenDaylight OpenFlow Plugin:User Guide

たとえば、トポロジーを見つけたい場合は、GET 要求を次のアドレスに送信する必要があります: http://:8080/restconf/operational/network-topology:network-topology/topology/flow:1/

したがって、URN 名前空間は、ODL コントローラー内のどのモジュール/バンドルと通信するかを示します。別の例は、http://:8080/restconf/operational/opendaylight-inventory:nodes/node/openflow:1 です。 openflow ノード 'openflow:1' に関する情報が表示されます。

Openflow ルールなど、何かをプッシュする場合は、XML 本文をヘッダー Content-Type' : 'application/xml' および 'Accept':'application/xml と共に PUT に添付するだけです。これは、アプリケーション用に Python で作成した「lib」です。何かインスピレーションが得られるかもしれません。

import sys
import json
import httplib2

#Base URLs for Config and operational
baseUrl = 'http://192.168.231.246:8080'
confUrl = baseUrl + '/restconf/config/'
operUrl = baseUrl + '/restconf/operational/'

#"Old" REST APIs that still are used
sdSalUrl = baseUrl + '/controller/nb/v2/'

#Specific REST URLs
findNodes = operUrl + '/opendaylight-inventory:nodes/'
findTopo = operUrl + '/network-topology:network-topology/'
findNodeConnector = operUrl + '/opendaylight-inventory:nodes/node/node-connector/'
findTopology = operUrl + '/network-topology:network-topology/topology/flow:1/'
findFlow = confUrl +'/opendaylight-inventory:nodes/node/openflow:1/table/0/'

h = httplib2.Http(".cache")
h.add_credentials('admin', 'admin')

#Functions for  
def get(url):
    resp, xml = h.request(
        url,
        method = "GET",
        headers = {'Content-Type' : 'application/xml'}
        )
    return xml
def put(url, body):
    resp, content = h.request(
        url, 
        method = "PUT",
        body = body,
        headers = {'Content-Type' : 'application/xml', 'Accept':'application/xml'}
        )
    return resp, content
def delete(url):
    resp, content = h.request(
        url,
        method = "DELETE"
        )
    return resp

def get_active_hosts():
    resp, content = h.request(sdSalUrl + 'hosttracker/default/hosts/active/', "GET")
    hostConfig = json.loads(content)
    hosts = hostConfig['hostConfig']
    return hosts

あ、ちなみに。ODL の OVSDB 開発者の 1 人が以前に同様の回答をしました: networkstatic's answer

于 2014-04-23T14:33:25.873 に答える