Store preferred http method for connections

This commit is contained in:
Nyall Dawson 2025-03-17 09:33:18 +10:00
parent e0f5602fed
commit b774d3ecae
14 changed files with 109 additions and 1 deletions

View File

@ -97,6 +97,13 @@ Returns the "test connection" button.
Qgis::HttpMethod preferredHttpMethod() const;
%Docstring
Returns the selected preferred HTTP method.
.. versionadded:: 3.44
%End
virtual QString wfsSettingsKey( const QString &base, const QString &connectionName ) const;
%Docstring

View File

@ -97,6 +97,13 @@ Returns the "test connection" button.
Qgis::HttpMethod preferredHttpMethod() const;
%Docstring
Returns the selected preferred HTTP method.
.. versionadded:: 3.44
%End
virtual QString wfsSettingsKey( const QString &base, const QString &connectionName ) const;
%Docstring

View File

@ -76,6 +76,7 @@ const QgsSettingsEntryString *QgsOwsConnection::settingsUsername = new QgsSettin
const QgsSettingsEntryString *QgsOwsConnection::settingsPassword = new QgsSettingsEntryString( QStringLiteral( "password" ), sTreeOwsConnections ) ;
const QgsSettingsEntryString *QgsOwsConnection::settingsAuthCfg = new QgsSettingsEntryString( QStringLiteral( "authcfg" ), sTreeOwsConnections ) ;
const QgsSettingsEntryInteger *QgsOwsConnection::settingsFeatureCount = new QgsSettingsEntryInteger( QStringLiteral( "feature-count" ), sTreeOwsConnections, 10 );
const QgsSettingsEntryEnumFlag<Qgis::HttpMethod> *QgsOwsConnection::settingsPreferredHttpMethod = new QgsSettingsEntryEnumFlag<Qgis::HttpMethod>( QStringLiteral( "http-method" ), sTreeOwsConnections, Qgis::HttpMethod::Get, QString() );
QgsOwsConnection::QgsOwsConnection( const QString &service, const QString &connName )
: mConnName( connName )
@ -260,6 +261,24 @@ QgsDataSourceUri &QgsOwsConnection::addWfsConnectionSettings( QgsDataSourceUri &
uri.setParam( QStringLiteral( "maxNumFeatures" ), maxnumFeatures );
}
const Qgis::HttpMethod httpMethod = settingsPreferredHttpMethod->value( {service.toLower(), connName} );
switch ( httpMethod )
{
case Qgis::HttpMethod::Get:
// default, we don't set to explicitly set
break;
case Qgis::HttpMethod::Post:
uri.setParam( QStringLiteral( "httpMethod" ), QStringLiteral( "post" ) );
break;
case Qgis::HttpMethod::Head:
case Qgis::HttpMethod::Put:
case Qgis::HttpMethod::Delete:
// not supported
break;
}
return uri;
}

View File

@ -116,6 +116,7 @@ class CORE_EXPORT QgsOwsConnection : public QObject
static const QgsSettingsEntryString *settingsPassword;
static const QgsSettingsEntryString *settingsAuthCfg;
static const QgsSettingsEntryInteger *settingsFeatureCount;
static const QgsSettingsEntryEnumFlag<Qgis::HttpMethod> *settingsPreferredHttpMethod;
#endif

View File

@ -527,6 +527,7 @@ QDomDocument QgsManageConnectionsDialog::saveWfsConnections( const QStringList &
el.setAttribute( QStringLiteral( "invertAxisOrientation" ), QgsOwsConnection::settingsInvertAxisOrientation->value( { QStringLiteral( "wfs" ), connections[i] } ) );
el.setAttribute( QStringLiteral( "username" ), QgsOwsConnection::settingsUsername->value( { QStringLiteral( "wfs" ), connections[i] } ) );
el.setAttribute( QStringLiteral( "password" ), QgsOwsConnection::settingsPassword->value( { QStringLiteral( "wfs" ), connections[i] } ) );
el.setAttribute( QStringLiteral( "httpMethod" ), QgsOwsConnection::settingsPreferredHttpMethod->value( { QStringLiteral( "wfs" ), connections[i] } ) == Qgis::HttpMethod::Post ? QStringLiteral( "post" ) : QStringLiteral( "get" ) );
root.appendChild( el );
}
@ -1080,6 +1081,7 @@ void QgsManageConnectionsDialog::loadWfsConnections( const QDomDocument &doc, co
QgsOwsConnection::settingsPagingEnabled->setValue( child.attribute( QStringLiteral( "pagingenabled" ) ), { QStringLiteral( "wfs" ), connectionName } );
QgsOwsConnection::settingsIgnoreAxisOrientation->setValue( child.attribute( QStringLiteral( "ignoreAxisOrientation" ) ).toInt(), { QStringLiteral( "wfs" ), connectionName } );
QgsOwsConnection::settingsInvertAxisOrientation->setValue( child.attribute( QStringLiteral( "invertAxisOrientation" ) ).toInt(), { QStringLiteral( "wfs" ), connectionName } );
QgsOwsConnection::settingsPreferredHttpMethod->setValue( child.attribute( QStringLiteral( "httpMethod" ) ).compare( QLatin1String( "post" ), Qt::CaseInsensitive ) == 0 ? Qgis::HttpMethod::Post : Qgis::HttpMethod::Get, { QStringLiteral( "wfs" ), connectionName } );
if ( !child.attribute( QStringLiteral( "username" ) ).isEmpty() )
{

View File

@ -89,6 +89,10 @@ QgsNewHttpConnection::QgsNewHttpConnection( QWidget *parent, ConnectionTypes typ
cmbVersion->addItem( tr( "OGC API - Features" ) );
connect( cmbVersion, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsNewHttpConnection::wfsVersionCurrentIndexChanged );
mComboHttpMethod->addItem( QStringLiteral( "GET" ), QVariant::fromValue( Qgis::HttpMethod::Get ) );
mComboHttpMethod->addItem( QStringLiteral( "POST" ), QVariant::fromValue( Qgis::HttpMethod::Post ) );
mComboHttpMethod->setCurrentIndex( mComboHttpMethod->findData( QVariant::fromValue( Qgis::HttpMethod::Get ) ) );
cmbFeaturePaging->clear();
cmbFeaturePaging->addItem( tr( "Default (trust server capabilities)" ) );
cmbFeaturePaging->addItem( tr( "Enabled" ) );
@ -287,6 +291,11 @@ QLineEdit *QgsNewHttpConnection::wfsPageSizeLineEdit()
return txtPageSize;
}
Qgis::HttpMethod QgsNewHttpConnection::preferredHttpMethod() const
{
return mComboHttpMethod->currentData().value< Qgis::HttpMethod >();
}
QString QgsNewHttpConnection::wfsSettingsKey( const QString &base, const QString &connectionName ) const
{
return base + connectionName;
@ -347,6 +356,7 @@ void QgsNewHttpConnection::updateServiceSpecificSettings()
else
cmbFeaturePaging->setCurrentIndex( static_cast<int>( QgsNewHttpConnection::WfsFeaturePagingIndex::DEFAULT ) );
mComboHttpMethod->setCurrentIndex( mComboHttpMethod->findData( QVariant::fromValue( QgsOwsConnection::settingsPreferredHttpMethod->value( detailsParameters ) ) ) );
txtPageSize->setText( QgsOwsConnection::settingsPagesize->value( detailsParameters ) );
}
@ -449,6 +459,7 @@ void QgsNewHttpConnection::accept()
QgsOwsConnection::settingsVersion->setValue( version, detailsParameters );
QgsOwsConnection::settingsMaxNumFeatures->setValue( txtMaxNumFeatures->text(), detailsParameters );
QgsOwsConnection::settingsPagesize->setValue( txtPageSize->text(), detailsParameters );
QgsOwsConnection::settingsPreferredHttpMethod->setValue( mComboHttpMethod->currentData().value< Qgis::HttpMethod >(), detailsParameters );
QString pagingEnabled = QStringLiteral( "default" );
switch ( cmbFeaturePaging->currentIndex() )

View File

@ -169,6 +169,13 @@ class GUI_EXPORT QgsNewHttpConnection : public QDialog, private Ui::QgsNewHttpCo
*/
QLineEdit *wfsPageSizeLineEdit() SIP_SKIP;
/**
* Returns the selected preferred HTTP method.
*
* \since QGIS 3.44
*/
Qgis::HttpMethod preferredHttpMethod() const;
/**
* Returns the url.
* \since QGIS 3.2

View File

@ -18,7 +18,7 @@
#include "qgswfsconstants.h"
#include "qgslogger.h"
#include "qgssettingsentryimpl.h"
#include "qgssettingsentryenumflag.h"
static const QString SERVICE_WFS = QStringLiteral( "WFS" );
@ -60,6 +60,27 @@ QgsWfsConnection::QgsWfsConnection( const QString &connName )
mUri.setParam( QgsWFSConstants::URI_PARAM_WFST_1_1_PREFER_COORDINATES, settingsPreferCoordinatesForWfsT11->value( detailsParameters ) ? QStringLiteral( "true" ) : QStringLiteral( "false" ) );
}
if ( settingsPreferredHttpMethod->exists( detailsParameters ) )
{
mUri.removeParam( QgsWFSConstants::URI_PARAM_HTTPMETHOD ); // setParam allow for duplicates!
switch ( settingsPreferredHttpMethod->value( detailsParameters ) )
{
case Qgis::HttpMethod::Get:
// default, we don't set to explicitly set
break;
case Qgis::HttpMethod::Post:
mUri.setParam( QgsWFSConstants::URI_PARAM_HTTPMETHOD, QStringLiteral( "post" ) );
break;
case Qgis::HttpMethod::Head:
case Qgis::HttpMethod::Put:
case Qgis::HttpMethod::Delete:
// not supported
break;
}
}
QgsDebugMsgLevel( QStringLiteral( "WFS full uri: '%1'." ).arg( QString( mUri.uri() ) ), 4 );
}

View File

@ -44,5 +44,6 @@ const QString QgsWFSConstants::URI_PARAM_WFST_1_1_PREFER_COORDINATES( QStringLit
const QString QgsWFSConstants::URI_PARAM_SKIP_INITIAL_GET_FEATURE( QStringLiteral( "skipInitialGetFeature" ) );
const QString QgsWFSConstants::URI_PARAM_GEOMETRY_TYPE_FILTER( QStringLiteral( "geometryTypeFilter" ) );
const QString QgsWFSConstants::URI_PARAM_SQL( QStringLiteral( "sql" ) );
const QString QgsWFSConstants::URI_PARAM_HTTPMETHOD( QStringLiteral( "httpMethod" ) );
const QString QgsWFSConstants::VERSION_AUTO( QStringLiteral( "auto" ) );

View File

@ -52,6 +52,7 @@ struct QgsWFSConstants
static const QString URI_PARAM_SKIP_INITIAL_GET_FEATURE;
static const QString URI_PARAM_GEOMETRY_TYPE_FILTER;
static const QString URI_PARAM_SQL;
static const QString URI_PARAM_HTTPMETHOD;
//
static const QString VERSION_AUTO;

View File

@ -22,6 +22,7 @@
#include "qgswfsconstants.h"
#include "qgswfsdataitems.h"
#include "qgsdataitemguiproviderutils.h"
#include "qgssettingsentryenumflag.h"
#include <QFileDialog>
#include <QMessageBox>
@ -117,6 +118,8 @@ void QgsWfsDataItemGuiProvider::duplicateConnection( QgsDataItem *item )
QgsOwsConnection::settingsPagesize->setValue( QgsOwsConnection::settingsPagesize->value( detailsParameters ), newDetailsParameters );
QgsOwsConnection::settingsPagingEnabled->setValue( QgsOwsConnection::settingsPagingEnabled->value( detailsParameters ), newDetailsParameters );
QgsOwsConnection::settingsPreferredHttpMethod->setValue( QgsOwsConnection::settingsPreferredHttpMethod->value( detailsParameters ), newDetailsParameters );
QgsOwsConnection::settingsUsername->setValue( QgsOwsConnection::settingsUsername->value( detailsParameters ), newDetailsParameters );
QgsOwsConnection::settingsPassword->setValue( QgsOwsConnection::settingsPassword->value( detailsParameters ), newDetailsParameters );
QgsOwsConnection::settingsAuthCfg->setValue( QgsOwsConnection::settingsAuthCfg->value( detailsParameters ), newDetailsParameters );

View File

@ -192,6 +192,7 @@ QSet<QString> QgsWFSDataSourceURI::unknownParamKeys() const
QgsWFSConstants::URI_PARAM_SKIP_INITIAL_GET_FEATURE,
QgsWFSConstants::URI_PARAM_GEOMETRY_TYPE_FILTER,
QgsWFSConstants::URI_PARAM_SQL,
QgsWFSConstants::URI_PARAM_HTTPMETHOD
};
QSet<QString> l_unknownParamKeys;
@ -418,6 +419,19 @@ void QgsWFSDataSourceURI::setOutputFormat( const QString &outputFormat )
mURI.setParam( QgsWFSConstants::URI_PARAM_OUTPUTFORMAT, outputFormat );
}
Qgis::HttpMethod QgsWFSDataSourceURI::httpMethod() const
{
if ( !mURI.hasParam( QgsWFSConstants::URI_PARAM_HTTPMETHOD ) )
return Qgis::HttpMethod::Get;
const QString method = mURI.param( QgsWFSConstants::URI_PARAM_HTTPMETHOD );
if ( method.compare( QLatin1String( "post" ), Qt::CaseInsensitive ) == 0 )
return Qgis::HttpMethod::Post;
// default
return Qgis::HttpMethod::Get;
}
bool QgsWFSDataSourceURI::isRestrictedToRequestBBOX() const
{
if ( mURI.hasParam( QgsWFSConstants::URI_PARAM_RESTRICT_TO_REQUEST_BBOX ) && mURI.param( QgsWFSConstants::URI_PARAM_RESTRICT_TO_REQUEST_BBOX ).toInt() == 1 )

View File

@ -111,6 +111,9 @@ class QgsWFSDataSourceURI
//! Sets GetFeature output format
void setOutputFormat( const QString &outputFormat );
//! Returns the preferred HTTP method for requests
Qgis::HttpMethod httpMethod() const;
//! Returns whether GetFeature request should include the request bounding box. Defaults to false
bool isRestrictedToRequestBBOX() const;

View File

@ -111,6 +111,16 @@
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="lblVersion_2">
<property name="text">
<string>Preferred HTTP method</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="2">
<widget class="QComboBox" name="mComboHttpMethod"/>
</item>
</layout>
</widget>
</item>
@ -380,6 +390,7 @@
<tabstop>txtUrl</tabstop>
<tabstop>cmbVersion</tabstop>
<tabstop>mWfsVersionDetectButton</tabstop>
<tabstop>mComboHttpMethod</tabstop>
<tabstop>txtMaxNumFeatures</tabstop>
<tabstop>cmbFeaturePaging</tabstop>
<tabstop>txtPageSize</tabstop>