2015-07-07 2 views
0


В NetBeans я должен использовать следующий код:Получения ответного сообщения от WebService

public String launchRequest(String paramString) 
     { 
     URL localURL = new URL(paramString); 
     Object localObject1 = new Socket(localURL.getHost(), localURL.getPort()); 

     Object localObject2 = "GET " + paramString + " HTTP/1.0"; 
     localObject2 = (String)localObject2 + "\r\nAccept value: */*\r\n"; 
     localObject2 = (String)localObject2 + "Host value: " + localURL.getHost() + ":" + localURL.getPort() + "\r\n"; 
     Object localObject3 = new PrintWriter(((Socket)localObject1).getOutputStream(), true); 
     ((PrintWriter)localObject3).println((String)localObject2); 
     ((PrintWriter)localObject3).close(); 
     ((Socket)localObject1).close(); 

     return "OK";} 

Этот код предполагается вызвать WebService, созданный в C#, что делает операцию вставки в базе данных Oracle.
URL-адрес, который передается выглядит следующим образом:
http://192.168.88.29:443/RaduPestrea/Services/Ort.asmx/ORTRequest?callBackDisabled=true&siren=328812656&capId=1325369
Проблема заключается в том, что WebService не называется. GetOutputStream() перенастраивает OutputStream, который не имеет сообщения из WebService. Это составная часть webService:
namespace Services { /// /// Summary description for Service1. /// public class Ort : System.Web.Services.WebService { [WebMethod] public string ORTRequest(bool callBackDisabled, int siren, int capId) { Try{ ....... return "Success ReqId :" + reqNum; Catch(Exception ex) { return ex.ToString(); } } }
Проблема в том, что я не могу изменить этот код. Я надеюсь, что проблема связана с URL-адресом, который я отправил.
Любая помощь приветствуется. Спасибо.

Редактировать: Согласен, что это не самый красивый код. Задача состоит в том, что код Java должен вызывать WebService из этой ссылки URL. Эта ссылка должна вставить в базу данных. В базе данных нет новой записи. Я использую операторы return из WebService, чтобы убедиться, что он вызывается, но ничего не возвращается. Возможно, я ошибаюсь, так или иначе, чтобы проверить, что WebService был вызван успешно?

Если я использую следующий код, вызывается веб-служба и добавляется новая запись в базу данных.

<code> 
    localURL = new URL(paramString);   
    localObject1 = "";   
    localObject2 = localURL.openStream(); 
    localObject3 = new InputStreamReader((InputStream)localObject2); 
    BufferedReader localBufferedReader = new BufferedReader((Reader)localObject3); 
    String str1; 
    while ((str1 = localBufferedReader.readLine()) != null) 
    { 
     String str2 = ""; 
     localObject1 = (String)localObject1 + str2; 
    } 
    return (String)localObject1; 
</code> 
+0

Предложение: объявите локальные переменные правильно, вместо того, чтобы объявлять все как «Объект», а затем бросать его для каждого использования. – dsh

+0

Спасибо за совет. Это все еще не работает. Я знаю, что вы предложили лучшую практику, но это не мой код и технически мне не разрешено редактировать его. Я могу изменить только URL-адрес или WebService. Но, во-первых, я хочу понять, почему это не работает. Почему он даже не дает сообщение об ошибке. –

+0

'getOutputStream()' возвращает 'OutputStream'. Не «ничего». Почему вы объявляете 'localObject3' как« объект », а затем бросаете его, это тайна. Неясно, что вы спрашиваете. – EJP

ответ

0

Проблема в том, что webService не вызывается.

Вы не указали никаких доказательств на этот счет, и из кода, который вы опубликовали, невозможно сообщить.

GetOutputStream() перенастраивает OutputStream, который не имеет сообщения из WebService.

Это бессмысленно. OutputStreams не содержат сообщений от партнера. Они используются для отправки сообщений в сверстников. Это утверждение и ваш титул совершенно бессмысленны.

Есть ли способ проверить, что WebService был вызван успешно?

Да. Прочтите ответ, и верните it, вместо проводной связи "OK".

И вы только что опубликовали код, который делает именно это.

Согласен, что это не самый красивый код.

Это даже не правильный код. Заголовки HTTP недопустимы, и он не пытается прочитать ответ. Это просто некомпетентно. Используйте код HttpURLConnection, который вы опубликовали.

+0

Я не могу использовать его ... Я должен использовать один с сокетами. –

+0

Я говорю, что WebService не вызывается, потому что в базу данных не добавляется запись.Если я использую код HttpURLConnection, данные вставляются в базу данных. Таким образом, код из WebService верен. –

+0

* «Я не могу использовать его ... Я должен использовать тот, у кого есть сокеты». * - Почему? Это какая-то домашняя работа или что-то еще? Во всяком случае, если вам абсолютно необходимо использовать этот сломанный код, вам нужно ПРОЧИТАТЬ спецификацию HTTP 1.1, а затем исправить свой код, чтобы он соответствовал тому, что говорит спецификация. (Google «http specification» ... и начните читать.) –

0

Прежде всего, это плохая идея использовать Socket сделать HTTP-запросов. Лучше использовать существующий библиотечный класс/метод; например:

new URL("https://example.com/foo/bar?param=xxx").openConnection(); 

Это дает некоторый подкласс , которые можно использовать, чтобы сформировать запрос и получить ответ от сервера

Есть альтернативные библиотеки для создания HTTP/HTTPS запросов. Например, библиотеки Apache HttpComponents могут быть хорошим выбором, если ваши требования сложны.

Однако, я подозреваю, что истинная причина, по которой вы ничего не получаете от своего запроса, заключается в том, что вы пытаетесь разговаривать с сервером «https» (порт 443) без использования соединения SSL/TLS. Это не сработает. Возможно, сервер просто закроет сокет.

Хотя можно установить соединение SSL/TLS через равную Socket (теоретически) или использовать SSLSocket, проще использовать правильно сформированный URL-адрес «https: // ...» и (например,) URL.openConnection() как выше.

Проходя мимо этого, строки заголовка в предполагаемом запросе выглядят синтаксически недействительными. Оба

Accept value: ... 

и

Host value: .... 

неверны. Если вы действительно хотите реализовать обработку сообщений HTTP самостоятельно, вам нужно прочитать спецификацию HTTP 1.1 и реализовать ее в письме.

И, наконец, (как указывает @EJP) ваш код даже не читает ответ.Запись на OutputStream не собирается «возвращать» что-либо. Вам нужно прочитать ответ от InputStream ... даже если бы проверить, что запрос принят.

+0

Я пробовал использовать порт по умолчанию 80 без успеха. –

+0

Затем попробуйте использовать 'URL' и' URLConnection', как я предложил. –

+0

@ PestreaRadu-Constantin «Без успеха» не является описанием проблемы, и ничто другое вы не разместили здесь. Вы ничего не получите, если не читаете * ничего. Кажется, вы думаете, что это должно быть волшебным образом «в« OutputStream », которое не имеет смысла. Не похоже, что кто-то, кто связан с этой задачей, имеет наименьшую идею, как ее выполнить. Я могу только предложить вам прочитать, а затем обучить тех, кто написал исходный код. – EJP

Смежные вопросы