Java-AngularJS http get方法获取字符串""和转义字符

时间:2017-12-14 00:53:36

标签: javascript java angularjs json spring-mvc

我使用此函数发出http get请求:

    $scope.fetchResult = function() {
    $http.get('search/result').success(function(getResult){
        $scope.result = getResult;
    });
};

这是后端功能:

    @RequestMapping("/result")
public @ResponseBody String getResult() {
    return searchService.getResult();
}

问题是它使用"将字符串打印到网页开头和结尾的字符也可以转义字符。我真的找不到这背后的任何逻辑。例如,如果string是:

String result = "Hello";

它不会向网页打印Hello,但它会打印" Hello"代替。另一个例子:

String result = "Found \"" + keyword + "\" '" + count + "' times at \"" + website + "\"";

它也打印转义字符。所以,让我们说关键字是关键字,计数是0,网站是http://stackoverflow.com结果以这种方式打印在网页上:

"Found \""keyword"\" '"0"' times at \""http://stackoverflow.com"\""

显然我希望:

Found "keyword" '0' times at "http://stackoverflow.com"

我该如何解决这个问题?这对我来说没有任何意义我是js和web开发的新手。

修改:如果我使用List<String>代替String并在html表单上执行此操作:

<p ng-repeat:"res in result">{{res}}<p>

有效。但我并不是真的想以这种方式使用它,因为我不需要列表但只需要一个字符串。

1 个答案:

答案 0 :(得分:0)

Spring有一个名为Suffix Strategy的东西,它使框架能够直接从URL检查路径扩展,以确定输出内容类型。

您看到的编码结果是因为@RequestMapping/result.json设置为.json扩展名而导致结果作为Json对象返回。

要解决此问题,您有多种选择。

选项1:

将返回的响应作为Javascript中的Json对象处理。

选项2:

@RequestMapping值重命名为/result。下面是一个代码示例:

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {
   @CrossOrigin(origins = "*")
   @RequestMapping(value="/result")
   public @ResponseBody String sayHello() {
      String website = "http://stackoverflow.com";
      int count = 4;
      String keyword = "keyword";
      return "Found \"" + keyword + "\" '" + count + "' times at \"" + website + "\"";
   }
}

Javascript(此处添加接受标头是可选的)

<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope, $http) {
  $http.get("/result",{headers: { 'Accept': 'text/plain' }})
  .then(function(response) {
      $scope.result = response.data;
  });
});
</script>

选项3

@RequestMapping值保持为/result.json,但使用WebMvcConfigurerAdapter禁用后缀策略。下面是一个代码示例

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {
   @CrossOrigin(origins = "*")
   @RequestMapping(value="/result.json", method = RequestMethod.GET, produces="text/plain")
   public @ResponseBody String sayHello() {
      String website = "http://stackoverflow.com";
      int count = 4;
      String keyword = "keyword";
      return "Found \"" + keyword + "\" '" + count + "' times at \"" + website + "\"";
   }
}

WebMvcConfigurerAdapter类

import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.favorPathExtension(false)
        .favorParameter(false)
        .ignoreAcceptHeader(false)
        .useJaf(false)
        .defaultContentType(MediaType.TEXT_PLAIN);
    }
}

的Javascript

<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope, $http) {
  $http.get("/result.json",{headers: { 'Accept': 'text/plain' }})
  .then(function(response) {
      $scope.result = response.data;
  });
});
</script>