0

大家好,我下面這個https://marmelab.com/admin-on-rest/index.html,對於登錄的事情,我在下面https://marmelab.com/admin-on-rest/Authentication.html無法從管理上休息發送正確的JSON PARAMS(reactJS)

import { AUTH_LOGIN } from 'admin-on-rest'; 
import restClient from './restClient'; 

export default (type, params) => { 
    if (type === AUTH_LOGIN) { 
    const { username, password } = params; 
    const request = new Request('http://localhost:9000/login', { 
     method: 'POST', 
     headers: new Headers({"Content-Type": "application/json"}), 
     body: JSON.stringify({ username: username, 
           password: password}) 
    }) 

    return fetch(request) 
     .then(response => { 
      if (response.status < 200 || response.status >= 300) { 
       throw new Error(response.statusText); 
      } 
      return response.json(); 
     }) 
     .then(({ token }) => { 
      localStorage.setItem('token', token) 
     }); 
    } 
    return Promise.resolve(); 
} 

對於API我使用Rails 5.0,運行代碼的上方和調試上API側的PARAMS時,無法得到PARAMS體,下面是結果:

<ActionController::Parameters {"controller"=>"sessions", "action"=>"create"} permitted: false> 

我試圖改變發送標題(內容類型)請求:

... 
headers: new Headers({"Accept": "application/json", 
         "Content-Type": "application/x-www-form-urlencoded"}), 
... 

和調試再次API一側的參數,可以和結果:

<ActionController::Parameters {"{\"username\":\"jhon\",\"password\":\"dow\"}"=>nil, "controller"=>"sessions", "action"=>"create"} permitted: false> 

那麼如何讓越來越PARAMS例如:

的ActionController ::參數{ 「用戶名」=> 「JHON」 「password」=>「doe」,「controller」=>「sessions」,「action」=>「create」}允許:false>

回答

2

默認情況下,如果您想發送json格式,必須在API獲取方法中設置json屬性爲true -

const request = new Request('http://localhost:9000/login', { 
     method: 'POST', 
     json: true, 
     headers: new Headers({"Content-type": "application/json"}), 
     body: JSON.stringify({ username: username, 
           password: password}) 
    }) 
+0

嗨穆罕默德謝謝,但還是不能讓PARAMS – Khalid

+0

你面對訪問允許起源問題看到允許在軌道上CORS後端我得到了在內容類型T的問題要小,而不是像資本-----頭文件:{ 「Content-type」:「application/json; charset = UTF-8」, } –

+0

請閱讀https://github.com/cyu/rack-cors –

1

如果您希望json解釋您的角色,您應該添加charset=utf-8進行解析。

const request = new Request('http://localhost:9000/login', { 
      method: 'POST', 
      body: JSON.stringify({ username, password }), 
      headers: new Headers({ 'Content-Type': 'application/json; charset=utf-8', 
            'Accept': 'application/json' 
      }), 
}) 

並確保您正確保存令牌。對於我,我沒有使用token作爲admin-on-rest建議的,我使用了一個名爲access-token的響應頭,所以我直接在響應中保存了localStorage。也許這會影響你的代碼的結果。

return fetch(request) 
     .then(response => { 
      if (response.status < 200 || response.status >= 300) { 
       throw new Error(response.statusText); 
      } 
      localStorage.setItem('access-token', response.headers.get('access-token')); 
      return response.json(); 
     });