Невозможно взаимодействовать с узлами в Интернете с помощью приложения angular

#angular #corda

#angular #corda

Вопрос:

Я передал аккредитив cordapp cordapp, который делает то же самое, я скопировал содержимое dist и поместил его в ресурс, но при запуске моего spring server в моем cordapp и переходе к порту моего узла я не могу видеть пользовательский интерфейс, может кто-нибудь помочь в этом.

Я получаю ошибку 404 каким-то образом мой порт выбирается моим приложением angular, которое я использовал window.Расположение.href для взаимодействия с моим открытым API в моем cordapp и использования динамического URL-адреса, поскольку существует 3 узла, и у всех разные порты.

вот содержимое файла corda api:

 @RestController
@RequestMapping("/api/trading/") // The paths for GET and POST requests are relative to this base path.
class MainController(rpc: NodeRPCConnection) {

    companion object {
        private val logger = LoggerFactory.getLogger(RestController::class.java)
    }

    private val myLegalName = rpc.proxy.nodeInfo().legalIdentities.first().name
    private val proxy = rpc.proxy

    /**
     * Returns the node's name.
     */
    @GetMapping(value = "me", produces = arrayOf(MediaType.APPLICATION_JSON_VALUE))
    fun whoami() = mapOf("me" to myLegalName)

    /**
     * Returns all parties registered with the network map service. These names can be used to look up identities using
     * the identity service.
     */
    @GetMapping(value = "peers", produces = arrayOf(MediaType.APPLICATION_JSON_VALUE))
    fun getPeers(): Map<String, List<CordaX500Name>> {
        val nodeInfo = proxy.networkMapSnapshot()
        return mapOf("peers" to nodeInfo
                .map { it.legalIdentities.first().name }
                //filter out myself, notary and eventual network map started by driver
                .filter { it.organisation !in (SERVICE_NAMES   myLegalName.organisation) })
    }

    /**
     * Displays all IOU states that exist in the node's vault.
     */
    @GetMapping(value = "trades", produces = arrayOf(MediaType.APPLICATION_JSON_VALUE))
    fun getTrades() : ResponseEntity<List<StateAndRef<TradeState>>> {
        return ResponseEntity.ok(proxy.vaultQueryBy<TradeState>().states)
    }

    /**
     * Initiates a flow to agree an IOU between two parties.
     *
     * Once the flow finishes it will have written the IOU to ledger. Both the lender and the borrower will be able to
     * see it when calling /spring/api/ious on their respective nodes.
     *
     * This end-point takes a Party name parameter as part of the path. If the serving node can't find the other party
     * in its network map cache, it will return an HTTP bad request.
     *
     * The flow is invoked asynchronously. It returns a future when the flow's call() method returns.
     */

    @PostMapping(value = "create-trade", produces = arrayOf("text/plain"), headers = arrayOf("Content-Type=application/x-www-form-urlencoded"))
    fun createIOU(request: HttpServletRequest): ResponseEntity<String> {
        val counter = request.getParameter("counterParty")
        val tradeStatus = request.getParameter("tradeStatus")
        val userId = request.getParameter("userId")
        val assetCode = request.getParameter("assetCode")
        val orderType = request.getParameter("orderType")
        val txDate = request.getParameter("transactionDate")
        val sdf = SimpleDateFormat("dd/MM/yyyy")
        val transactionDate = sdf.parse(txDate)
        val transactionAmount = request.getParameter("transactionAmount").toDouble()
        val transactionFees = request.getParameter("transactionFees").toDouble()
        val transactionUnits = request.getParameter("transactionUnits").toDouble()
        val transactionPrice = request.getParameter("transactionAmount").toDouble()
        val transactionId = request.getParameter("transactionId")
        if (counter == null) {
            throw IllegalArgumentException("Query parameter 'Counter partyName' missing or has wrong format")
        }
        if (transactionAmount <= 0 ) {
            throw IllegalArgumentException("Query parameter 'Transaction Amount' must be non-negative")
        }
        val partyX500NameCounter = CordaX500Name.parse(counter)
        val counterParty = proxy.wellKnownPartyFromX500Name(partyX500NameCounter) ?:
        throw IllegalArgumentException("Target string "$counter" doesn't match any nodes on the network.")

        val producer = Producer()
        return try {
            val signedTx = proxy.startTrackedFlowDynamic(TradeFlow.Initiator::class.java,tradeStatus,counterParty,userId,assetCode,orderType,transactionAmount,transactionFees,transactionUnits,transactionId,transactionDate,transactionPrice).returnValue.getOrThrow()
            val mapper = JacksonSupport.createNonRpcMapper()
            val result = mapper.writeValueAsString(signedTx)
            producer.send(result)
            ResponseEntity.status(HttpStatus.CREATED).body("Transaction id ${signedTx.id} committed to ledger.n")
        } catch (ex: Throwable) {
            logger.error(ex.message, ex)
            producer.send(ex.toString())
            ResponseEntity.badRequest().body(ex.message!!)
        }
    }

    /**
     * Displays all IOU states that only this node has been involved in.
     */
    @GetMapping(value = "getTrade", produces = arrayOf(MediaType.APPLICATION_JSON_VALUE))
    fun getTransactionDetails(@RequestParam("linearID") linearID: String): ResponseEntity<List<StateAndRef<TradeState>>>? {
        if (linearID == null) {
            ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Linear Id cannot be null.n")
        }
        val idParts = linearID.split('_')
        val uuid = idParts[idParts.size - 1]
        val criteria = QueryCriteria.LinearStateQueryCriteria(linearId = listOf(UniqueIdentifier.fromString(uuid)),status = Vault.StateStatus.ALL)
        return ResponseEntity.ok(proxy.vaultQueryBy<TradeState>(criteria=criteria).states)
    }
  

вот мой файл angular 6 app.route.ts:

     import { LandingPageComponent } from './Landing-Page/landing-page/landing-page.component';
    import { Routes, RouterModule } from "@angular/router";


    const APP_ROUTES:Routes=[
        {
             path:'', component: LandingPageComponent
         }
    ]


export const APP_ROUTES_PROVIDER = RouterModule.forRoot(APP_ROUTES);
  

Целевая страница содержит содержимое пользовательского интерфейса, которое я должен видеть при взаимодействии с моими узлами

вот мой служебный файл:

 import { Injectable } from '@angular/core';
import { map } from 'rxjs/operators';
import { Http, Response, Headers, RequestOptions,URLSearchParams } from '@angular/http';
import { Subject } from 'rxjs';


@Injectable()
export class CordaContentService {
  payload;
  constructor(private http:Http) { }

  private trades = new Subject<any>();

  // Observable string streams
  tradeMethodCalled$ = this.trades.asObservable();

  getAllTrades() {
    let headers = new Headers();
    headers.append('Content-Type', 'application/json');
    this.http.get('http://localhost:50005/api/trading/trades',{
     headers: headers
   }).pipe(map((res : any)=>res.json()))
   .subscribe(
    (res) => {
     this.payload = res;
     console.log('success');
     this.trades.next();
    }
   );
   }
  

Я вызываю эту функцию getAllTrades из раздела ngoninit класса app.component.ts, но когда я ввожу этот URL-адрес, я получаю ошибку http 404.
я выполнил эту команду и скопировал содержимое папки dist в папку ресурсов
cordapp ng build —prod —aot —build-optimizer
Есть ли что-то, что я делаю неправильно?

Комментарии:

1. Что произойдет, если вы посмотрите на rest URL напрямую, а не через приложение angular? Можете ли вы видеть какие-либо другие страницы из приложения Angular? Правильно ли развернуто приложение angular? На каком порту запущен ваш узел? Как вы подключаетесь к нему из своего класса kotlin? Используете ли вы там правильный порт? Есть сообщения об ошибках? Какие-либо трассировки стека? Какие-либо журналы? Здесь недостаточно информации, чтобы эффективно помочь.

2. Когда я просматриваю URL-адрес непосредственно из postman, я получаю результаты, которые я выполнил, как указано в аккредитиве cordapp. Я использую порт моего узла. Я уже упоминал rest api, определенный там.

3. Мой порт — 50005, я ничего не вижу, в идеале мой компонент целевой страницы должен загружаться по этому URL-адресу local host: 50005, как указано в файле route.ts, но я ничего не вижу

4. «я скопировал содержимое dist и поместил его в ресурс» — скопировал какой dist в какой каталог ресурсов? «но при запуске моего сервера spring в моем cordapp» — сервер spring отсутствует в вашем cordapp, это отдельный jar. Вы упаковываете с помощью Spring Boot? Используете ли вы rest api и веб-страницу вместе как Spring bootJar? Или что-то еще?

5. Нет, для запуска сервера есть задания класса, я просто запускаю это, извините, я, возможно, неправильно произнес, и что касается папки dist, то это преобразуется в chk github.com/corda/LetterOfCredit/blob/release/… Я сделал это

Ответ №1:

Основываясь на приведенной выше информации и комментариях, я думаю, что вы, возможно, использовали неправильный URL-адрес в приложении angular.

Как правило, если у вас правильно запущен сервер Spring и вы вызываете правильный API, вы не увидите сообщение об ошибке 404 страница не найдена.

Я бы посоветовал вам посмотреть пример здесь: https://github.com/corda/samples-kotlin/blob/master/Advanced/obligation-cordapp/clients/src/main/kotlin/net/corda/training/server/MainController.kt