关于Ajax call get and post method, 和前端解决跨域

关于Ajax call的一些介绍:

1.get 

var urlAJAXServlet = "";
jQuery.support.cors = true;
$.ajax({
url: urlAJAXServlet,
type: 'GET',
crossDomain: true,
dataType: 'json',
async: false,
beforeSend: function(xhr){
xhr.setRequestHeader('Access-Control-Allow-Origin', '*');
},
success : function(data) {
responseJson=data;
console.log("Success: in call json service..."+JSON.stringify(responseJson));
},
error:function(XMLHttpRequest, textStatus, errorThrown){
console.log("Error: in call json service...");
console.log("Error: in call json service..."+XMLHttpRequest);
console.log("Error: in call json service..."+textStatus);
console.log("Error: in call json service..."+errorThrown);
}
})

 

2. POST 

var requestForHost={};

var urlAJAXServlet = "";

jQuery.support.cors = true;
$.ajax({
contentType:"application/json",
url: urlAJAXServlet,
type: 'POST',
crossDomain: true,
data: JSON.stringify(requestForHost),
dataType: 'json',
async: false,
beforeSend: function(xhr){
xhr.setRequestHeader('channelId', 'MEM');
xhr.setRequestHeader('countryCode', 'SG');
xhr.setRequestHeader('Access-Control-Allow-Origin', '*');
},
success : function(data) {
reponseGDTJson=data;
console.log("Success: in call json service..."+JSON.stringify(reponseGDTJson));
},
error:function(XMLHttpRequest, textStatus, errorThrown){

console.log("Error: in call json service...");
console.log("Error: in call json service..."+XMLHttpRequest);
console.log("Error: in call json service..."+textStatus);
console.log("Error: in call json service..."+errorThrown);
}
});

这样的方法也许call 本地的api没有问题,但是一旦上到环境上,我们就会面临跨域问题,解决方法

这样的我们可以在本地创建一个servlet,虽然这样有点麻烦但是还是很好用的,现在这个就是纯Jquery

Ajax call, 当然你可以用SpringMVC 和Backbonds的框架来call 但是可能也会有跨域问题。这个还没有研究,

现在先说纯Jquery建立一个servlet来解决前台的跨域问题。

我们可以在本地创建一个servlet,用的是httpClients

public class SBGetDatesServlet extends HttpServlet{
private static final long serialVersionUID=1L;
public SBGetDatesServlet(){
super();
}
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
doPost(request,response);

}
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
CloseableHttpClient httpClient = null;
HttpPost httpPost = null;
CloseableHttpResponse httpResponse = null;
try {
httpClient = HttpClients.createDefault();

//Start read the json String that ajax call Post Passed
BufferedReader br1 = new BufferedReader(new InputStreamReader(request.getInputStream(),"utf-8"));
String line = null;
StringBuilder sb= new StringBuilder();
while((line = br1.readLine())!=null){
sb.append(line);
}

//END

JSONObject json = JSONObject.fromObject(sb.toString());//Json String - > Json object
httpPost = new HttpPost("https://......"); // Rest server URL
StringEntity input = new StringEntity(json.toString());
input.setContentType("application/json"); // Json format
httpPost.setEntity(input);

httpPost.addHeader("channelId", request.getHeader("channelId"));
httpPost.addHeader("countryCode", request.getHeader("countryCode"));
httpPost.addHeader("Content-Type", "application/json");


httpResponse = httpClient.execute(httpPost);

if (httpResponse.getStatusLine().getStatusCode() != 200) {

throw new RuntimeException("Failed : HTTP error code : " + httpResponse.getStatusLine().getStatusCode()); // Error
}

BufferedReader br = new BufferedReader(new InputStreamReader((httpResponse.getEntity().getContent())));
String responseOut = "";
String output;
// System.out.println("Output from Server .... \n");// Console log
while ((output = br.readLine()) != null) { // get output
System.out.println(output);
responseOut += output;
}

Map<String, String> OutputMap = new HashMap<String, String>();
ObjectMapper mapper = new ObjectMapper();
Writer out = response.getWriter();
try {
OutputMap = mapper.readValue(responseOut, new TypeReference<HashMap<String, Object>>() {
});
System.out.println(OutputMap);
JSONObject jsonReponse = new JSONObject();
jsonReponse.putAll(OutputMap);
// System.out.println(jsonReponse.putAll(responseOut));
// out.write(jsonReponse.toString());
MemfisLogger.logMessage(MemfisLogger.DEBUG, "", "Json response " + responseOut);
out.write(responseOut);//我们可以用out.write将正确的json response返回到页面上。
out.flush();
// System.out.println(OutMap); // console log
} catch (Exception e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();

} catch (IOException e) {
e.printStackTrace();
} finally {
try {
httpResponse.close();
httpClient.close(); // close ALL
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}

 

我们还有一种方法,同样是新建一个servlet但是我们不是用httpClients, 而是用

restAccessor,但是这个需要一些版本比较高的Jar包,

httpclient-4.5.2.jar
httpcore-4.4.5.jar
spring-beans-4.2.3.RELEASE.jar
spring-core-4.2.3.RELEASE.jar
spring-web-4.2.3.RELEASE.jar

jackson-all-1.9.9.jar 

jackson-annotations-2.7.3.jar
jackson-core-2.7.3.jar
jackson-databind-2.7.3.jar

 

 

public class SBGetDatesServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
private static final String HOST_NAME;
private static final String PORT;
private static final String PROTOCOL;

static {
String url =

String[] sourceStrArray = url.split(":");
int length = sourceStrArray[1].length();
String hostName = sourceStrArray[1].substring(2,length);
HOST_NAME=hostName;
PORT=sourceStrArray[2];
PROTOCOL=sourceStrArray[0];
}
public SBGetDatesServlet() {
super();
// TODO Auto-generated constructor stub
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ObjectMapper mapper = new ObjectMapper();

RestAccessor restAccessor=new RestAccessor();
restAccessor.setHost(HOST_NAME);
restAccessor.setPort(PORT);
restAccessor.setProtocol(PROTOCOL);
restAccessor.setPath("");
RestRequestObject req=new RestRequestObject();
try
{
BufferedReader br1 = new BufferedReader(new InputStreamReader(request.getInputStream(),"utf-8"));
String line = null;
StringBuilder sb= new StringBuilder();
while((line = br1.readLine())!=null){
sb.append(line);
}

JSONObject json = JSONObject.fromObject(sb.toString());

System.out.println("SBGetDatesServlet : doPost() : Json Object Request" + json);
req.setHttpMethod(HttpMethod.POST);
req.setHttpRequestHeaders(getDefaultHTTPRequestHeaders());
req.setRequestBody(sb.toString());

RestResponseObject res = restAccessor.makeRESTCall(req);
System.out.println("calling makeRESTCall completed " + mapper.writeValueAsString(res));

res.getResponseBody();
JSONObject jsonRes = JSONObject.fromObject(res.getResponseBody().toString());

System.out.println("SBGetDatesServlet : doPost() : Json Object Response" + jsonRes);
Writer out = response.getWriter();
out.write(res.getResponseBody().toString());
out.flush();
if (res.isSuccess())
{
System.out.println("invokeCustUpdRESTService Success ");
resCode = "0";
}
else
{
resCode = "-1";
System.out.println("invokeCustUpdRESTService Failed ");
if (res.getErrorResponse() != null) {
System.out.println("invokeCustUpdRESTService Failed :: " + res.getErrorResponse());
} else {
System.out.println("invokeCustUpdRESTService Failed - NO ESB UUID :: ");
}
}
}
catch (Exception e)
{
resCode = "-1";
System.out.println("invokeCustUpdRESTService || invokeCustUpdRESTService || Exception: " + e);
}
}
private static HttpHeaders getDefaultHTTPRequestHeaders()
{
String methodName = "getDefaultHTTPRequestHeaders";

HttpHeaders requestHeaders = new HttpHeaders();
try {

requestHeaders.add("countryCode", "SG");
requestHeaders.add("channelID", "MEM");

}
catch (Exception e)
{
System.out.println("RESTfulServiceInvoker"+ "getDefaultHTTPRequestHeaders"+ "Exception" +e);
}

System.out.println("RESTfulServiceInvoker"+ "getDefaultHTTPRequestHeaders"+ "requestHeaders" +requestHeaders);

return requestHeaders;
}
}

 

但是如果真正解决跨域问题还是需要后台的API端相配合的。

posted @ 2017-05-03 14:13  EchoDuangDuang~  阅读(896)  评论(0编辑  收藏  举报