2017-07-23 3 views
1

J'ai écrit un service Web qui accepte les paramètres d'entrée (json) d'autres applications. Je suis en train d'authentifier ces valeurs et de retourner les "codes de statut http et la réponse" (en utilisant cfheader). Pour cela, j'essaye le "RESTClient" dans l'extension firefox. Mon problème est - Il exécute la méthode "GET" avec succès mais pas la méthode POST. Je suppose que la demande ne va même pas au serveur dans la méthode POST. Voir la capture d'écran ci-dessous à la fois la demande: 1. demande GET enter image description hereService Web ColdFusion RESTful

  1. requête POST enter image description here

Ceci est mon CFC:

<cfcomponent rest="true" restpath="/AimsWeb"> <!--- REST Service---> 

<cffunction name="AuthenticateUser" access="remote" httpmethod="POST" returntype="void"> 

<!---- Defining Arguments---> 
    <cfargument name="Username" type="string" required="Yes"> 
    <cfargument name="Password" type="string" required="Yes"> 
    <cfargument name="CustomerID" type="numeric" required="Yes"> 

<!---- Setting the Form Values (which we will get from AW+) and setting it to arguments passed---> 
    <cfset Form.CustomerID = arguments.CustomerID> 
    <cfset Form.Username = arguments.Username> 
    <cfset Form.Password = arguments.Password> 

<!--- Take input json, parse it and set in in a variable ---> 
<cfscript> 
    record=deserializeJSON(
'{ 
"customerId": #Form.CustomerID#, 
"userName": "#Form.userName#", 
"password": "#Form.Password#" 
}' 
); 

this.customerid = record.customerId; 
this.userName = record.userName; 
this.password = record.password; 
</cfscript> 

    <cfquery name="AllUsers" datasource="#Application.GomDatasource#"> 
     SELECT u.UserTypeID, u.UserID, u.CustomerID, u.UserName, u.Password, u.active, u.locked 
     FROM tblUsers u 
     WHERE u.CustomerID = <cfqueryparam cfsqltype="cf_sql_integer" value="#this.customerid#"> 
     AND u.username = <cfqueryparam cfsqltype="cf_sql_varchar" value="#this.username#"> 
     AND u.password = <cfqueryparam cfsqltype="cf_sql_varchar" value="#this.password#"> 
    </cfquery> 

<!--- This is to check whether provided parameters are valid by checking the same in the database---> 
<cfset local.StatusStruct = StructNew()> 

    <cfif AllUsers.RecordCount AND (AllUsers.Active EQ 0 OR AllUsers.locked EQ 1)> 
     <cfheader statuscode="401" statustext="User Account is locked"> 
    <cfelse> 

     <cfif this.customerid EQ "" OR this.username EQ "" OR this.password EQ ""> 
      <cfheader statuscode="400" statustext="Insufficient Input. Please provide Customer ID, UserName and Password"> 
     <cfelseif AllUsers.RecordCount AND this.CustomerId EQ AllUsers.CustomerID AND this.username EQ AllUsers.UserName AND this.password EQ AllUsers.Password> 
      <cfheader statuscode="200" statustext="Success"> 
     <cfelseif AllUsers.CustomerID NEQ this.CustomerID> 
      <cfheader statuscode="400" statustext="Customer Id doesn't exist"> 
     <cfelseif AllUsers.UserName NEQ this.UserName> 
      <cfheader statuscode="400" statustext="User not found"> 
     <cfelseif AllUsers.Password NEQ this.password> 
      <cfheader statuscode="400" statustext="Invalid Password"> 
     </cfif> 
    </cfif> 
    </cffunction> 
</cfcomponent> 
+0

votre cffunction ne retourne rien? – tech2017

Répondre

0

FYI une requête GET n'a pas de corps d'entité de requête car il s'agit d'une requête GET et le serveur Web ignorera généralement tout corps inclus dans la requête. Je suis surpris que ColdFusion fournisse une réponse car je ne vois pas de méthode GET dans votre CFC.

La méthode POST est probablement échoué parce que le CFC attend un type MIME d'application/form-url codé (vos CFARGUMENTs) et vous envoyez des messages application/json

Essayez casser en 2 fonctions, celle qui accepte application/json, une application/form-url-encoded

utilise l'attribut 'consumes' dans la CFFUNCTION pour faire la distinction. Ils peuvent tous deux appeler une fonction commune après cela.