>  기사  >  Java  >  URLConnection 및 axis1.4를 사용한 웹 서비스 개발 튜토리얼

URLConnection 및 axis1.4를 사용한 웹 서비스 개발 튜토리얼

巴扎黑
巴扎黑원래의
2017-07-18 18:00:451712검색

앞에 적음:

웹서비스를 호출하는 방법에는 여러 가지가 있습니다. 1. 클라이언트에서 직접 도구를 사용하여 클라이언트 코드를 생성하고 코드를 프로젝트에 복사하여 호출합니다. 예를 들어 서버 측 개발에 축을 사용하는 경우 클라이언트에서 해당 축 jar 패키지를 가져온 다음 관련 메서드를 사용하여 호출할 수도 있습니다. . 개인적으로 위의 처음 두 가지 방법은 서버와 클라이언트가 모두 Java 개발 시스템일 때 더 적합하다고 생각합니다. 만약 서로 다른 언어로 호출된다면 말하기는 어렵습니다. 세 번째와 네 번째 방법은 실제로 비슷합니다. jsp 페이지에서 인터페이스를 호출해야 한다면 js 메서드를 사용하세요. 이를 호출하기 위해 백그라운드에서 프로그램을 작성해야 한다면 URLConnection을 사용하는 것이 더 좋습니다. 사실 아직 몇 가지 원칙에 대해서는 매우 모호합니다. 예를 들어 이 메소드를 http로 호출해야 하는지는 아직 명확하지 않습니다.)

 최근 프로젝트에서는 웹 서비스를 개발해야 합니다. 인터페이스이지만 jdk는 1.4입니다. 따라서 개발에는 axis1.4가 선택되었습니다(이것이 프로젝트 환경에 더 적합함).

 

  여기서는 테스트용으로 호출할 수 있는 Java 언어도 사용합니다. 서버에서 반환된 데이터를 구문 분석하려면 해당 jar 패키지를 사용해야 합니다:

코드:

package edu.hue.client;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.StringReader;import java.net.HttpURLConnection;import java.net.ProtocolException;import java.net.URL;import java.net.URLConnection;import java.util.List;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;public class XMLClient2 {public static void main(String[] args) {try {//创建url地址URL url = new URL("http://10.203.138.82:8080/test_axis3/services/sayHello?wsdl");//打开连接URLConnection conn = url.openConnection();//转换成HttpURLHttpURLConnection httpConn = (HttpURLConnection) conn;
                
                System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
                System.setProperty("sun.net.client.defaultReadTimeout", "30000");                //打开输入输出的开关httpConn.setDoInput(true);
                httpConn.setDoOutput(true);//post提交不能有缓存httpConn.setUseCaches(false);                //设置请求方式httpConn.setRequestMethod("POST");                //设置请求的头信息httpConn.setRequestProperty("Content-type", "text/xml;charset=UTF-8");                //设置 SOAPAction Header  不然 报错 没有这个soapaction headerhttpConn.setRequestProperty("SOAPAction", "");                //拼接请求消息  这里的请求消息体 直接用接口测试工具 soapui 来获取  然后拼接以下 注意双引号这里要转义成\" String data = "<soapenv:Envelope xmlns:soapenv=" +
                        "\"http://schemas.xmlsoap.org/soap/envelope/\" " +
                        "xmlns:ser=\"http://server.hue.edu/\" " +
                        "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
                        "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"//+"<soapenv:Header />"  +"<soapenv:Body>"
                            +"<ser:say soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
                        +"<name xsi:type=\"soapenc:string\" xs:type=\"type:string\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:xs=\"http://www.w3.org/2000/XMLSchema-instance\">" 
                            +"小蚊子qq:513996980" //这里是直接在soapui中复制过来的所以它的请求消息体比较长 也可以用下面这种 注释的方式来拼接+"</name>"
                        +"</ser:say>"
                        +"</soapenv:Body>"
                      +"</soapenv:Envelope>";            
                 /*    下面这种请求消息体更为简单 经过测试也可以成功 它的方法名 参数名 都很简洁  
                  * 但是为了保险 希望大家在写请求消息体的时候用 接口测试工具去获取比如soapui 然后直接复制过来    
                      String data = "<soapenv:Envelope xmlns:soapenv=" +
                        "\"\" " +
                        "xmlns:ser=\"http://server.hue.edu/\" " +
                        "xmlns:xsd=\"\" " +
                        "xmlns:xsi=\"\">"
                        +"<soapenv:Header />"
                        +"<soapenv:Body>"
                        +"<ser:say >"
                            +"<name>小蚊子qq:513996980</name>"
                        +"</ser:say>"
                        +"</soapenv:Body>"
                      +"</soapenv:Envelope>";*/    
                                          //获得输出流OutputStream out = httpConn.getOutputStream();//发送数据  这里注意要带上编码utf-8  不然 不能传递中文参数过去out.write(data.getBytes("UTF-8"));//判断请求成功if(httpConn.getResponseCode() == 200){
                    System.out.println("调用成功.....");//获得输入流InputStream in = httpConn.getInputStream();//使用输入流的缓冲区BufferedReader reader = new BufferedReader(new InputStreamReader(in,"UTF-8"));
                    StringBuffer sb = new StringBuffer();
                    String line = null;//读取输入流while((line = reader.readLine()) != null){
                        sb.append(line);
                    }                    //创建sax的读取器  这里需要导入相应的jar包SAXReader saxReader = new SAXReader();//创建文档对象Document doc = saxReader.read(new StringReader(sb.toString()));//获得请求响应return元素   这里可根据接口测试工具查看你的相应消息体的返回值的节点是什么名称 我这里是sayReturnList eles = doc.selectNodes("//sayReturn");                    for(int i=0;i<eles.size();i++){
                        Element ele = (Element)eles.get(i);
                        System.out.println(ele.getText());
                    }
                    System.out.println(sb.toString());
            }else{
          //调用不成功 打印错误的信息                //获得输入流InputStream err = httpConn.getErrorStream();//使用输入流的缓冲区BufferedReader reader = new BufferedReader(new InputStreamReader(err,"UTF-8"));
                StringBuffer sb = new StringBuffer();
                String line = null;//读取输入流while((line = reader.readLine()) != null){
                    sb.append(line);
                }
                System.out.println("返回错误码:"+httpConn.getResponseCode());
                System.out.println("返回的结果:"+sb.toString());
                    
            }
                } catch (Exception e) {
                    e.printStackTrace();
                }
}
}

위는 클라이언트에서 호출하는 코드입니다. 여기 서버에는 String 유형의 매개변수를 가진 하나의 메소드가 더 있습니다.

 문제 요약:

 1. http 응답 결과 코드 500:

 java.io.IOException: 서버가 URL: http://10.203.138.82에 대해 HTTP 응답 코드 500을 반환했습니다. : 8080/test_axis/services/sayHello
  at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1626)

  여기서 500 오류는 일반적으로 코드에 문제가 있어서 발생하는 경우가 있습니다. 글쓰기에 문제가 있습니다. 이때는 조심하고 조심해야 하며, 오류를 제거하기 위해 다른 방법을 사용해야 합니다. 또한 입력 스트림이 다음과 같이 작성되었기 때문에 이 문제가 발생합니다. 출력 스트림 앞(클라이언트의 경우 출력 스트림을 먼저 작성한 후 입력 스트림을 작성해야 합니다. get.InputStream())

   2. axis1.4에 대한 버그: AxisFaultaultCode: {}Client. NoSOAPAction failureSubcode:    aultString: no SOAPAction header! fallNode:aultDetail : {} Stacktrace: No SOAPACTION Header!

No SOAPACTION Header를 보고하면 주의하세요! 두 가지 해결 방법: 1: 클라이언트에 비누액션을 추가합니다. 특정 콘텐츠는 중요하지 않으며 빈 문자열을 쓰는 것도 가능합니다. 2: 서버를 다시 작성하여 axisServlet과 동일하게 서블릿을 작성하고 내부에서 getSoapAction() 메서드를 다시 작성합니다. . 여기서는 첫 번째 방법만 권장합니다. 축의 버그는 아닙니다.)

   //SOAPAction 헤더 설정 그렇지 않으면 이 비누액션 헤더가 없으면 오류가 보고되지 않습니다.
  httpConn.setRequestProperty("SOAPAction", "" ; 여기에 인코딩 utf-8을 가져오도록 주의하세요. 그렇지 않으면 중국어 매개변수를 과거로 전달할 수 없습니다.

out.write(data.getBytes("UTF-8")); ? ? 여기서 이전에 WCF가 개발한 .net 시스템을 플랫폼 전반에 걸쳐 호출할 때 호출되는 인터페이스 메서드는 매개 변수를 전달할 필요가 없었지만, 비누 요청 메시지 본문 같은 것이 전달되지 않았습니다. 웹서비스이고 비누 기반이므로 여기에 데이터를 전달할 때 매개변수가 있든 없든 메시지 요청 본문을 작성해야 하므로 여기에 주의해야 합니다

예:


// 但是为了保险 希望大家在写请求消息体的时候用 接口测试工具去获取比如soapui 然后直接复制过来      String data = "<soapenv:Envelope xmlns:soapenv=" +
                        "\"http://schemas.xmlsoap.org/soap/envelope/\" " +
                        "xmlns:ser=\"http://server.hue.edu/\" " +
                        "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
                        "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"
                        +"<soapenv:Header />"
                        +"<soapenv:Body>"
                        +"<ser:say >"//比如这里要调用的方法没有参数 就直接不用写就好 但是这个消息体 应该还是要的    +"</ser:say>"
                        +"</soapenv:Body>"
                      +"</soapenv:Envelope>";


위 내용은 URLConnection 및 axis1.4를 사용한 웹 서비스 개발 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.