How to post messages to yammer private network - windows-phone-8

I want to post messages to yammer in different network. For this I have wrote the below code ,
it's giving the server not found exception.
rawtoken = Security.GetRawToken();
//TODO
//get list of Yammer tokens for this user
WebClient wc = new System.Net.WebClient();
wc.DownloadStringCompleted += wc_DownloadStringCompleted;
wc.DownloadStringAsync(new Uri("https://www.yammer.com/api/v1/oauth/tokens.json?access_token=" + rawtoken));
void wc_DownloadStringCompleted(object sender, System.Net.DownloadStringCompletedEventArgs e)
{
string tokens = e.Result;
MessageBox.Show(tokens);
List<Response> myDeserializedObjList = (List<Response>)Newtonsoft.Json.JsonConvert.DeserializeObject(tokens,typeof(List<Response>));
List<Response> response = myDeserializedObjList.Where(item => item.network_id == "992371").ToList();
accessToken = response[0].token;
WebClient wc = new System.Net.WebClient();
Uri uri = new Uri("https://www.yammer.com/api/v1/messages.json?access_token=" + accessToken);
student ns = new student();
// wc.Headers["Authorization"] = "Bearer " + accessToken; //use discoEN token here
String data = "group-id=" + ns.group_id + "&body=" + ns.body;
wc.UploadStringCompleted += new UploadStringCompletedEventHandler(wc_UploadStringCompleted);
wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";
wc.Encoding = Encoding.UTF8;
wc.UploadStringTaskAsync(uri, data);
}
private void wc_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
{
MessageBox.Show(e.Result);
}

You should use the SDK for Windows Mobile rather than rolling your own code. It is available from the Yammer Developer site. Your code also passes the token on a URL parameter. This is no longer supported and you need to pass it on the authentication header.
A ServerNotFoundException highlights a connectivity problem. Perhaps you are not connected to the network, cannot route connections, or cannot resolve www.yammer.com via DNS.

Related

Response code 400 is returned when specifying a specific scope on GoogleTV

Question
When I specify a specific scope, a response code of 400 is returned and I am unable to go to the authentication screen.
【400 error scope】
https://www.googleapis.com/auth/fitness.heart_rate.read
https://www.googleapis.com/auth/fitness.blood_pressure.read
https://www.googleapis.com/auth/fitness.body_temperature.read
【200 OK scope】
https://www.googleapis.com/auth/fitness.body.read
https://www.googleapis.com/auth/fitness.activity.read
If you know why the response code is different between 200 and 400 even though it is the same FitnessApi, please let me know.
Also, the scope for profile and email is returned at 200 normally.
Notes
Google Cloud Platform Settings
We have enabled the FitnessAPI.
For authentication information, client ID and client secret are generated using "Client ID for TVs and devices with limited input functions".
The Fitness scope described above is set in the OAuth consent screen settings of the Google Cloud Platform.
Relevant source
private static final String OAUTH_CODE_URL = "https://oauth2.googleapis.com/device/code";
private static final String OAUTH_TOKEN_URL = "https://oauth2.googleapis.com/token";
private static final String SCOPE_FITNESS_BODY = "https://www.googleapis.com/auth/fitness.body.read";
private static final String SCOPE_FITNESS_ACTIVITY = "https://www.googleapis.com/auth/fitness.activity.read";
private static final String SCOPE_FITNESS_HEART_RATE = "https://www.googleapis.com/auth/fitness.heart_rate.read";
private static final String SCOPE_FITNESS_BLOOD_PRESSURE = "https://www.googleapis.com/auth/fitness.blood_pressure.read";
private static final String SCOPE_FITNESS_BODY_TEMPERATURE = "https://www.googleapis.com/auth/fitness.body_temperature.read";
private static final String SCOPE_EMAIL = "email";
private static final String SCOPE_PROFILE = "profile";
:
public Object[] postAccessToken() {
String postBody = "client_id=" + OAUTH_CLIENT_ID +
"&scope=" + SCOPE_EMAIL +
"%20" + SCOPE_FITNESS_BODY_TEMPERATURE +
"%20" + SCOPE_FITNESS_ACTIVITY +
"%20" + SCOPE_FITNESS_BODY +
"%20" + SCOPE_FITNESS_HEART_RATE +
"%20" + SCOPE_FITNESS_BLOOD_PRESSURE +
"%20" + SCOPE_PROFILE;
return postAPI(OAUTH_CODE_URL, postBody);
}
:
public Object[] postAPI(String sendUrl, String sendPostData) {
HttpURLConnection urlConnection = null;
InputStream inputStream = null;
OutputStream outputStream = null;
String result = "";
String str = "";
int statusCode = 0;
try {
URL url = new URL(sendUrl);
urlConnection = (HttpURLConnection) url.openConnection();
String postData = sendPostData;
urlConnection.setConnectTimeout(5000);
urlConnection.setReadTimeout(5000);
urlConnection.addRequestProperty("User-Agent", "Android");
urlConnection.addRequestProperty("Accept-Language", Locale.getDefault().toString());
urlConnection.setRequestMethod("POST");
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.connect();
outputStream = urlConnection.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8"));
bufferedWriter.write(postData);
bufferedWriter.flush();
bufferedWriter.close();
// Get the response code
statusCode = urlConnection.getResponseCode();
OAuth 2.0 flow for TV and limited-input device applications have limited access scopes. However, these scopes are supported for other authentication flows, such as for mobile/desktop apps, and web apps.
The OAuth 2.0 flow for TV is supported only for the following scopes:
email
openid
profile

How to get gmail thread id using JavaMail API in android?

As per gimap documentation javamail new gimap doc, ImapMessage not casting to GmailMessage.
Doc code is:
GmailMessage gmsg = (GmailMessage)msg; System.out.println("Gmail message ID is " + gmsg.getMsgId()); String[] labels = gmsg.getLabels(); for (String s : labels) System.out.println("Gmail message label: " + s);
here msg is a object of ImapMessage.
Error is: java.lang.ClassCastException: com.sun.mail.imap.IMAPMessage cannot be cast to com.sun.mail.gimap.mailMessage
How to solve it?
My Imap connection code is:
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Folder;
String IMAP_PROTOCOL = "imap";
String IMAP_HOST = "imap.gmail.com";
String IMAP_PORT = "993";
private Store store;
private Folder folderInbox;
private Session session;
private Properties getServerProperties(String protocol, String host,
String port) {
Properties properties = new Properties();
// server setting
properties.put(String.format("mail.%s.host", protocol), host);
properties.put(String.format("mail.%s.port", protocol), port);
// SSL setting
properties.setProperty(
String.format("mail.%s.socketFactory.class", protocol),
"javax.net.ssl.SSLSocketFactory");
properties.setProperty(
String.format("mail.%s.socketFactory.fallback", protocol),
"false");
properties.setProperty(
String.format("mail.%s.socketFactory.port", protocol),
String.valueOf(port));
return properties;
}
//Now connect gmail with imap
Properties properties = getServerProperties(protocol, host, port);
session = Session.getDefaultInstance(properties);
store = session.getStore(protocol);
store.connect(userName, password);
// opens the inbox folder
folderInbox = store.getFolder(folderName);
folderInbox.open(Folder.READ_ONLY);
// fetches new messages from server
Message[] messages = folderInbox.getMessages();
for (Message msg: messages
) {
GmailMessage gmsg = (GmailMessage)msg;
System.out.println("Gmail message ID is " + gmsg.getMsgId());
String[] labels = gmsg.getLabels();
for (String s : labels)
System.out.println("Gmail message label: " + s);
}

web service call in windows phone 8

I have a webservice written in java. I called from iPhone application but do not know how to call form windows phone. Web service have three parameter username, password and application id. I want to call through HttpWebRequest and receive response. How I can I do this ?
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
>
-<SOAP-ENV:Body>
-<doLogin xmlns="http://login.mss.uks.com">
-<loginid xsi:type="xsd:string">abc</loginid>
-<password xsi:type="xsd:string">pqrs</password>
-<app_id xsi:type="xsd:int">2</app_id>
</doLogin>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Thanks in advance.
If you have a proper web service sitting somewhere, you can use Visual Studio to generate wrapper code to access the web service. Check out this link to find how.
I've been struggling with this topic these days too. Here is my situation and how I solved this problem:
Problem
I've created a Web service using PHP with NuSOAP, and now I have to create a Windows Phone 8 App that consumes the Web service to do some stuff.
Solution
I going explain my solution using en example.
Here is the Web service:
<?php
require_once 'lib/nusoap.php';
function test()
{
return "Hello World!";
}
$server = new soap_server();
$server->configureWSDL("MyService", "urn:MyService");
// IMPORTANT: Avoid some ProtocolException
$server->soap_defencoding = 'utf-8';
$server->register('test',
array(),
array('greeting' => 'xsd:string'),
'Service',
false,
'rpc',
'literal', // IMPORTANT: 'encoded' isn't compatible with Silverlight
'A simple hello world'
);
if (isset($HTTP_RAW_POST_DATA)) {
$server->service($HTTP_RAW_POST_DATA);
} else {
$server->service("php://input");
}
?>
Now the client App in Windows Phone:
Create a new project.
Create a TextBox with name 'testText' and a Button with name 'testButton'.
Add a service reference
Solution Explorer -> MyProjectName -> Add Service Reference.
NOTE: If the Web service is mounted in your local computer, don't use 'localhost' as the name of the server, use your IP. In WP 8, 'localhost' refers to the device itself, not your computer. More info.
With this, Visual Studio will create automatically all the needed classes to use the Web service.
Add some action to the button:
private void testButton_Click(object sender, RoutedEventArgs e)
{
var client = new ServiceReference.MyServicePortTypeClient();
client.testCompleted += client_testCompleted;
client.testAsync();
}
private void client_testCompleted(object sender, ServiceReference.testCompletedEventArgs e)
{
testText.Text = e.Result;
}
Here is the result:
I hope this be useful.
Hope this will help you.
private void Button_Click_1(object sender, RoutedEventArgs e)
{
// Create a new HttpWebRequest object.
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.xxx.com/webservicelogin/webservice.asmx/ReadTotalOutstandingInvoice");
request.ContentType = "application/x-www-form-urlencoded";
request.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; Touch)";
request.CookieContainer = cookie;
// Set the Method property to 'POST' to post data to the URI.
request.Method = "POST";
// start the asynchronous operation
request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);
}
private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
// End the operation
Stream postStream = request.EndGetRequestStream(asynchronousResult);
//postData value
string postData = "xxxxxxxxxx";
// Convert the string into a byte array.
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
// Write to the request stream.
postStream.Write(byteArray, 0, postData.Length);
postStream.Close();
// Start the asynchronous operation to get the response
request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
}
private void GetResponseCallback(IAsyncResult asynchronousResult)
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
// End the operation
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
Stream streamResponse = response.GetResponseStream();
StreamReader streamRead = new StreamReader(streamResponse);
string read = streamRead.ReadToEnd();
//respond from httpRequest
TextBox.Text = read;
// Close the stream object
streamResponse.Close();
streamRead.Close();
response.Close();
}
Finally I got my perfect answer. By using the below code I solve my problem using HttpWebRequest.
string url = "http://urlname";
HttpWebRequest request = WebRequest.CreateHttp(new Uri(url)) as HttpWebRequest;
request.AllowReadStreamBuffering = true;
string strsoaprequestbody = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<soap-env:envelope xmlns:soap-env=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:soap-enc=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:xsi=\"http://www.w3.org/2001/xmlschema-instance\" xmlns:xsd=\"http://www.w3.org/2001/xmlschema\" soap-env:encodingstyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\n" +
"<soap-env:body>\n" +
"<dologin xmlns=\"http://login.mss.uks.com\">\n" +
"<username xsi:type=\"xsd:string\">userID</username>\n" +
"<password xsi:type=\"xsd:string\">password</password>\n" +
"<app_id xsi:type=\"xsd:int\">2</app_id>\n" +
"</dologin>" +
"</soap-env:body>\n" +
"</soap-env:envelope>\n";
request.ContentType = "application/x-www-form-urlencoded";
request.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; Touch)";
request.Headers["SOAPAction"] = "http://schemas.xmlsoap.org/soap/encoding/";
// Set the Method property to 'POST' to post data to the URI.
request.Method = "POST";
request.ContentLength = strsoaprequestbody.Length;
// start the asynchronous operation
request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);
}
private static void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
Debug.WriteLine("GetRequestStreamCallback method called....");
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
// End the operation
Stream postStream = request.EndGetRequestStream(asynchronousResult);
string postData = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\n" +
"<SOAP-ENV:Body>\n" +
"<doLogin xmlns=\"http://login.mss.uks.com\">\n" +
"<username xsi:type=\"xsd:string\">userID</username>\n" +
"<password xsi:type=\"xsd:string\">password</password>\n" +
"<app_id xsi:type=\"xsd:int\">2</app_id>\n" +
"</doLogin>" +
"</SOAP-ENV:Body>\n" +
"</SOAP-ENV:Envelope>\n";
// Convert the string into a byte array.
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
// Write to the request stream.
postStream.Write(byteArray, 0, postData.Length);
postStream.Close();
// Start the asynchronous operation to get the response
request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
}
private static void GetResponseCallback(IAsyncResult asynchronousResult)
{
Debug.WriteLine("GetResponseCallback method called....");
try
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
// End the operation
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
Stream streamResponse = response.GetResponseStream();
StreamReader streamRead = new StreamReader(streamResponse);
string responseString = streamRead.ReadToEnd();
//display the web response
Debug.WriteLine("Response String : " + responseString);
// Close the stream object
streamResponse.Close();
streamRead.Close();
// Release the HttpWebResponse
response.Close();
}
catch (WebException ex)
{
using (StreamReader reader = new StreamReader(ex.Response.GetResponseStream()))
{
Debug.WriteLine("Exception output : " + ex);
}
}
}

Windows Phone 8 -Post Json 'in request body' give an exception

Windows Phone 8 -Post Json 'in request body' give an exception but, it is working on 'windows Console app'. Why could it be?
Exception:
AsyncWaitHandle '((System.Net.Browser.OHWRAsyncResult)asynchronousResult).AsyncWaitHandle' threw an
exception of type 'System.NotSupportedException' System.Threading.WaitHandle {System.NotSupportedException}
My Code is hear.
private void Button_Click_1(object sender, RoutedEventArgs e)
{
byte[] encodedPassword = System.Text.Encoding.UTF8.GetBytes("Key" + ":" + "Value");
string encodedAuto = System.Convert.ToBase64String(encodedPassword);
// Create a new HttpWebRequest object.
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://uri");
// Set the Method property to 'POST' to post data to the URI.
request.Method = "POST";
request.ContentType = "application/json; charset=utf-8";
request.Accept = "application/json";
request.Headers["Authorization"] = "Basic " + encodedAuto;
request.AllowAutoRedirect = true;
request.AllowWriteStreamBuffering = true;
// start the asynchronous operation
request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);
}
private static void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
User user = new User();
user.password = password;
user.username = username;
// End the operation
Stream postStream = request.EndGetRequestStream(asynchronousResult)
/* String input = "{" +
"\"username\" : " + "\"" + username + "\"" + "," +
" \"password\" : " + "\"" + password + "\"" +
"}"; */
var input = JsonConvert.SerializeObject(user);
// Convert the string into a byte array.
byte[] byteArray = Encoding.UTF8.GetBytes(input);
// Write to the request stream.
postStream.Write(byteArray, 0, byteArray.Length);
postStream.Flush();
postStream.Close();
// Start the asynchronous operation to get the response
request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
}
private static void GetResponseCallback(IAsyncResult asynchronousResult)
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
// End the operation
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
Stream streamResponse = response.GetResponseStream();
StreamReader streamRead = new StreamReader(streamResponse);
string responseString = streamRead.ReadToEnd();
// Close the stream object
streamResponse.Close();
streamRead.Close();
// Release the HttpWebResponse
response.Close();
allDone.Set();
}
Thanks!
I figured out the problem with a real device. The problem is the 'https' connections. Windows Phone Emulator gives exception with 'https' links for all request methods.
NotSupportedException means the Windows Phone SDK does not implement that functionality. The exception message will give you more information about what specifically isn't implemented.
My recommendation in any case would be to use System.Net.Http library which reduces this code to about three lines.
http://blogs.msdn.com/b/bclteam/archive/2013/02/18/portable-httpclient-for-net-framework-and-windows-phone.aspx

Connecting SSIS WebService task to Spring WevService

I have a SSIS package in which i use a WebService task to call a Spring WS.
The authentication is done by client certificate and username & password.
I have tried to do it like this a simple HttpConnection and a WebService task - Error 504 Gateway Timeout. When i edit the HttpConnection and click on Test Connection i get an error that states:
"The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel."
I have tried doing it with a script task and the same error.
I have even tried with a dummy console application and the same result.
I also have a java written app that actually does the job but i do not have access to it's code-behind. This basically proves that the problem is not from the server itself.
The java application has it's own keystore and the same certificates that i have installed on the server.
I opened a wireshark capture and i saw that when i used either of my apps the host made a DNS request for an address that i did not configure anywhere(it seems like a proxy address from the intranet), while the java app made a DNS request with the correct address.
I am stuck here, and i have no idea what the problem might be or what else i can do so that i would get a proper error.
Please advise!
Edit:
This is the code that calls the WS:
public static void CallWebService()
{
var _url = "https://<IP>/App/soap/DataService";
string action = "getData";
Dictionary<string, string> parameters = new Dictionary<string, string>();
parameters.Add("param1", "0");
parameters.Add("param2", "0");
parameters.Add("param3", "value");
XmlDocument soapEnvelopeXml = CreateSoapEnvelope(action, parameters);
HttpWebRequest webRequest = CreateWebRequest(_url);
InsertSoapEnvelopeIntoWebRequest(soapEnvelopeXml, webRequest);
// begin async call to web request.
IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);
// suspend this thread until call is complete. You might want to
// do something usefull here like update your UI.
asyncResult.AsyncWaitHandle.WaitOne();
// get the response from the completed web request.
string soapResult;
using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult))
{
using (StreamReader rd = new StreamReader(webResponse.GetResponseStream()))
{
soapResult = rd.ReadToEnd();
}
}
Console.WriteLine(soapResult);
}
private static HttpWebRequest CreateWebRequest(string url)
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.ContentType = "text/xml;charset=\"utf-8\"";
webRequest.Accept = "text/xml";
webRequest.Method = "POST";
string thumbprint = "CERTIFICATE THUMBPRINT";
byte[] thumbprintArray = new byte[thumbprint.Split(new char[]{ ' ' }).Length];
string[] stringArray = thumbprint.Split(new char[] { ' ' });
for (int i = 0; i < thumbprintArray.Length; i++)
{
thumbprintArray[i] = Convert.ToByte(stringArray[i], 16);
}
X509Store localStore = new X509Store("My");
localStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certCol = localStore.Certificates.Find(X509FindType.FindByTimeValid, DateTime.Now, true);
foreach (X509Certificate cert in certCol)
{
if (cert.GetCertHashString() == thumbprint)
{
webRequest.ClientCertificates.Add(cert);
break;
}
}
webRequest.UseDefaultCredentials = false;
webRequest.Credentials = new NetworkCredential("USER", "PASSWORD");
return webRequest;
}
private static XmlDocument CreateSoapEnvelope(string action, Dictionary<string, string> parameters)
{
string formatedParameters = string.Empty;
string paramFormat = "<{0}>{1}</{0}>";
foreach (string key in parameters.Keys)
{
formatedParameters += string.Format(paramFormat, key, parameters[key]);
}
XmlDocument soapEnvelop = new XmlDocument();
soapEnvelop.LoadXml(string.Format(#"
<soapenv:Envelope xmlns:soap=""http://custom/soap/"" xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"">
<soapenv:Header/>
<soapenv:Body>
<soap:{0}>
{1}
</soap:{0}>
</soapenv:Body>
</soapenv:Envelope>", action, formatedParameters));
return soapEnvelop;
}
private static void InsertSoapEnvelopeIntoWebRequest(XmlDocument soapEnvelopeXml, HttpWebRequest webRequest)
{
using (Stream stream = webRequest.GetRequestStream())
{
soapEnvelopeXml.Save(stream);
}
}