ホームページ  >  記事  >  Java  >  URLConnection と axis1.4 を使用した Web サービス開発のチュートリアル

URLConnection と axis1.4 を使用した Web サービス開発のチュートリアル

巴扎黑
巴扎黑オリジナル
2017-07-18 18:00:451691ブラウズ

前に書きます:

Web サービスを呼び出すには、さまざまな方法があります。 1. クライアント上で直接ツールを使用してクライアント コードを生成し、そのコードをプロジェクトにコピーして呼び出します。 2. 対応する Web サービス フレームワークを使用します。たとえば、サーバー側の開発に axis を使用する場合、対応する axis jar パッケージをクライアントにインポートし、その関連メソッドを使用して呼び出しを行うこともできます。 。個人的には、サーバーとクライアントの両方が Java 開発システムである場合、上記の最初の 2 つの方法がより適していると思います。これらが異なる言語で呼び出される場合は、何とも言えません。 3 番目と 4 番目のメソッドは実際には似ています。JSP ページでインターフェイスを呼び出す必要がある場合は、それを呼び出すプログラムをバックグラウンドで作成する必要がある場合は、URLConnection を使用することをお勧めします (方法はわかりました。実際、私はその原則のいくつかについてまだ非常に曖昧です。たとえば、このメソッドは http で呼び出す必要がありますか??、それはまだあまり明確ではありません)

最近のプロジェクトは Web サービスを開発する必要があります。インターフェイスですが、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 つだけあります。

問題の概要:

1. http 応答結果コード 500 というエラーを報告します:

java.io.IOException: サーバーが URL に対して HTTP 応答コード: 500 を返しました: http://10.203.138.82 : 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 fallSubcode: faultString: no SOAPAction header! falloutActor:aultNode:aultDetail : {} Stacktrace: No SOAPACTION Header!

No SOAPACTION Header この間違ったコード行を報告する場合は注意してください。 2つの解決策: 1: クライアントにsoapactionを追加します。その特定の内容は重要ではありません。空の文字列を書き込むことも可能です。 2: axisServletと同じようにサーブレットを書き込むようにサーバーを書き換え、内部のgetSoapAction()メソッドを書き換えます。 . 結局のところ、これはaxisのバグではありません)

それ以外の場合、このsoapactionヘッダーがなければエラーは報告されません
httpConn.setRequestProperty("SOAPAction", "") ; ここではエンコーディング utf-8 を使用するように注意してください。そうしないと、過去の

out.write(data.getBytes("UTF-8")) に中国語パラメータを渡すことができません。 ? ?ここで、以前に WCF によって開発された .net システムをプラットフォーム間で呼び出す場合、呼び出されるインターフェイス メソッドはパラメーターを渡す必要はありませんでしたが、そこには SOAP リクエスト メッセージ本文などは存在しませんでした。はWebサービスであり、SOAPに基づいているため、ここにデータを渡すときにパラメータの有無にかかわらず、メッセージリクエストの本文を記述する必要があるため、ここに注意する必要があります

例:


// 但是为了保险 希望大家在写请求消息体的时候用 接口测试工具去获取比如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 を使用した Web サービス開発のチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。