programing

리소스에 대한 각도 후행 슬래시

muds 2023. 3. 27. 21:42
반응형

리소스에 대한 각도 후행 슬래시

내 api는 api 호출을 위해 후행 슬래시를 필요로 합니다.어떻게 하면 각지게 잘 해낼 수 있을까?

그래서 제가 이 컴퓨터에 접속할 수 있어야 합니다./tasks/또는/tasks/xxxx/.다음을 통해 시도했습니다.

angular.module('taskServices', ['ngResource']).
        factory('Tasks', function($resource){
            return $resource('/tasks/:task_id/', {}, {
                 query: {method:'GET', 
                         params:{},
                         isArray:true}
            });
 });

및 a

$scope.tasks = Tasks.query(); 

하지만 결과적으로/tasks또는tasks/xxx문의합니다.

어떻게 하면 항상 그렇게 하도록 강요할 수 있을까?/tasks/그리고./tasks/xxx/

이 문제는 해결된 것 같습니다.https://github.com/angular/angular.js/pull/5560

이것으로, 다음과 같이 설정할 수 있습니다.

app.config(function($resourceProvider) {
  $resourceProvider.defaults.stripTrailingSlashes = false;
});

Angular 라인에서 후행 슬래시가 명시적으로 제거됩니다.JS 소스 코드이 코드의 이면에 있는 이유가 무엇인지는 잘 모르겠습니다만, 이 문제에 대해서는 이미 해결되지 않은 문제가 있습니다.

전술한 호에서 기술한 바와 같이$resource공장에서는 특정 사양을 준수하는 RESTful 엔드포인트에 적합합니다.하는 동안에$resource이 사양에 준거한 백엔드와 대화하는 것은 매우 효과적입니다.백엔드는 이 사양에 준거한 계약에 따르지 않는 백엔드에서 제외될 수 있습니다.$resource이 경우 하위 레벨로 전환하는 것이 최선의 방법입니다.$http다음 질문에서 설명한 바와 같이 서비스를 제공합니다.서버에서 데이터를 가져오는 권장 방법

$http는 매우 강력하고 유연한 서비스로 URL, 송신 파라미터 등을 완전히 제어할 수 있습니다.

url 템플릿의 맨 끝에 공백 추가는 다음과 같이 동작합니다(각도가 1.2.0인 경우).

{url: '/user/:id/ '}

Chrome과 Safari에서는 URL의 후행 슬래시를 피하기 위해 2개의 백슬래시를 추가했습니다.

그러나 Firefox는 URL에서 후행 슬래시를 삭제하고 슬래시를 탈출한 백슬래시를 %5C...great :-)로 인코딩하는 것이 좋다고 판단하고 있습니다.위의 예에서는 http://example.com/controller/save%5C,를 얻을 수 있으며, 그 후 서버에서는 404가 됩니다.

장고플러스 쓰고 있어요프로젝트의 TestyPie가 URL의 후행 슬래시가 필요합니다.최소 공통분모로 모든 것을 $http로 떨어뜨리는 대신 ngResource를 수정하려고 합니다.

각도django-rest-framework를 사용하는 JS 클라이언트는 angular-django-rest 리소스만 사용합니다.잘 작동했다.

api URL 등 모든 URL 또는 특정 URL에 대해 http 대행 수신기를 사용할 수 있습니다.

app.factory('myHttpInterceptor', function ($q) {
    return {
        'request': function(config) {
            if (config.url.indexOf('/api/') != -1 && config.url.slice(-1) != '/') {
                config.url += '/';
            }
            return config || $q.when(config);
        }
    };
});

app.config(function($httpProvider) {
    $httpProvider.interceptors.push('myHttpInterceptor');
});

Angular가 변경될 때까지/변경될 경우 이 문제를 해결하려면JS 소스. 웹 서버에 대한 모든 수신 요청에 후행 슬래시를 추가하는 .htaccess 재작성 규칙을 설정합니다.

RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteCond %{REQUEST_METHOD} GET
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]

이 접근법의 단점:

  • RESTful 콜의 네트워크트래픽은 301로 리다이렉트되므로 요구가 2회 송신되는 것을 알 수 있습니다.
  • 이것은 GET 요구에 대해서만 기능합니다(이 예에서는 제약사항에 주의).새로고침이 POST, DELETE, PUT 요구를 수신하고 리다이렉트를 하면, 같은 URL 의 GET 요구로서 기능합니다.물론 payload가 손실되기 때문에, 이것은 필요 없는 경우가 있습니다.

firefox 부호화 문제는 최종 URL을 작성하기 전에 ngResource에 추가함으로써 해결할 수 있습니다.

url = url.replace(/\\/,"/");

이를 통해 Chrome/Safari의 슬래시 이스케이프 수정이 Firefox에서 제대로 작동합니다.

app.factory('Things', function($resource){
        return $resource('/api/v1/thing\\/', {}, {
              query: {method:'GET', params:{},isArray:true}});
        }); 

Vincent가 후행 슬래시를 탈출한 것(URL 끝에 백슬래시 2개와 슬래시(http://example.com/controller/save\/)를 추가)이 도움이 되었습니다.

언급URL : https://stackoverflow.com/questions/14533117/angular-trailing-slash-for-resource

반응형