400 (Bad Request) на запрос get, параметр которого является URL - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь выполнить запрос на получение с параметром, параметр фактически является строкой, но строка является URL-адресом

, поэтому я получаю эту ошибку:

react-adal.js:50 OPTIONS https://abc-app.azurewebsites.net/api/Page/https://abcde.sharepoint.com/sites/Site1 400 (Bad Request)

MyСценарий выглядит так:

import React, { Component } from 'react';
import { Row, Col, Tabs, Menu, Dropdown, Button, Icon, message } from 'antd';
import PageHeader from '../../components/utility/pageHeader';
import Box from '../../components/utility/box';
import LayoutWrapper from '../../components/utility/layoutWrapper';
import ContentHolder from '../../components/utility/contentHolder';
import basicStyle from '../../settings/basicStyle';
import IntlMessages from '../../components/utility/intlMessages';
import { Cascader } from 'antd';
import { adalApiFetch } from '../../adalConfig';


export default class extends Component {
    constructor(props) {
        super(props);
        this.state = {options:[]};
        this.loadData = this.loadData.bind(this);
    }

    componentDidMount() {
        adalApiFetch(fetch, "/SiteCollection", {})
          .then(response => response.json())
          .then(json => {
            console.log(json);
            const firstLevelOptions = json.map(post => ({
                value: post.Url,
                label: post.Title,
                isLeaf: false    
            }));

            this.setState({
                options: firstLevelOptions
            });
          });
    }

    onChange = (value, selectedOptions) => {
        console.log("value:", value, "selectedOptions", selectedOptions);
    }

    loadData = (selectedOptions) => {
        console.log("loaddata", selectedOptions);

        const targetOption = selectedOptions[selectedOptions.length - 1];
        targetOption.loading = true;

        const options = {
            method: 'get',
              headers: {
                      'Content-Type': 'application/json; charset=utf-8'
              }                    
          };

        adalApiFetch(fetch, "/Page/"+targetOption.value, options)
          .then(response => response.json())
          .then(json => {
            targetOption.loading = false;
            console.log(json);
            const secondLevelOptions = json.map(comment => ({
                value: comment.id,
                label: comment.body,
                isLeaf: true    
            }));
            targetOption.children = secondLevelOptions;
            this.setState({
                options: [...this.state.options],
            });
            }
        );

    };

    render(){
        const { rowStyle, colStyle, gutter } = basicStyle;
        const TabPane = Tabs.TabPane;

        return (
        <div>
            <LayoutWrapper>
            <PageHeader>{<IntlMessages id="pageTitles.PageAdministration" />}</PageHeader>
            <Row style={rowStyle} gutter={gutter} justify="start">
            <Col md={12} sm={12} xs={24} style={colStyle}>
                <Box
                title={<IntlMessages id="pageTitles.siteCollectionsTitle" />}
                subtitle={<IntlMessages id="pageTitles.siteCollectionsTitle" />}
                >
                <ContentHolder>
                    <Cascader
                                options={this.state.options}
                                loadData={this.loadData}
                                onChange={this.onChange}
                                changeOnSelect
                    />
                </ContentHolder>
                </Box>
            </Col>
            </Row>
        </LayoutWrapper>
        </div>
        );
  }
}

Мой веб-API-код выглядит так:

 [Authorize]
    public class PageController : ApiController
    {
        [HttpGet]
        public async Task<ListItemCollection> Get(string sitecollectionUrl)
        {
            var tenant = await TenantHelper.GetActiveTenant();
            var siteCollectionStore = CosmosStoreFactory.CreateForEntity<TenantManagementWebApi.Entities.SiteCollection>();
            await siteCollectionStore.RemoveAsync(x => x.Title != string.Empty); // Removes all the entities that match the criteria
            string domainUrl = tenant.TestSiteCollectionUrl;
            string tenantName = domainUrl.Split('.')[0];
            string tenantAdminUrl = tenantName + "-admin.sharepoint.com";

            KeyVaultHelper keyVaultHelper = new KeyVaultHelper();
            await keyVaultHelper.OnGetAsync(tenant.SecretIdentifier);

            using (var context = new OfficeDevPnP.Core.AuthenticationManager().GetSharePointOnlineAuthenticatedContextTenant(sitecollectionUrl, tenant.Email, keyVaultHelper.SecretValue))
            {
                var pagesLibrary = context.Web.GetPagesLibrary();
                CamlQuery query = CamlQuery.CreateAllItemsQuery(100);
                var pages = pagesLibrary.GetItems(query);
                return pages;

            };
        }

    }

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

В зависимости от того, как была настроена маршрутизация, вы можете в конечном итоге не соответствовать предполагаемому действию.

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

Включите маршрутизацию атрибутов в WebApiConfig

//attribute routing
config.MapHttpAttributeRoutes();

//convention-based routes
//...

Обновите ApiController, чтобы использовать параметр catch-all

[Authorize]
[RoutePrefix("api/Page")]
public class PageController : ApiController {
    //GET api/Page/https://abcde.sharepoint.com/sites/Site1
    [HttpGet]
    [Route("{*sitecollectionUrl}")]
    public async Task<IHttpActionResult> Get(string sitecollectionUrl) {
        var tenant = await TenantHelper.GetActiveTenant();
        var siteCollectionStore = CosmosStoreFactory.CreateForEntity<TenantManagementWebApi.Entities.SiteCollection>();
        await siteCollectionStore.RemoveAsync(x => x.Title != string.Empty); // Removes all the entities that match the criteria
        string domainUrl = tenant.TestSiteCollectionUrl;
        string tenantName = domainUrl.Split('.')[0];
        string tenantAdminUrl = tenantName + "-admin.sharepoint.com";

        KeyVaultHelper keyVaultHelper = new KeyVaultHelper();
        await keyVaultHelper.OnGetAsync(tenant.SecretIdentifier);

        using (var context = new OfficeDevPnP.Core.AuthenticationManager().GetSharePointOnlineAuthenticatedContextTenant(sitecollectionUrl, tenant.Email, keyVaultHelper.SecretValue)) {
            var pagesLibrary = context.Web.GetPagesLibrary();
            CamlQuery query = CamlQuery.CreateAllItemsQuery(100);
            var pages = pagesLibrary.GetItems(query);
            return Ok(pages);
        }
    }
}
0 голосов
/ 03 февраля 2019

Вы должны кодировать URL-адрес, который вы отправляете в качестве параметра при вызове вашего API:

adalApiFetch(fetch, "/Page/"+encodeURIComponent(targetOption.value), options)

И, вероятно, вам нужно будет декодировать его на своем бэкэнде.

...