问题
I need to create an HTTP adapter for worklight but the url must be programmatically provided via a parameter.
1) I was able to pass the user/password but not the url. Is there a way to do that?
I also try to create my own java adapter to call the REST API, It works when I test the adapter but it seems my response is not in the expected format for worklight. I got this error:
2) BAD_PARAMETER_EXPECTED_DOCUMENT_OR_ARRAY_OF_DOCUMENT.
my Java adapter returns a JSONArtifact (JSONObject) but it seems that worklight want this to be embedded in another JSONObject such as { "array":{...}}. Is there a way to convert a JSONObject to the format expected by worklight.
import org.apache.wink.json4j.JSON; import org.apache.wink.json4j.JSONArtifact; import org.apache.wink.json4j.JSONException; private Header headerUserAgent = new Header("User-Agent", "Mozilla"); private Header headerAccept = new Header("Accept", "application/json"); private String hostName; private String baseURL; protected MyHttpClient(String userName, String userPassword, String hostName, String baseURL ) { super(); Credentials defaultcreds = new UsernamePasswordCredentials(userName, userPassword); this.getState().setCredentials(AuthScope.ANY, defaultcreds); this.hostName = hostName; this.baseURL = baseURL; } private GetMethod getGetMethod(String url) throws URIException { GetMethod httpMethod = new GetMethod(new HttpsURL("https://"+hostName+baseURL+url).getEscapedURI()); addCommonHeaders(httpMethod); return httpMethod; } private JSONArtifact getResponseAsJSONObject(InputStream inputStream) throws IOException { InputStreamReader reader = new InputStreamReader(inputStream); try { JSONArtifact json = JSON.parse(reader); return json; } catch (NullPointerException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }
Adapter:
function getResponse(user,password) { var client = new com.itdove.mypackage.MyHttpClient(user,password,"myurl","mybaseurl"); return { array : client.executeGet("mypath") }; }
it works with this but this solution doesn't provide the service url as parameter:
function getResponseAdapters(path, username, password) { var input = { method : 'get', returnedContentType : 'json', headers: { 'User-Agent':'Mozilla', 'Authorization': 'Basic '+Base64.encode(username+':'+password), } , path : '/resources/' + path }; return WL.Server.invokeHttp(input); } function getResponse(username, password) { return getMySCAWSAdapters(path, username, password); }
Collection
vAPPArrayAdapterOptions = { name: 'myResponseAdapter', replace: '', remove: '', add: '', load: { procedure: 'getResponse', params: ["user","password"], key: 'array' }, accept: function (data) { return (data.status === 200); } }, ... vAPPArray = wlJsonStore.initCollection( "vAPPArray", vAPPArraySearchFields, {adapter: vAPPArrayAdapterOptions, onSuccess: initCollectionSuccessCallback, onFailure: initCollectionFailureCallback, load:true});
Many Thanks Dominique
回答1:
Found the solution:
First, I was using apache wink JSONArtifact instead of the com.ibm.json.java.JSONArtifact!
Secondly I modified my collector implement method as follow to add the status (not sure if it is needed or not)
function getResponse(user,password,hostname) { var client = new com.itdove.mypackage.IWDHttpClient(user,password,hostname,"mypath"); return { array :client.executeGet("mymethod"), statusCode: client.getStatusCode(), statusReason: client.getStatusReason() }; }
in myCollector.js I set the user, password, hostname as follow before calling my initCollection.
params = [ settings.json.user, settings.json.password, settings.json.hostname ]; myAdapterOptions.load["params"] = params;
来源:https://stackoverflow.com/questions/15432608/change-http-url-in-worklight-adapter