2015-07-11 27 views
1

我試圖理解什麼是我的代碼的問題,REST API的Ajax:REST API調用給出錯誤:未捕獲的SyntaxError:意外的標記:

我使用「EspoCRM」現在我要開始工作與api一起工作。

在他們要求使用documentation:使用基本身份驗證,如:

"Authorization: Basic " + base64Encode(username + ':' + password) 

所以我嘗試使用此代碼:

<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script> 

<script type="text/javascript" > 

    var creds = { 
    username: "myuser", 
    password: "mypass" 
}; 
var credentials = btoa(creds.username + ":" + creds.password); 
$.ajaxSetup({ 
    xhrFields: { withCredentials: false }, 
    beforeSend: function (xhr) { 
     xhr.setRequestHeader("Authorization", "Basic" + credentials); 
     return true; 
    } 
}); 

$.ajax({ 
    url: 'http://crmurl.com/api/v1/App/user', 
    type: 'GET', 
    dataType: 'jsonp', 
    async: false, 
    success: function (data) { 
     console.log(data); 
     var json = JSON.parse(data); 
     alert(json.user.userName); 
    } 
}); 

</script> 

後,我用這個代碼我在控制檯收到錯誤:

Uncaught SyntaxError: Unexpected token : 

當我點擊錯誤鏈接,我可以看到所有的json數據。但由於錯誤,我無法處理數據。不管我嘗試什麼。

如果我改變從dataType: 'jsonp'dataType: 'json'

我得到這個錯誤:

XMLHttpRequest cannot load http://crmurl.com/api/v1/App/user. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://www.domain.com' is therefore not allowed access. The response had HTTP status code 401. 

我加入htaccess的

<IfModule mod_headers.c> 
    Header set Access-Control-Allow-Origin: * 
</IfModule> 

JSON的輸出是:

{"user":{"id":"1","name":"Admin","deleted":false,"isAdmin":true,"userName":"admin","password":"xNa3PPcGYcIGQJE4gZi4gnEJ1tv9XF1m7F490qTg.yLPG3Y3QtwRWQq.4RicYIro8akEOZXiWnXzuKg4P4Jnx1","salutationName":"","firstName":"","lastName":"Admin","isActive":true,"title":"","emailAddress":"[email protected]","phoneNumber":"+44(203)695-03-80","createdAt":"2015-07-11 05:03:05","defaultTeamId":null,"defaultTeamName":null,"teamsIds":[],"teamsNames":{},"avatarName":null,"avatarId":null},"acl":{"table":{"Email":{"read":"all","edit":"all","delete":"no"},"EmailAccountScope":true,"EmailTemplate":{"read":"all","edit":"all","delete":"no"},"Account":{"read":"all","edit":"all","delete":"no"},"Calendar":true,"Call":{"read":"all","edit":"all","delete":"no"},"Campaign":{"read":"all","edit":"all","delete":"no"},"Case":{"read":"all","edit":"all","delete":"no"},"Contact":{"read":"all","edit":"all","delete":"no"},"Document":{"read":"all","edit":"all","delete":"no"},"DocumentFolder":{"read":"all","edit":"all","delete":"no"},"Lead":{"read":"all","edit":"all","delete":"no"},"Meeting":{"read":"all","edit":"all","delete":"no"},"Opportunity":{"read":"all","edit":"all","delete":"no"},"TargetList":{"read":"all","edit":"all","delete":"no"},"Task":{"read":"all","edit":"all","delete":"no"},"User":{"read":"all","edit":"no","delete":"no"},"Team":{"read":"all","edit":"no","delete":"no"},"Note":{"read":"all","edit":"own","delete":"own"},"EmailAddress":{"read":"no","edit":"no","delete":"no"},"PhoneNumber":{"read":"no","edit":"no","delete":"no"},"EmailAccount":{"read":"own","edit":"own","delete":"own"},"Role":false},"assignmentPermission":"all","userPermission":"no"},"preferences":{"id":"1","timeZone":"UTC","dateFormat":"MM\/DD\/YYYY","timeFormat":"HH:mm","weekStart":0,"thousandSeparator":",","decimalMark":".","defaultCurrency":"USD","dashboardLayout":[{"name":"My Espo","layout":[[{"name":"Stream","id":"d4"},{"name":"SalesByMonth","id":"d11"},{"name":"SalesPipeline","id":"d12"}],[{"name":"Tasks","id":"d3"},{"name":"OpportunitiesByLeadSource","id":"d14"},{"name":"OpportunitiesByStage","id":"d15"}]]}],"dashletOptions":null,"smtpServer":"","smtpPort":25,"smtpAuth":false,"smtpSecurity":"","language":"es_ES","exportDelimiter":";","receiveAssignmentEmailNotifications":true,"autoFollowEntityTypeList":[],"signature":"<br>","defaultReminders":[]},"token":null} 
+0

你說你在htaccess中添加了CORS頭,是在crmurl.com服務器上的嗎? –

+0

@JaromandaX 是的,我加入到'crmurl.com'的.htaccess中,然後我得到這個錯誤: 'XMLHttpRequest無法加載http://mycrm.com/api/v1/App/user。當憑證標誌爲真時,'Access-Control-Allow-Origin'標頭中不能使用通配符'*'。 Origin'http://www.domain.com'因此不被允許訪問。' – user2413244

+0

這是正確的,你在處理授權的CORS時必須很聰明 - 堅持原來的jsonp實現,在下面的答案中已經爲你解決了 –

回答

1

當您使用JSON撥打電話時,您的訪問被拒絕,因爲CORS標題不存在。因此你得到錯誤

XMLHttpRequest cannot load http://crmurl.com/api/v1/App/user. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://www.domain.com' is therefore not allowed access. The response had HTTP status code 401. 

這解釋了第二個錯誤。現在,由於CORS不存在,JSONP是獲取數據的唯一方法,它添加了CORS頭文件。

從AJAX回調獲得的數據是JSON本身。您無法解析JSON數據,因爲parse本身會返回JSON數據。所以下面的代碼是不必要的

JSON.parse(data); 

剛分配

var json = data; 

或者直接使用data。這將解決你的第一個錯誤。

+0

問題是錯誤,而不是數據。 如果我使用jsnop我得到這個錯誤:'未捕獲的SyntaxError:意外的令牌:' 如果我使用json我得到這個錯誤:'XMLHttpRequest無法加載http://crmurl.com/api/v1/App/user。請求的資源上沒有「Access-Control-Allow-Origin」標題。原因'http://www.domain.com'因此不允許訪問。該響應具有HTTP狀態碼401.' – user2413244

+0

問題僅在於數據。當你使用JSON時,由於CORS,本質上你不允許在服務器上。當您使用JSONP時,服務器允許數據並因此獲取數據。但是因爲數據是JSON本身,所以你不能再解析 – Bikas

+0

問題是他描述了兩個不同的錯誤,你已經回答了第一個錯誤的原因,但他似乎認爲你已經回答了第二個錯誤的原因:p –

相關問題