2012-08-22 4 views
6

Provo a connettermi a un webservice di Yahoo. Ho generato le classi per asse2. Il problema che sto affrontando adesso è che il webservice richiede una specifica coppia di valori chiave nell'intestazione e non sono assolutamente in grado di farlo. Ho cercato sul web e ho trovato diverse possibilità - nessuna ha funzionato per me. Il più promettente è stato il post quasi alla fine di this page, Claude Coulombe ha suggerito di cambiare il codice dello stub generato, ma anche questo è fallito. Qualcuno può mostrarmi un modo per risolvere questo problema?come aggiungere un'intestazione http a una soaprequest in java

Modifica

Il modo suggerito di utilizzare opzioni prodotto il seguente eccezione:

Exception in thread "main" org.apache.axis2.AxisFault: Address information does not exist in the Endpoint Reference (EPR).The system cannot infer the transport mechanism. 

Ecco il mio codice:

val stub = new IndexToolsApiServiceStub("https://api.web.analytics.yahoo.com/IndexTools/services/IndexToolsApiV3") 

val client = stub._getServiceClient 
val options = new Options 
val list = new ArrayList[Header]() 
val header = new Header 
header.setName("YWA_API_TOKEN") 
header.setValue("NOTtheREALvalue") 
list.add(header) 
options.setProperty(HTTPConstants.HTTP_HEADERS, list) 
client.setOptions(options) 
stub._setServiceClient(client) 
+0

Presumo che la tua domanda riguardi le intestazioni HTTP (non HTML). Potresti voler correggere l'errore ... –

+0

Scusami, hai ragione. –

risposta

0

Ho trovato una soluzione per il problema due mesi fa. Non è possibile impostare un'intestazione personalizzata con Axis2. Così sono tornato alla vecchia Axisversion, dove puoi farlo. Impostare da solo l'intestazione Http non è una buona pratica e per lo più inutile. Inoltre, non fa parte delle specifiche SOAP. Questo è il motivo per cui non puoi farlo con Axis2.

4

Probabilmente si desidera utilizzare Axis2 s' Options:

// Create an instance of org.apache.axis2.client.ServiceClient 
ServiceClient client = ... 

// Create an instance of org.apache.axis2.client.Options 
Options options = new Options(); 

List list = new ArrayList(); 

// Create an instance of org.apache.commons.httpclient.Header 
Header header = new Header(); 

// Http header. Name : user, Value : admin 
header.setName("user"); 
header.setValue("admin"); 

list.add(header); 
options.setProperty(org.apache.axis2.transport.http.HTTPConstants.HTTP_HEADERS, list); 

client.setOptions(options); 

Ecco lo reference per quel codice.

0

In realtà, è sufficiente recuperare il riferimento alle opzioni da ServiceClient anziché sostituire l'oggetto opzioni. Quindi aggiungere le proprietà desiderate:

ServiceClient sc = awst._getServiceClient(); 
Options ops = sc.getOptions(); 
0

Anch'io ho avuto lo stesso problema la soluzione è quella di Barbiturica: aggiungere l'opzione di intestazione senza

// Create an instance of org.apache.axis2.client.Options 
Options options = new Options(); 

questa pagina è missleading: reference

1

E ' non importa se vuoi aggiungere intestazioni HTTP alla tua richiesta o risposta SOAP. in entrambi i modi si dovrebbe lavorare con MessageContext. Supposto che msgContext sia l'oggetto Contesto Messaggio richiesta/risposta Axis2 (org.apache.axis2.context.MessageContext), di seguito il codice farà il trucco e usandolo, è possibile aggiungere intestazioni HTTP.

`//Instantiate an Options object from org.apache.axis2.client.Options 
Options options = new Options(); 
//Instantiate an ArrayList of type NamedValue from org.apache.axis2.context.NamedValue 
List<NamedValue> namedValuePairs = new ArrayList<NamedValue>(); 
//Add as much as headers you want using below code 
namedValuePairs.add(new NamedValue("sample", "value")); 
//Finally add namedValuePairs to options, and add options to msgContext 
options.setProperty(org.apache.axis2.transport.http.HTTPConstants.HTTP_HEADERS, namedValuePairs); 
msgContext.setOptions(options);` 
Problemi correlati