Http Post with Blackberry 6.0 issue

蹲街弑〆低调 提交于 2020-01-16 05:01:05

问题


I am trying to post some data to our webservice(written in c#) and get the response. The response is in JSON format.

I am using the Blackberry Code Sample which is BlockingSenderDestination Sample. When I request a page it returns with no problem. But when I send my data to our webservice it does not return anything.

The code part that I added is :

ByteMessage myMsg = bsd.createByteMessage();
//myMsg.setStringPayload("I love my BlackBerry device!");
myMsg.setMessageProperty("querytpe","myspecialkey");//here is my post data
myMsg.setMessageProperty("uname","myusername");
myMsg.setMessageProperty("pass","password");
((HttpMessage) myMsg).setMethod(HttpMessage.POST);
// Send message and wait for response myMsg
response = bsd.sendReceive(myMsg);

What am i doing wrong? And what is the alternatives or more efficients way to do Post with Blackberry.

Regards.

Here is my whole code:

class BlockingSenderSample extends MainScreen implements FieldChangeListener {

ButtonField _btnBlock = new ButtonField(Field.FIELD_HCENTER);
private static UiApplication _app = UiApplication.getUiApplication();
private String _result;
public BlockingSenderSample()
{
    _btnBlock.setChangeListener(this);
    _btnBlock.setLabel("Fetch page");
    add(_btnBlock);
}

public void fieldChanged(Field button, int unused)
{

    if(button == _btnBlock)
    {

        Thread t = new Thread(new Runnable() 
        {
            public void run()
            {
                Message response = null;
                String uriStr = "http://192.168.1.250/mobileServiceOrjinal.aspx"; //our webservice address
                //String uriStr = "http://www.blackberry.com";

                BlockingSenderDestination bsd = null;
                try
                {
                    bsd = (BlockingSenderDestination)
                               DestinationFactory.getSenderDestination
                                   ("name", URI.create(uriStr));//name for context is name. is it true?
                    if(bsd == null)
                    {
                        bsd =
                          DestinationFactory.createBlockingSenderDestination
                              (new Context("ender"),
                               URI.create(uriStr)
                               );
                    }
                    //Dialog.inform( "1" );
                    ByteMessage myMsg = bsd.createByteMessage();
                    //myMsg.setStringPayload("I love my BlackBerry device!");
                    myMsg.setMessageProperty("querytpe","myspecialkey");//here is my post data
                    myMsg.setMessageProperty("uname","myusername");
                    myMsg.setMessageProperty("pass","password");
                    ((HttpMessage) myMsg).setMethod(HttpMessage.POST);

                    // Send message and wait for response myMsg
                    response = bsd.sendReceive(myMsg);

                    if(response != null)
                    {   
                        BSDResponse(response);
                    }
                }
                catch(Exception e)
                {
                    //Dialog.inform( "ex" );
                    // process the error
                }
                finally
                {
                    if(bsd != null)
                    {
                        bsd.release();
                    }
                }
            }

        });
        t.start();

    }
}

private void BSDResponse(Message msg)
{
    if (msg instanceof ByteMessage)
    {
        ByteMessage reply = (ByteMessage) msg;
        _result = (String) reply.getStringPayload();
    } else if(msg instanceof StreamMessage)
    {
        StreamMessage reply = (StreamMessage) msg;
        InputStream is = reply.getStreamPayload();
        byte[] data = null;
        try {
            data = net.rim.device.api.io.IOUtilities.streamToBytes(is);
        } catch (IOException e) {
            // process the error
        }
        if(data != null)
        {
            _result = new String(data);
        }
    }

    _app.invokeLater(new Runnable() {

        public void run() {
            _app.pushScreen(new HTTPOutputScreen(_result));
        }

    });

}

}

..

class HTTPOutputScreen extends MainScreen 
{

RichTextField _rtfOutput = new RichTextField();

public HTTPOutputScreen(String message)
{
    _rtfOutput.setText("Retrieving data. Please wait...");
    add(_rtfOutput);
    showContents(message);
}

// After the data has been retrieved, display it
public void showContents(final String result) 
{
    UiApplication.getUiApplication().invokeLater(new Runnable() 
    {

        public void run() 
        {
            _rtfOutput.setText(result);
        }
    });
}
}

回答1:


HttpMessage does not extend ByteMessage so when you do:

((HttpMessage) myMsg).setMethod(HttpMessage.POST);

it throws a ClassCastException. Here's a rough outline of what I would do instead. Note that this is just example code, I'm ignoring exceptions and such.

//Note: the URL will need to be appended with appropriate connection settings
HttpConnection httpConn = (HttpConnection) Connector.open(url);
httpConn.setRequestMethod(HttpConnection.POST);
OutputStream out = httpConn.openOutputStream();
out.write(<YOUR DATA HERE>);
out.flush();
out.close();

InputStream in = httpConn.openInputStream();
//Read in the input stream if you want to get the response from the server

if(httpConn.getResponseCode() != HttpConnection.OK)
{
    //Do error handling here.
}


来源:https://stackoverflow.com/questions/7531822/http-post-with-blackberry-6-0-issue

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!