1

最近我开始研究在黑莓中使用 wcf rest webservices。

我使用了以下两个代码:

1. URLEncodedPostData postData = new URLEncodedPostData(URLEncodedPostData.DEFAULT_CHARSET, false); // 传递 q 的值和 ie 的值

postData.append("UserName", "hsharma@seasiaconsulting.com");
postData.append("Password", "mind@123");
HttpPosst hh=new HttpPosst();
add(new LabelField("1"));
String res=hh.GetResponse("http://dotnetstg.seasiaconsulting.com/profire/ProfireService.svc/UserRegistration",postData);
add(new LabelField("2"));
add(new LabelField(res));

公共字符串 GetResponse(字符串 url,URLEncodedPostData 数据){

    this._postData = data;
    this._url = url;

    ConnectionFactory conFactory = new ConnectionFactory();
    ConnectionDescriptor conDesc = null;

    try 
    {
        if (WLANInfo.getWLANState() == WLANInfo.WLAN_STATE_CONNECTED)
        {

            connectionString = ";interface=wifi";

        }

        // Is the carrier network the only way to connect?
        else if ((CoverageInfo.getCoverageStatus() & CoverageInfo.COVERAGE_DIRECT) == CoverageInfo.COVERAGE_DIRECT) {
            // logMessage("Carrier coverage.");

            // String carrierUid = getCarrierBIBSUid();

            // Has carrier coverage, but not BIBS. So use the carrier's TCP
            // network
            // logMessage("No Uid");
            connectionString = ";deviceside=true";

        }

        // Check for an MDS connection instead (BlackBerry Enterprise
        // Server)
        else if ((CoverageInfo.getCoverageStatus() & CoverageInfo.COVERAGE_MDS) == CoverageInfo.COVERAGE_MDS) {
            // logMessage("MDS coverage found");

            connectionString = ";deviceside=false";

        }

        // If there is no connection available abort to avoid bugging the
        // user
        // unnecssarily.
        else if (CoverageInfo.getCoverageStatus() == CoverageInfo.COVERAGE_NONE)
        {
            // logMessage("There is no available connection.");

        }

        // In theory, all bases are covered so this shouldn't be reachable.
        else {
            // logMessage("no other options found, assuming device.");
            // connectionString = ";deviceside=true";
        }
        conDesc = conFactory.getConnection(url + connectionString);
    } 
    catch (Exception e) 
    {
        System.out.println(e.toString() + ":" + e.getMessage());
    }

    String response = ""; // this variable used for the server response
    // if we can get the connection descriptor from ConnectionFactory
    if (null != conDesc) 
    {
        try 
        {

            HttpConnection connection = (HttpConnection) conDesc.getConnection();
            // set the header property
            connection.setRequestMethod(HttpConnection.POST);

            connection.setRequestProperty("Content-Length",Integer.toString(data.size()));
            // body content of
            // post data
            connection.setRequestProperty("Connection", "close");
            // close
            // the
            // connection
            // after
            // success
            // sending
            // request
            // and
            // receiving
            // response
            // from
            // the
            // server
            connection.setRequestProperty("Content-Type","application/json");
            // we set the
            // content of
            // this request
            // as
            // application/x-www-form-urlencoded,
            // because the
            // post data is
            // encoded as
            // form-urlencoded(if
            // you print the
            // post data
            // string, it
            // will be like
            // this ->
            // q=remoQte&ie=UTF-8).

            // now it is time to write the post data into OutputStream
            OutputStream out = connection.openOutputStream();
            out.write(data.getBytes());
            out.flush();
            out.close();

            int responseCode = connection.getResponseCode();
            // when this
            // code is
            // called,
            // the post
            // data
            // request
            // will be
            // send to
            // server,
            // and after
            // that we
            // can read
            // the
            // response
            // from the
            // server if
            // the
            // response
            // code is
            // 200 (HTTP
            // OK).
            if (responseCode == HttpConnection.HTTP_OK) 
            {
                // read the response from the server, if the response is
                // ascii character, you can use this following code,
                // otherwise, you must use array of byte instead of String
                InputStream in = connection.openInputStream();
                StringBuffer buf = new StringBuffer();
                int read = -1;
                while ((read = in.read()) != -1)
                buf.append((char) read);
                response = buf.toString();

            }

            // don’t forget to close the connection
            connection.close();

        }
        catch (Exception e) 
        {
            System.out.println(e.toString() + ":" + e.getMessage());
        }

    }
    return response;
}

public boolean checkResponse(String res)
{
     if(!res.equals(""))
     {


    if(res.charAt(0)=='{')
    {
        return true;
    }
    else
    {
        return false;

    }
     }
     else
     {
         return false;
     }

}

但是使用此代码,我无法获得上述 wcf Web 服务返回的响应,即 ({"UserRegistrationResult":[{"OutputCode":"2","OutputDescription":"UserName Already Exists."}]})

任何人都可以帮我解决它在黑莓客户端中的解析。

2.我使用的另一个代码是:

公共类 KSoapDemo 扩展 MainScreen {

private EditField userNametxt;
private PasswordEditField passwordTxt;
private ButtonField loginBtn;
String Username;
String Password;

public KSoapDemo() 
{

    userNametxt = new EditField("User Name : ", "hsharma@seasiaconsulting.com");
    passwordTxt = new PasswordEditField("Password : ", "mind@123");
    loginBtn = new ButtonField("Login");

    add(userNametxt);
    add(passwordTxt);
    add(loginBtn);

    loginBtn.setChangeListener(new FieldChangeListener() 
    {

        public void fieldChanged(Field field, int context)
        {
            //Dialog.alert("Hi Satyaseshu..!");
            login();
        }
    });
}

private void login() 
{
    if (userNametxt.getTextLength() == 0 || passwordTxt.getTextLength() == 0)
    {
        //Dialog.alert("You must enter a username and password", );
    } 
    else 
    {
        String username = userNametxt.getText();
        String password = passwordTxt.getText();
        System.out.println("UserName... " + username);
        System.out.println("Password... " + password);
        boolean value = loginPArse1(username, password);
        add(new LabelField("value... " + value));
    }
}

public boolean onClose()
{
    Dialog.alert("ADIOOO!!");
    System.exit(0);
    return true;
}



public boolean loginPArse1(String username, String password) 
{

    username=this.Username;
    password=this.Password;
    boolean ans = false;
    String result = null;
    SoapObject request = new SoapObject("http://dotnetstg.seasiaconsulting.com/","UserRegistration"); 
    //request.addProperty("PowerValue","1000"); 
    //request.addProperty("fromPowerUnit","kilowatts"); 
    //request.addProperty("toPowerUnit","megawatts"); 
    request.addProperty("userName",Username);
    request.addProperty("Password", Password);

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    envelope.bodyOut = request; 
    envelope.dotNet = true;
    add(new LabelField("value... " + "1"));
    HttpTransport ht = new HttpTransport("http://dotnetstg.seasiaconsulting.com/profire/ProfireService.svc/UserRegistration"+ConnectionInfo.getInstance().getConnectionParameters()); 
    ht.debug = true;
    add(new LabelField("value... " + "2"));
    //System.out.println("connectionType is: " + connectionType);
    try { 
    ht.call("http://dotnetstg.seasiaconsulting.com/profire/ProfireService.svc/UserRegistration", envelope); 
    SoapObject body = (SoapObject) envelope.bodyIn;
    add(new LabelField("soap....="+body.toString()));

     add(new LabelField("property count....="+body.getPropertyCount()));

    // add(new LabelField("Result....="+body.getProperty("HelloWorldResult")));
    //result = body.getProperty("Params").toString();
//  add(new LabelField("value... " + "4"));
     ans=true;
    } 
    catch (XmlPullParserException ex) { 
        add(new LabelField("ex1 "+ex.toString()) ); 
    ex.printStackTrace(); 
    } catch (IOException ex) { 
        add(new LabelField("ex1 "+ex.toString()) ); 
    ex.printStackTrace(); 
    } catch (Exception ex) { 
        add(new LabelField("ex1 "+ex.toString()) ); 
    ex.printStackTrace(); 
    }
    return ans; 
    }

作为回报,我得到响应为 net.rim.device.cldc.io.dns.DNS Exception:DNS Error

请在这方面帮助我

感谢和问候平克什·古普塔

4

1 回答 1

1
Please have the answer for my own question helps in parsing wcf rest services developed in .net and parsed at blackberry end.

This 2 classess definitely helps in achieving the above code parsing.


import java.io.IOException;
import java.io.OutputStream;
import java.io.InputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;

public class ConnectionThread extends Thread 
{

    private boolean start = false;
    private boolean stop = false;
    private String url;
    private String data;
    public boolean sendResult = false;
    public boolean sending = false;
    private String requestMode = HttpConnection.POST;
    public String responseContent;
    int ch;

    public void run()
    {
        while (true)
        {
            if (start == false && stop == false)
            {
                try 
                {
                    sleep(200);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
            else if (stop)
            {
                return;
            } 
            else if (start)
            {
                http();
            }
        }
    }

    private void getResponseContent( HttpConnection conn ) throws IOException 
    {
        InputStream is = null;
        is = conn.openInputStream();

            // Get the length and process the data
            int len = (int) conn.getLength();
            if ( len > 0 )
            {
                int actual = 0;
                int bytesread = 0;
                byte[] data = new byte[len];
                while ( ( bytesread != len ) && ( actual != -1 ) )
                {
                    actual = is.read( data, bytesread, len - bytesread );
                    bytesread += actual;
                }
                responseContent = new String (data);
            } 
            else 
            {
             //   int ch;
                while ( ( ch = is.read() ) != -1 ) 
                {

                }
            }



    }

    private void http()
    {
        System.out.println( url );
        HttpConnection conn = null;
        OutputStream out = null;

        int responseCode;

        try 
        {
            conn = (HttpConnection) Connector.open(url);
            conn.setRequestMethod(requestMode);
            conn.setRequestMethod(HttpConnection.POST);
            conn.setRequestProperty("Content-Length",Integer.toString(data.length()));
            conn.setRequestProperty("Connection", "close");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("SOAPAction","http://dotnetstg.seasiaconsulting.com/");
            out = conn.openOutputStream();

            out.write(data.getBytes());
            out.flush();
            responseCode = conn.getResponseCode();

            if (responseCode != HttpConnection.HTTP_OK)
            {
                sendResult = false;
                responseContent = null;
            } 
            else 
            {
                sendResult = true;
                getResponseContent( conn );
            }
            start = false;
            sending = false;

        }
        catch (IOException e) 
        {
            start = false;
            sendResult = false;
            sending = false;
        } 

    }

    public void get(String url) 
    {
        this.url = url;
        this.data = "";
        requestMode = HttpConnection.GET;
        sendResult = false;
        sending = true;
        start = true;
    }

    public void post(String url, String data) 
    {
        this.url = url;
        this.data = data;
        requestMode = HttpConnection.POST;
        sendResult = false;
        sending = true;
        start = true;
    }

    public void stop()
    {
        stop = true;
    }

}


import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.component.AutoTextEditField;
import net.rim.device.api.ui.component.BasicEditField;
import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.component.DateField;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.ObjectChoiceField;
import net.rim.device.api.ui.component.SeparatorField;
import net.rim.device.api.ui.component.Status;
import net.rim.device.api.ui.container.MainScreen;
import org.json.me.JSONArray;
import org.json.me.JSONException;
import org.json.me.JSONObject;
import org.xml.sax.SAXException;
import net.rim.device.api.xml.parsers.SAXParser;
import net.rim.device.api.xml.jaxp.SAXParserImpl;
import org.xml.sax.helpers.DefaultHandler;
import java.io.ByteArrayInputStream;
import com.sts.example.ConnectionThread;
import com.sts.example.ResponseHandler;

public class DemoScreen extends MainScreen 
{

    private ConnectionThread connThread;
    private BasicEditField response = new BasicEditField("Response:  ", "");
    private BasicEditField xmlResponse = new BasicEditField("xml:  ", "");
    private ButtonField sendButton = new ButtonField("Response");

    public DemoScreen(ConnectionThread connThread) 

    {

        this.connThread = connThread;

        FieldListener sendListener = new FieldListener();
        sendButton.setChangeListener(sendListener);
        response.setEditable( false );
        xmlResponse.setEditable( false );
        add(sendButton);
        add(response);
        add(new SeparatorField());
        add(xmlResponse);

    }

    public boolean onClose() 
    {
        connThread.stop();
        close();
        return true;
    }

    private String getFieldData()
    {
        //{"UserName":"hsharma@seasiaconsulting.com","Password":"mind@123"}
      StringBuffer sb = new StringBuffer();
       sb.append("{\"UserNamepinkesh.g@cisinlabs.com\",\"Password\":\"pinkesh1985\"}");
       return sb.toString();
    }



    class FieldListener implements FieldChangeListener
    {
        public void fieldChanged(Field field, int context)
        {

            StringBuffer sb = new StringBuffer("Sending...");
            connThread.post("http://dotnetstg.seasiaconsulting.com/profire/ProfireService.svc/UserRegistration"+ConnectionInfo.getInstance().getConnectionParameters(), getFieldData());

            while (connThread.sending) 
            {
                try 
                {
                    Status.show( sb.append(".").toString() );
                    Thread.sleep(100);
                } 
                catch (InterruptedException e) 
                {
                    e.printStackTrace();
                }
            }

            if (connThread.sendResult)
            {

                Status.show("Transmission Successfull");
                xmlResponse.setText( connThread.responseContent );
                try {

                    JSONObject jsonResponse = new JSONObject(connThread.responseContent);
                    JSONArray jsonArray = jsonResponse.getJSONArray("UserRegistrationResult");

                    for (int i = 0; i < jsonArray.length(); i++)
                    {

                        JSONObject result = (JSONObject)jsonArray.get(i);
                        add(new LabelField("OutputCode"+result.getString("OutputCode")));
                        add(new LabelField("OutputDescription"+result.getString("OutputDescription")));

                    }
                } 
                catch (JSONException e) 
                {
                    add(new LabelField(e.getMessage().toString()));
                    e.printStackTrace();
                }


            }
            else
            {
                Status.show("Transmission Failed");
            }

        }
    }
}
于 2012-12-05T11:53:35.593 回答