SOAP with attachment, Android - http-post

How can I call SOAP WebService using HTTPPOST and adding ATTACHMENT?
For example in this message:
<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header />
<v:Body>
<CelsiusToFahrenheit xmlns="http://www.w3schools.com/webservices/" >
<Celsius i:type="d:string">55</Celsius>
</CelsiusToFahrenheit>
</v:Body>
</v:Envelope>

Related

Create cross domain cookies for single sign on

I want to implement single sign on from my website(assume it as a.com) to vendor website(assume it as b.com)
My vendor is providing a service which will take user Id as input and returns token and cookies in response header. I need to call this service and redirect to vendor url with session token through post request and set cookies(which are received from service response).
In my code after making service call i am returning url and token to a jsp and cookies in httpservletresponse . Javascript in this jsp will autosubmit the form on page load to make post call. But when it is redirected, browser is not setting the b.com cookies in the request header.
Controller code :
#RequestMapping(value = "/sso", method = RequestMethod.GET)
public String ssoToVendor(final Model model, final HttpServletResponse response) {
/**
*Service call happens here and returns tok
*/
model.addAttribute("url","https:\\b.com");
model.addAttribute("tok",tok);
for (String cookie : cookies) {
response.addHeader("Set-Cookie", cookie);
}
return "dummyjsp"
}
JSP sample code :
<body>
<form id="redirect" action="${url}" name="redirect" method="POST">
<input type="hidden" name="tok" id="tok" value="${tok}"/>
</form>
</body>
<script type="text/javascript">
var redirect = document.getElementById("redirect");
redirect.submit();
</script>
I know that it is not possible to set cross domain cookies but some how there is another application which is implemented in c# is able to set those cookies.
Is there a way we can set b.com cookies in response header and that is created by browser and sent to b.com when redirected from a.com in java.

How can I set CSRF in a form in Appcelerator?

I am creating an app that has a login. I want that login to match the username and password but I cannot make it happen because I cannot send the "_token" field, and I cant because I cannot generate the same token that the application will wait for.
This is my current form:
<View id="loginView" layout="vertical">
<TextField id="inputUsername" />
<TextField id="inputPassword" passwordMask="true" />
<Button id="buttonLogin" onClick="performLogin" />
<ActivityIndicator id="activityIndicator" />
</View>
This is my current login request on Appcelerator.
loginReq.open("POST","http://192.168.100.29/miapp/mobile/auth/login");
var params = {
username: $.inputUsername.value,
password: $.inputPassword.value
};
loginReq.send(params);
And it should be something like:
loginReq.open("POST","http://192.168.100.29/miapp/mobile/auth/login");
var params = {
username: $.inputUsername.value,
password: $.inputPassword.value,
_token: $.inputTokenOrSomething.value
};
loginReq.send(params);
Also I created a route in the routes.php file in Laravel, as follows:
Route::get("mobile/auth/login", function(){
echo ("Debug"); exit;
});
Does anyone has an idea? Thank you.
Normally you want to send a CSRF Token via a Request Header. This is how it's done with Appcelerator when sending a token to Drupal:
loginReq.open("POST","URL");
loginReq.setRequestHeader('X-CSRF-Token',TOKENHERE);
loginReq.send(params);
Note, your Request Header goes AFTER open, but BEFORE send.
Edit:
Forgot to add - Normally you send a log in without a token, then capture the token from the servers response after a successful log in (usually sent as XML, JSON, etc... depending on the set up). This token is stored and sent in the request headers anytime you need to authenticate yourself to perform an action (like posting, deleting content). Again, this all depends on the set up.

Getting responseText using g:formRemote with Grails

I am trying to access the responseText on a failure ajax call using formRemote
<g:remoteLink controller="answer" action="delete" id="${answer.id}" update="questions" onFailure="handleError(response)" onComplete="assingActionTestElems()"></g:remoteLink>
But response is not defined, getting this error in FireBug
ReferenceError: response is not defined
This is one of my multiple ajax handling error in the controller
render(status: 500, text: message(code: 'edition.answer.delete.pending'))
¿How can I access to the text message?
I found the solution. It´s easy but not documented. There are 3 fields implicited when a error is thrown, and this is the method to access to them:
onFailure="handleError(XMLHttpRequest,textStatus,errorThrown)"
var handleError = function(XMLHttpRequest,textStatus,errorThrown){
alert(XMLHttpRequest.responseText);
}
You can use just one or all, as needed!

Cross site call in ajax: responseXML undefined

I'm developing a script that performs a cross site call to a python webservice, which returns a xml.
This is the full code of the html page that executes the cross site call:
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
<script src="./jquery.xdomainajax.js"></script>
<script>
jQuery.ajax({
type: "GET",
url: "http://api.notmywebsite.net/search/parameters",
async: true,
beforeSend: function(xhr) {
xhr.withCredentials = true;
},
success: function(data) {
alert(data.responseXML);
},
error: function(err){
alert("error: " + err.status);
}
});
</script>
</head>
<body>
<div id="xmlOutput"></div>
</body>
</html>
The problem is, of course, the script isn't working:
- When I call the webservice through the browser, the xml is successfully displayed.
- I'm using WebScarab to check if the answer has any content, and it has. The HTTP response has the right headers and the expected XML response.
- I debugged the python webservice to check if a call made by my request would return the expected XML, and it did.
After some research I came across the same-origin policy, for which I started using (hope i'm using it right) the following proxy: https://github.com/padolsey/jQuery-Plugins/blob/master/cross-domain-ajax/jquery.xdomainajax.js
The webservice is also called using php, through a "simplexml_load_file($url);", which returns the expected XML response.
I tried executing this same call (but using responseText instead of responseXML) to google, and it was successful.
The xml has the following format:
<OAI-PMH xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/OAI-PMH http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
<record>
<header>
<identifier>oai:epimarketplace.net:empid:1066</identifier>
<datestamp>2012-06-25T14:54:01.058Z</datestamp>
<setSpec>resource</setSpec>
<downLink>http://api.epimarketplace.net/fetch/pid/empid:1066</downLink>
</header>
<metadata>
<em>
<metadataLink>http://api.epimarketplace.net/rawfetch/pid/empid:1066/datastream/EM</metadataLink>
<field name="PID">empid:1066</field>
<field name="em.dateSubmitted">2012-08-20T10:43:40Z</field>
<field name="em.generalDescription.subject">Behaviour</field>
<field name="em.generalDescription.type">Dataset harvested from social networks</field>
<field name="em.title">&#60&#115&#99&#114&#105&#112&#116&#62&#88&#83&#83&#60&#47&#115&#99&#114&#105&#112&#116&#62&#10</field>
<field name="em.uploader.name">Tiago André Posse</field>
<field name="isCollection_b">false</field>
<field name="nComments">0</field>
<field name="nLikes">0</field>
</em>
</metadata>
</record>
</OAI-PMH>
Hoping you can help me,
Thanks in advance.
In order for the browser to correctly return an XML object using responseXML, you must ensure the following:
1.Your XML document is well formed( responseXML will always return null if not)
2.In Firefox, call request.overrideMimeType('text/xml') at the start of your Ajax request (upon instantiation) to explicitly tell the browser that the returned data will have a content type of "text/xml".
3.IE doesn't support the client side overrideMimeType() method, so you must ensure that your server returns the proper "text/xml" content header type for the XML file that is being returned.
NOTE: If your XML file is named with an extension of ".xml", most servers by default send out the proper "text/xml" headers, though if it is not, you'll want to modify your server settings to do so. See "XML documents and the Content-type pitfall in IE" for more info.
If any one of the above conditions are not met, the data returned will be as plain text, not an XML object as expected.
EDIT: I looked into your JQuery Ajax call(again) and guess what?! The responseXML will always be undefined, as you are trying to access it even before the AJAX request has completed. My solution would be to call the function under complete attribute instead of success.

Google Documents List API - How to Publish a Document

I'm utterly lost as to how one can programmatically publish a Google Document (specifically a spreadsheet).
I've read the Google Documents List API Protocol Guide and have found this:
http://code.google.com/apis/documents/docs/3.0/developers_guide_protocol.html#GettingRevisions
The next section of the article begins with 'Publishing documents by publishing a single revision' and this is where I found this example:
PUT /feeds/default/private/full/resource_id/revisions/revision_number
GData-Version: 3.0
Authorization: <your authorization header here>
Content-Length: 722
Content-Type: application/atom+xml
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:gd='http://schemas.google.com/g/2005'
xmlns:docs="http://schemas.google.com/docs/2007" gd:etag="W/"DkIBR3st7ImA9WxNbF0o."">
<id>https://docs.google.com/feeds/id/resource_id/revisions/1</id>
<updated>2009-08-17T04:22:10.440Z</updated>
<app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-06T03:25:07.799Z</app:edited>
<title>Revision 1</title>
<content type="text/html" src="https://docs.google.com/feeds/download/documents/Export?docId=doc_id&revision=1"/>
<link rel="alternate" type="text/html"
href="https://docs.google.com/Doc?id=doc_id&revision=1"/>
<link rel="self" type="application/atom+xml"
href="https://docs.google.com/feeds/default/private/full/resource_id/revisions/1"/>
<author>
<name>user</name>
<email>user#gmail.com</email>
</author>
<docs:publish value="true"/>
<docs:publishAuto value="false"/>
</entry>
I have been retrieving document list feeds and CRUDing worksheets but I cannot get the publishing to work nor do I understand how it is supposed to work. My basic setup for establishing a connection to my feed and preparing the data to be PUT is as follows:
<?php
set_include_path($_SERVER['DOCUMENT_ROOT'].'/library/');
require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);
$theId = 'my-worksheet-id';
$user = "my-gmail-account-name";
$pass = "my-gmail-account-password";
$service = Zend_Gdata_Docs::AUTH_SERVICE_NAME;
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
$service = new Zend_Gdata($client);
$xml = "<entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005'
xmlns:docs='http://schemas.google.com/docs/2007' gd:etag='W/\"DkIBR3st7ImA9WxNbF0o.\"'>
<id>https://docs.google.com/feeds/id/spreadsheet:$theId/revisions/1</id>
<updated>2009-08-17T04:22:10.440Z</updated>
<app:edited xmlns:app='http://www.w3.org/2007/app'>2009-08-06T03:25:07.799Z</app:edited>
<title>Revision 1</title>
<content type='text/html' src='https://docs.google.com/feeds/download/documents/Export?docId=$theId&revision=1'/>
<link rel='alternate' type='text/html'
href='https://docs.google.com/Doc?id=$theId&revision=1'/>
<link rel='self' type='application/atom+xml'
href='https://docs.google.com/feeds/default/private/full/spreadsheet:$theId/revisions/1'/>
<author>
<name>$user</name>
<email>$user</email>
</author>
<docs:publish value='true'/>
<docs:publishAuto value='false'/>
</entry>";
$putURL = "http://docs.google.com/feeds/default/private/full/spreadsheet:".$theId."/revisions/0";
$data = $service->put($xml, $putURL);
?>
Which results in a
Fatal error: Uncaught exception 'Zend_Gdata_App_HttpException' with message 'Expected response code 200, got 400 Invalid request URI
Can someone help me out? Has anyone successfully published a Google Document programmatically?
Assuming the document has already been created and has a document id of XXXX
What you need to do is send a "PUT" request with specific headers, and XML (an entry describing your document) as the body, to a specific URL.
Since you are not changing any content of the doc (only the meta-data), your target URL will look like this...
https://docs.google.com/feeds/default/private/full/XXXX/revisions/0
The first thing you need to do is authenticate with the proper Google service.
$client = Zend_Gdata_ClientLogin::getHttpClient(GDOC_LOGIN, GDOC_PASS,'writely');
Use the returned object to grab your auth token.
$auth_token = $client->getClientLoginToken();
In Zend/Gdata/App.php is a helper function for executing the PUT request.
Prepare parameters for this method like so...
$method = "PUT";
$url ="https://docs.google.com/feeds/default/private/full/XXXX/revisions/0";
$headers['GData-Version'] = '3.0';
$headers['If-Match'] = '*';
$headers['Authorization'] = "GoogleLogin auth = $auth_token";
$headers['Content-Length'] = '380';
$headers['Content-Type'] = 'application/atom+xml';
$body = <<<XML
<?xml version='1.0' encoding='UTF-8'?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:docs="http://schemas.google.com/docs/2007"
xmlns:gd="http://schemas.google.com/g/2005">
<category scheme="http://schemas.google.com/g/2005#kind"
term="http://schemas.google.com/docs/2007#spreadsheet"/>
<docs:publish value="true"/>
<docs:publishAuto value="true"/>
</entry>
XML;
$contentType = "application/atom+xml";
$remainingRedirects = 99;
Then call the helper function...
$app = new Zend_Gdata_App();
$app->performHttpRequest($method, $url, $headers, $body, $contentType, $remainingRedirects);
Good luck!
Let me know if this helps!
Ok... where do I start?
First of all, your URL is incorrect. (the resource ID you're using is for JSON/XML not URL)
you have
$putURL = "http://docs.google.com/feeds/default/private/full/spreadsheet:".$theId."/revisions/0";
and you should have
$putURL = "http://docs.google.com/feeds/default/private/full/$theId/revisions/0";
(you can omit . for concatenation if you use " as delimiters)
now there are other problems since you're manually creating a xml entry.
Your authorization header is missing.
In your XML you're using revision 1 but in your URL you have revision/0
value is manually written and I'm pretty sure you are not trying to publish a 2 years old file. Same for and
MUST MATCH the retrieved etag or you won't be able to perform any PUT request.
Now you can change these values manually assigning variables but I think it's better to use Zend GData structured returned object.
In any case:
Retrieve from google the document you want to publish.
Find the correct entry (in this case the entry with the ID https://docs.google.com/feeds/id/spreadsheet:$theId/revisions/1)
change docs:publish value property to "true"
send a put request with the modified entry
that should work
I am new at Zend_Gdata myself but have sucessfully uploaded to Google Docs.
I don't know if this is what you are after but here is my code:
$client = Zend_Gdata_ClientLogin::getHttpClient(
'my#googleDocsEmail.address',
'MyPassword',
Zend_Gdata_Docs::AUTH_SERVICE_NAME
);
$gdClient = new Zend_Gdata_Docs($client);
$newDocumentEntry = $gdClient->uploadFile(
$file,
null,
null,
Zend_Gdata_Docs::DOCUMENTS_LIST_FEED_URI
);
I hope this helps,
Garry
Google says that putted data is wrong and response you with code 400.
try to place this code
<?xml version='1.0' encoding='UTF-8'?>
before
<entry xmlns='http://www.w3.org/2005/Atom'...

Resources